В bfs очередь используется, тогда как в стеке dfs используется для хранения вершин в соответствии с обходом графика. 2- в процессе bfs выполняется уровень до уровня (в соответствии с направленным или неориентированным графиком), тогда как в dfs процесс выполняется до глубины (процесс первого посещения корневого узла, а другой - далеко, а затем применяется обратное отслеживание от последнего узла до корневой узел).
посмотрите на /etc/php.ini
, там:
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.disable-functions
disable_functions =
убедитесь, что exec не указан в следующем виде:
disable_functions=exec
Если это так, удалите его и перезагрузите apache.
Для легкой отладки я обычно обычно запускаю файл php вручную (может запрашивать больше ошибок, не устанавливая его в основном ini). для этого добавьте заголовок:
#!/usr/bin/php
ini_set("display_errors", 1);
ini_set("track_errors", 1);
ini_set("html_errors", 1);
error_reporting(E_ALL);
в начало файла, дайте ему разрешения с помощью chmod +x myscript.php
и выполните его ./myscript.php
. Он очень внимателен, особенно на занятом сервере, который много пишет в файле журнала.
EDIT
Звучит как проблема с разрешениями. Создайте сценарий bash, который делает что-то простое как echo "helo world"
и попытается запустить его. Убедитесь, что у вас есть разрешения для файла и папки, содержащей файл. вы можете просто сделать chmod 755
только для тестирования.
Еще несколько заметок.
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 Поскольку вы выходите из контекста PHP в собственную оболочку, у вас будет много отладочных проблем.
Самый лучший и самый надежный, который я использовал в прошлом, - это запись вывода скрипта в файл журнала и его хвост во время выполнения PHP.
<?php
shell_exec("filename > ~/debug.log 2>&1");
Затем в отдельной оболочке:
tail -200f ~/debug.log
Когда вы выполняете свой PHP-скрипт, ваши ошибки и вывод из вашего вызова оболочки будет отображаться в вашем файле debug.log
.
Вы можете возвращать выходы и код возврата команд exec , токи могут содержать информацию, которая могла бы объяснить проблему ...
exec('my command', $output, $return);
Error Array ( )
– carcargi
30 August 2012 в 15:45
disable_functions
пуст в моемphp.ini
, я запускаю сценарий, как вы предлагали, и консоль ничего не показывает. – carcargi 30 August 2012 в 16:09whoami
?? – Ja͢ck 30 August 2012 в 16:32