Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Исполнение php-сценария


Рекомендуемые сообщения

Есть некоторый php-скрипт, который берет из БД код php-скрипта и должен его исполнить. Функция eval не подходит, т.к. есть вероятность повредить некоторые глобальные переменные. Я хочу исполнить код из БД так, что бы получить результат его работы (вывод) и при этом ни как не повредному скрипты.

Пусть $source_php содержит код, который нужно исполнить.

Так вот я решил запустить интерпретатор php и передать ему этот код, а затем получить результат.

Вот так:

$fl = fopen ($fname, "w");flock ($fl, LOCK_EX);fputs ($fl, $source_php);flock ($fl, LOCK_UN);fclose ($fl);$return_var = 0;$output = array();$php = ( isset ($_SERVER['ORIG_SCRIPT_FILENAME']) && ! empty ($_SERVER['ORIG_SCRIPT_FILENAME']) )? $_SERVER['ORIG_SCRIPT_FILENAME']: $_SERVER['ORIG_SCRIPT_NAME'];exec ("\"$php\" \"$fname\"", $output, $return_var);unlink ($fname);

Где $fname - имя временного файла.

После выполнения переменная $output пустая, а $return_var содержит код ошибки, равный 1.

Вопрос: что сделано не верно? При этом, если точно так же запустить интерпретатор php из консоли, то все работает правильно. А тут нет...

Если есть другое решение описанной задачи - будет только лучше (без создания временных файлов).

Заранее благодарен за помощь!

P.S. Переменная $php будет содержать правильный путь к интерпретатору, проблема не в получении его адреса.

Ссылка на комментарий
Поделиться на другие сайты

Встречался я однажды с проблемой, когда eval не подходит, но код должен был обрабатываться внутри моего скрипта, делал так (пусть в $code находится наш пхп код):

<?php$code = "<?php\r\n{$code}\r\n?>";$fhandle = @fopen("./code.tmp", "w");if (@fputs($fhandle, $code)) {close($fhandle);include_once "./code.tmp";} else {close($fhandle);die("Не удалось исполнить скрипт!");}?>
Ссылка на комментарий
Поделиться на другие сайты

Gray Angel: Этот вариант не подойдет, т.к. в нем может произойти изменение некоторых глобальных переменных (в коде $code) или описание функций с именами, которые уже есть в нашей программе.

Нужно, что бы скрипт исполнился не зависимо от текущего скрипта и ни чего не смог модифицировать...

Ссылка на комментарий
Поделиться на другие сайты

Хорошо тогда инклуд неподходит!

Есть еще один вариант, запустить обработчик пхп как программу передав в параметре путь к нашему скрипту.

Из пхп это можно сделать функцией execute_program

$code_file = "./tmp.php"; //Путь к файлу который надь исполнитьexecute_program("/usr/local/php/php", "-n {$code_file}");

Примерно так, правда я не пробывал запускать пхп скрипты, возможно параметр -n неверный....

Изменено пользователем Gray Angel
Ссылка на комментарий
Поделиться на другие сайты

Gray Angel: Я так именно и пытался (см. мое первое сообщение). Проблема с нахождением пути до php, ведь он может быть и не там.

А execute_program чем будет от exec отличаться и как тогда получить результат?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...