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 отличаться и как тогда получить результат? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти