Мне нужно вызвать исполняемый файл из наложенного контекста 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.
Любой намек оценивается.