Есть некоторый php-скрипт, который берет из БД код php-скрипта и должен его исполнить. Функция eval не подходит, т.к. есть вероятность повредить некоторые глобальные переменные. Я хочу исполнить код из БД так, что бы получить результат его работы (вывод) и при этом ни как не повредному скрипты.
Пусть $source_php содержит код, который нужно исполнить.
Так вот я решил запустить интерпретатор php и передать ему этот код, а затем получить результат.
Вот так:
CODE:$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 будет содержать правильный путь к интерпретатору, проблема не в получении его адреса. |