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

Исполнение 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 отличаться и как тогда получить результат?

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

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

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