Jump to content
СофтФорум - всё о компьютерах и не только

Исполнение php-сценария


Recommended Posts

Есть некоторый 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

Встречался я однажды с проблемой, когда 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

Gray Angel: Этот вариант не подойдет, т.к. в нем может произойти изменение некоторых глобальных переменных (в коде $code) или описание функций с именами, которые уже есть в нашей программе.

Нужно, что бы скрипт исполнился не зависимо от текущего скрипта и ни чего не смог модифицировать...

Link to comment
Share on other sites

Хорошо тогда инклуд неподходит!

Есть еще один вариант, запустить обработчик пхп как программу передав в параметре путь к нашему скрипту.

Из пхп это можно сделать функцией execute_program

$code_file = "./tmp.php"; //Путь к файлу который надь исполнитьexecute_program("/usr/local/php/php", "-n {$code_file}");

Примерно так, правда я не пробывал запускать пхп скрипты, возможно параметр -n неверный....

Edited by Gray Angel
Link to comment
Share on other sites

Gray Angel: Я так именно и пытался (см. мое первое сообщение). Проблема с нахождением пути до php, ведь он может быть и не там.

А execute_program чем будет от exec отличаться и как тогда получить результат?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...