Мне нужно вызвать исполняемый файл из наложенного контекста PHP script. Как производительность, так и безопасность позволяют лучше не вызывать оболочку между процессом веб-сервера и исполняемым файлом.
Конечно, я искал в Интернете без успеха (в таком контексте PHP). Многие другие языки позволяют это и четко документировать.
Увы, backticks, exec()
, shell_exec()
, passthru()
, system()
, proc_open()
, popen()
вызывают оболочку.
И pcntl_fork()
кажется недоступным.
Как проверить, вызвана ли функция оболочкой или нет.
Это было протестировано на Debian 6 64bit с PHP 5.3.3-7 + squeeze15. Тестовый код на http://pastebin.com/y4C7MeJz
Чтобы получить осмысленный тест, я использовал трюк, который должен попросить выполнить команду оболочки, также недоступную в качестве исполняемого файла. Хорошим примером является umask
. Любая функция, возвращающая что-то вроде 0022, определенно называется оболочкой. exec()
, shell_exec()
, passthru()
, system()
, proc_open()
все сделали.
См. Подробные результаты http://pastebin.com/RBcBz02F.
pcntl_fork сбой
Теперь вернемся к цели: как выполнить произвольную программу без запуска оболочки?
Php exec принимает как ожидалось массив строковых args вместо уникальной строки. Но pcntl_fork просто останавливает запросы без даже журнала.
Изменить: сбой pcntl_fork заключается в том, что сервер использует Apache mod_php, см. http://www.php.net/manual/en/function.pcntl-fork.php#49949.
Изменить: добавлено popen()
к тестам, после предложения @hakre.
Любой намек оценивается.