HACSoft Опубликовано 30 декабря, 2005 Жалоба Поделиться Опубликовано 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 будет содержать правильный путь к интерпретатору, проблема не в получении его адреса. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Gray Angel Опубликовано 31 декабря, 2005 Жалоба Поделиться Опубликовано 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("Не удалось исполнить скрипт!");}?> Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
HACSoft Опубликовано 31 декабря, 2005 Автор Жалоба Поделиться Опубликовано 31 декабря, 2005 Gray Angel: Этот вариант не подойдет, т.к. в нем может произойти изменение некоторых глобальных переменных (в коде $code) или описание функций с именами, которые уже есть в нашей программе. Нужно, что бы скрипт исполнился не зависимо от текущего скрипта и ни чего не смог модифицировать... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Gray Angel Опубликовано 1 января, 2006 Жалоба Поделиться Опубликовано 1 января, 2006 (изменено) Хорошо тогда инклуд неподходит! Есть еще один вариант, запустить обработчик пхп как программу передав в параметре путь к нашему скрипту. Из пхп это можно сделать функцией execute_program $code_file = "./tmp.php"; //Путь к файлу который надь исполнитьexecute_program("/usr/local/php/php", "-n {$code_file}"); Примерно так, правда я не пробывал запускать пхп скрипты, возможно параметр -n неверный.... Изменено 1 января, 2006 пользователем Gray Angel Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
HACSoft Опубликовано 1 января, 2006 Автор Жалоба Поделиться Опубликовано 1 января, 2006 Gray Angel: Я так именно и пытался (см. мое первое сообщение). Проблема с нахождением пути до php, ведь он может быть и не там. А execute_program чем будет от exec отличаться и как тогда получить результат? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.