Еще несколько заметок.
var_dump()
. error_reporting(-1);
следует как и display_errors
, в качестве последнего средства даже set_error_handler("var_dump");
- если только посмотреть, не вызывает ли PHP сам execvp
или еще. 2>&1
(объединить оболочки STDERR в поток STDOUT), чтобы понять, почему вызов не выполняется. В некоторых случаях вам может потребоваться обернуть вашу команду в вызове дополнительной оболочки: // capture STDERR stream via standard shell
shell_exec("/bin/sh -c 'ffmpeg -opts 2>&1' ");
Повторно перенаправить файл журнала, как рекомендовано @Mike, является наиболее рекомендуемым подходом. exec()
→ либо возвращает результат как результат функции, либо через необязательный параметр $output
. Также предоставляет параметр $return_var
, который содержит код errno / exit приложения запуска или оболочки. Вы можете получить: ENOENT
(2) - Нет такого файла EIO
(127) - Ошибка ввода-вывода: файл не найден shell_exec()
→ то, что вы хотите запускать в основном для выражений в стиле оболочки , Обязательно назначьте / напечатайте возвращаемое значение, например. var_dump(shell_exec("..."));
``
встроенные backticks → идентичны shell_exec
. system()
→ аналогичен exec
, но всегда возвращает результат как результат функции (распечатайте!). Дополнительно позволяет фиксировать код результата. passthru()
→ еще одна альтернатива exec
, но всегда отправляет любые результаты STDOUT в выходной буфер PHP. Какой из них делает его наиболее подходящей оболочкой exec. popen()
или лучше proc_open()
→ позволяют индивидуально фиксировать STDOUT и STDERR. error.log
, когда они не перенаправлены. Проверьте свой журнал syslog или Apache, если ничего не дает полезных сообщений об ошибках. Наиболее распространенными проблемами, возникающими у новичков PHP / LAMP, являются:
safe_mode
или disable_functions
. Ни одна из функций exec PHP не будет работать. (Лучше всего найти лучшего поставщика, иначе расследуйте «CGI», но не устанавливайте собственный интерпретатор PHP, пока не развернуты.) ffmpeg
. Вы не можете просто запускать произвольные команды оболочки без подготовки. Некоторые вещи необходимо установить! // Check if `ffmpeg` is actually there:
var_dump(shell_exec("which ffmpeg"));
PATH
выключен. Если вы установили специальные инструменты, вам необходимо убедиться, что они доступны. Использование var_dump(shell_exec("ffmpeg -opts"))
будет искать все распространенные пути - или как было сказано / ограничено Apache (часто просто /bin:/usr/bin
). Проверьте с помощью print_r($_SERVER);
, что содержит ваш PATH, и если это покрывает инструмент, который вы хотите запустить. Кроме того, вам может потребоваться адаптировать настройки сервера (/ etc / apache2 / envvars) или использовать полные пути: // run with absolute paths to binary
var_dump(shell_exec("/bin/sh -c '/usr/local/bin/ffmpeg -opts 2>&1'"));
Это несколько подрывает концепцию оболочки. Лично я не считаю это предпочтительным. Однако это имеет смысл для целей безопасности; кроме того, для использования пользовательской установки, конечно. chmod a+x ffmpeg
. Дальнейшее изменение пути к таким пользовательским двоичным файлам должно быть доступно для чтения пользователю Apache, с которым работают ваши скрипты PHP. Более современные настройки используют PHP, встроенные в режим FPM (suexec + FastCGI), где ваша учетная запись веб-хостинга равна тому, с чего работает PHP. ldd ffmpeg
, если существуют все зависимости lib, и если он работает иначе. escapeshellarg()
. $q = "escapeshellarg";
var_dump(shell_exec("echo {$q($_GET['text'])} | wc"));
В противном случае вы легко получите синтаксические ошибки оболочки; и, вероятно, использовать код, установленный позже ... *exec()
: $null = shell_exec(`wc file.txt`);
↑ ↑
Backticks запускает команду и оставляет shell_exec с выходом уже выполнил команду. Используйте обычные кавычки для обертывания параметра команды. В Windows:
"C:\Program Files\Whatevs\run.exe"
с дополнительными кавычками, если пути содержат пробелы). Слишком быстро работающие чернила также работают в Windows с тех пор, как они были введены в MS-DOS 2.0 Вы установили плагин Advanced Java Folding , который делает именно то, что вы видите, сбрасывает и аббревиатура некоторых языковых конструкций.
Либо удалить / отключить подключаемый модуль или настроить его варианты в соответствии с вашими личными предпочтениями: