HACSoft Posted December 30, 2005 Report Share Posted December 30, 2005 Есть некоторый 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 будет содержать правильный путь к интерпретатору, проблема не в получении его адреса. Link to comment Share on other sites More sharing options...
Gray Angel Posted December 31, 2005 Report Share Posted December 31, 2005 Встречался я однажды с проблемой, когда 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("Не удалось исполнить скрипт!");}?> Link to comment Share on other sites More sharing options...
HACSoft Posted December 31, 2005 Author Report Share Posted December 31, 2005 Gray Angel: Этот вариант не подойдет, т.к. в нем может произойти изменение некоторых глобальных переменных (в коде $code) или описание функций с именами, которые уже есть в нашей программе. Нужно, что бы скрипт исполнился не зависимо от текущего скрипта и ни чего не смог модифицировать... Link to comment Share on other sites More sharing options...
Gray Angel Posted January 1, 2006 Report Share Posted January 1, 2006 (edited) Хорошо тогда инклуд неподходит! Есть еще один вариант, запустить обработчик пхп как программу передав в параметре путь к нашему скрипту. Из пхп это можно сделать функцией execute_program $code_file = "./tmp.php"; //Путь к файлу который надь исполнитьexecute_program("/usr/local/php/php", "-n {$code_file}"); Примерно так, правда я не пробывал запускать пхп скрипты, возможно параметр -n неверный.... Edited January 1, 2006 by Gray Angel Link to comment Share on other sites More sharing options...
HACSoft Posted January 1, 2006 Author Report Share Posted January 1, 2006 Gray Angel: Я так именно и пытался (см. мое первое сообщение). Проблема с нахождением пути до php, ведь он может быть и не там. А execute_program чем будет от exec отличаться и как тогда получить результат? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now