php exec вывод ошибки
Вывод в реальном времени результатов выполнения shell_exec в PHP
Для чтения вывода процесса используется popen(). Она позволяет PHP скрипту работать параллельно с определённой программой и даёт возможность взаимодействовать с ней, читать и записывать во вывод/ввод программы будто бы в файл.
Допустим, мы хотим запустить в операционной системе, где установлен веб-сервер, такую команду:
Тогда в PHP скрипте мы присваиваем переменной значение, которое будет отправлено в ОС для выполнения в качестве команды:
Если мы хотим просто получить результат и вывод в реальном времени нас не интересует, тогда можно использовать passthru():
Но если вы хотите отображать вывод в реальном времени пока работает программа, то можно сделать так:
Этот код запустит команду и будет отправлять пользователь её вывод в реальном времени.
Подсказки использования shell_exec
Не всегда работает:
Похоже, в примере выше, разрыв строки вывода gunzip препятствует shell_exec напечатать что-либо ещё.
Быстрое напоминание тем, что пытается использовать shell_exec в UNIX-подобных платформах и не может заставить работать свой скрипт. В системе PHP делает запуск программ как веб-пользователь (обычно www, www-data или http для Apache), поэтому вам нужно убедиться, что веб-пользователь имеет достаточно прав для файлов, директорий или программ, которые вы пытаетесь использовать в команде shell_exec. В противном случае, будет казаться, что ничего не происходит.
Скорее всего неправильным (и точно опасным), но рабочим способом является добавление Apache прав запускать программы от имени суперпользователя без пароля.
Для Debian (и производных вроде Kali Linux, Linux Mint, Ubuntu) это делается так:
В файл /etc/sudoers
Для Arch Linux / BlackArch это делается так:
Добавить (раскомментировать) строчку:
Помните, что shell_exec() does не захватывает STDERR (стандартный вывод ошибок), поэтому используйте «2>&1» для его перенаправления в STDOUT (стандартный вывод) и захвата.
Простой способ захватить STDERR (стандартный вывод ошибок) и отбросить STDOUT (стандартный вывод) это добавить ‘2>&1 1> /dev/null‘ к концу вашей команды
Как shell_exec, так и обратная кавычка (`) возвращают NULL, если выполняемая команда не выводит что-либо.
Это позволяет нам делать примерно такие трюки:
Здесь мы просто выводим пустой пробел если команда завершилась успешно, что удовлетворяет это слегка странной проблеме. Отсюда вы можете использовать trim() для вывода команды.
Ошибка Subversion «svn: Can’t recode string» может быть вызвана неправильной (отсутствующей) локалью (locale). Попробуйте
(или любую другую локаль, какую вы предпочитаете) перед вызовом shell_exec()
Отладка проблем с функцией exec
Команда exec не работает на моем сервере, она ничего не делает, у меня отключен safe_mode, и я убедился, что все консольные команды работают, я пробовал использовать абсолютные пути. Я проверил разрешения для приложений, и все приложения, которые мне нужны, имеют разрешения на выполнение. Я не знаю, что еще делать, вот краткое изложение кодов, которые я пробовал :
Вот вывод последних двух кодов:
Я связался со службой сервера, и они не могут мне помочь, они не знают, почему команда exec не работает.
Ответ 1
П осмотрите файл /etc/php.ini :
; Эта директива позволяет отключить определенные функции в целях безопасности.
; Она получает список имен функций, разделенных запятыми. Эта директива
; *НЕ* зависит от того, включен или выключен безопасный режим.
У бедитесь, что exec не определен следующим образом:
Если это так, то просто удалите эту строку и перезапустите apache.
Для облегчения отладки я обычно запускаю файл php вручную (можно запросить вывод на большее число ошибок, не определяя их в основном ini). Для этого добавьте заголовок:
Ответ 2
Поскольку вы выходите из контекста PHP в собственную оболочку, у вас будет много проблем с отладкой.
Лучшее и самое надежное, что я использовал, — это запись вывода скрипта в файл журнала и его отслеживание во время выполнения PHP.
Затем в отдельной оболочке:
Ответ 3
Вот несколько вариантов решения вашей проблемы:
Используйте 2>&1 (объедините оболочки STDERR с потоком STDOUT), чтобы узнать, почему вызов не удался.
В некоторых случаях вам может потребоваться заключить вашу команду в дополнительный вызов оболочки:
// захват потока STDERR через стандартную оболочку
Чередуйте различные функции exec для выявления сообщений об ошибках. Хотя в основном они делают одно и то же, пути возврата выходных данных различаются:
// выполнение команды, сопряженный с stderr, output + код ошибки
popen() или лучше proc_open() — разрешает отдельно захватывать STDOUT и STDERR.
Большинство ошибок оболочки попадают в журнал ошибок PHP или Apache, если их не перенаправить. Проверьте свой системный журнал или журнал Apache, если ничего не дает полезных сообщений об ошибках.
Наиболее распространенные проблемы:
Для устаревших тарифных планов веб-хостинга все еще может быть включен safe_mode или disable_functions. Ни одна из функций PHP exec не будет работать ( л учше всего найти лучшего провайдера, иначе изучите «CGI» — но не устанавливайте свой собственный интерпретатор PHP, пока не разб е ретесь).
Точно так же иногда могут быть установлены AppArmor/SELinux/Firejail. Они ограничивают способность каждого приложения порождать новые процессы.
Предполагаемый двоичный файл не существует. Практически ни у одного веб-хоста нет предустановленных инструментов вроде ffmpeg. Вы не можете просто запускать произвольные команды shell без подготовки. Некоторые вещи должны быть установлены!
Проверьте с помощью print_r($_SERVER);, что содержит ваш PATH и покрывает ли он инструмент, который вы хотели запустить. В противном случае вам может понадобиться изменить настройки сервера (/etc/apache2/envvars) или использовать полные пути:
// запуск с абсолютными путями к двоичным файлам
Это в некоторой степени подрывает концепцию shell. Лично я не считаю это предпочтительным. Однако это имеет смысл в целях безопасности; более того, конечно, при использовании пользовательских установок.
Дополнительно:
Для того чтобы запустить двоичный файл в системе BSD/Linux, его необходимо сделать «исполняемым». Именно это делает chmod a+x ffmpeg.
Кроме того, путь к таким пользовательским двоичным файлам должен быть доступен для чтения пользователю Apache, под которым работают ваши PHP-скрипты.
Более современные установки используют встроенный в PHP режим FPM (suexec+FastCGI), где учетная запись вашего хостинга равна той, под которой работает PHP.
Протестируйте с помощью SSH. Это само собой разумеется, но прежде чем выполнять команды через PHP, было бы разумно протестировать его в реальной оболочке. Проверьте, например, ldd ffmpeg, есть ли все lib-зависимости и работает ли он в противном случае.
Входные значения (GET, POST, имена ФАЙЛОВ, данные пользователя), передаваемые в качестве аргументов команд в строках exec, должны быть экранированы с помощью escapeshellarg().
Следите за тем, чтобы не комбинировать обратные символы с любой из функций *exec():
$null = shell_exec(`wc file.txt`);
Обратные символы выполнят команду и оставят shell_exec с выводом уже выполненной команды. Используйте обычные кавычки для обертывания параметра команды.
Также проверьте в сеансе shell, как предполагаемая программа работает с другой учетной записью:
В частности для PHP-FPM проверяйте с соответствующим идентификатором пользователя. www-data/apache в основном используются только в старых настройках mod_php.
Многие инструменты cmdline зависят от некоторой конфигурации для каждого пользователя. Этот тест часто показывает, чего не хватает.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
PHP вывод ошибок
Дата 08.07.2017 Автор Alex Рубрика Веб сайты
Есть несколько уровней для включения вывода ошибок в PHP: php.ini, htaccess или файл php. Разные уровни дают разные преимущества и проблемы.
Чтобы php начал выводить ошибки, ему необходимо установить значение display_errors = On и задать уровень серьёзности выводимых ошибок через error_reporting. Директива error_reporting может принимать значения (E_ALL, E_ERROR, E_WARNING, E_PARSE и т.п.). Но лучше всего error_reporting задавать как E_ALL, чтобы видеть все недочёты своего кода.
Вывод ошибок через PHP файл
ini_set(‘error_reporting’, E_ALL);
ini_set(‘display_errors’, 1);
Добавьте эти строки до кода, который необходимо отладить. Иначе ошибки не выведутся.
Этот способ вывода самый приемлемый, потому что на него можно поставить права доступа. К примеру, ставим эти две строчки внутри проверки административных прав:
ini_set(‘error_reporting’, E_ALL);
ini_set(‘display_errors’, 1);
Тогда вывод ошибок будет виден только администратору. Это полезно на рабочем проекте, ведь посетителям сайта не нужно видеть отладочную информацию.
php_value display_errors 1
php_value error_reporting E_ALL
Вывод ошибок в php.ini
Вывод ошибок в php можно включить путём задания директив в файле php.ini:
error_reporting = E_ALL
display_errors = On
Эти строки уже есть в файле php.ini, но закомментированы. Попробуйте сделать поиск по названию.
После внесения изменений необходимо перезапустить Apache. В этом и кроется основное неудобство. Потому что отладка может производиться на работающем проекте.
Как и какими средствами находить ошибки в PHP коде?
При разработке, порой, код не работает так, как задумано или вообще не работает. Сижу, гадаю: что и где не так?
В итоге часто проблема мелкая, дурацкая опечатка, ошибка в синтаксисе и прочее. Профессионалом так не станешь, если по каждой ерунде бегать по ресурсам. А я хочу им быть.
Вопрос: какие есть способы, чтобы найти ошибки в PHP коде? Какие инструменты, методы, плагины, пути и пр.?
6 ответов 6
Вчера всё работало, а сегодня не работает / Код не работает как задумано
Debugging (Отладка)
В чем заключается процесс отладки? Что это такое?
Процесс отладки состоит в том, что мы останавливаем выполнения скрипта в любом месте, смотрим, что находится в переменных, в функциях, анализируем и переходим в другие места; ищем те места, где поведение отклоняется от правильного.
Будет рассмотрен пример с PHPStorm, но отладить код можно и в любой другой IDE.
Подготовка
Для начала необходимо, чтобы в PHP имелась библиотека для отладки под названием xdebug. Если её еще нет, то надо скачать на xdebug.org.
Далее в php.ini прописываем настройки:
Перезагружаем сервер, на всякий случай.
нажимаем Add new local server
Запуск
В данном случае, т.к. функция вызывается сразу на той же странице, то при нажатии кнопки Debug — отладчик моментально вызовет функцию, выполнение «заморозится» на первом же брейкпойнте. В ином случае, для активации требуется исполнить действие, при котором произойдет исполнение нужного участка кода (клик на кнопку, передача POST-запроса с формы с данными и другие действия).
Процесс
Для самого процесса используются элементы управления (см. изображение выше, выделено зеленым прямоугольником) и немного из дополнительно (см. изображение выше, выделено оранжевым прямоугольником).
Show Execution Point ( Alt+F10 ) — переносит в файл и текущую линию отлаживаемого скрипта. Например, если файлов много, решили посмотреть что в других вкладках, а потом забыли где у вас отладка 🙂
Step Over ( F8 ) — делает один шаг, не заходя внутрь функции. Т.е. если на текущей линии есть какая-то функция, а не просто переменная со значением, то при клике данной кнопки, отладчик не будет заходить внутрь неё.
Step Into ( F7 ) — делает шаг. Но в отличие от предыдущей, если есть вложенный вызов (например функция), то заходит внутрь неё.
Step Out ( Shift+F8 ) — выполняет команды до завершения текущей функции. Удобно, если случайно вошли во вложенный вызов и нужно быстро из него выйти, не завершая при этом отладку.
Rerun ( Ctrl+F5 ) — перезапускает отладку.
Resume Program( F9 ) — продолжает выполнение скрипта с текущего момента. Если больше нет других точек останова, то отладка заканчивается и скрипт продолжает работу. В ином случае работа прерывается на следующей точке останова.
Stop ( Ctrl+F2 ) — завершает отладку.
View Breakpoints ( Ctrl+Shift+F8 ) — просмотр всех установленных брейкпойнтов.
Mute Breakpoints — отключает брейкпойнты.
Итак, в текущем коде видно значение входного параметра:
Дальнейшие нажатия F8 переместят линию кода на строки 11, 12 и, наконец, 15.
Дополнительно
Это удобно, если останов нужен только при определённом значении, а не всегда (особенно в случае с циклами).
php exec: не возвращает вывод
у меня есть эта проблема: На веб-сервере ISS установлен Windows 7 x64 professional, Zend server. Запуск этой команды в php:
пожалуйста, напишите каждый его опыт и возможные решения или обходные пути.
10 ответов
есть несколько сообщений в соответствующих разделах руководства PHP, таких как этот:
у меня возникли проблемы с использованием команды PHP exec для выполнения любой партии файл. Выполнение других команд (т. е. «dir») работает нормально). Но если я выполнил пакетный файл, я не получил вывода из команды exec.
настройка сервера у меня состоит из Windows Server 2003 server работает IIS6 и PHP 5.2.3. На этом сервере, у меня есть:
оказывается, что даже со всем вышеперечисленным на месте на сервере я пришлось указать полный путь к cmd.exe в вызове exec.
есть еще несколько на обоих exec и shell_exec руководство страниц. Возможно, пройдя через них, вы встанете на ноги и будете работать на вас.
как бы извращенно это ни звучало, я обнаружил, что самый надежный способ сделать что-либо, связанное с процессом в Windows с использованием объектной модели компонента. Вы сказали, чтобы мы поделились своим опытом, верно?
$меня слышит смех людей
уже обрел самообладание?
Итак, сначала мы создадим COM-объект:
тогда мы просто запустим то, что когда-либо должно быть запущено.
круто! Теперь это будет висеть, пока все не закончится в этом двоичном файле. Итак, что нам нужно сделать сейчас, это схватить выход.
EDIT: после нескольких исследований я вижу единственный способ выполнить команду DIR так:
таким образом, вы можете попробовать мое решение, используя:
вы также можете использовать функцию proc_open, которая дает вам доступ к stderr, коду состояния возврата и stdout.
интересная часть с proc_open, по сравнению с другими функциями, такими как popen или exec, заключается в том, что она предоставляет параметры, специфичные для платформы windows, такие как:
Я знаю, что выбрал ответ, поскольку я должен это сделать, но я все еще не понимаю, почему он не будет работать на моем macchine, но я нашел резервное (используя proc_open) решение, используя другой метод:
надеюсь, это кому-то поможет.
У меня была такая же проблема и после того, как провел много часов и чашку кофе
просто отключение управления учетными записями пользователей (UAC) в Windows 7 короткий путь: P C:\Windows\System32\UserAccountControlSettings.исполняемый и выберите «никогда не уведомлять»
и php exec () отлично работает!
Я использую: Версия Apache: 2.2.11
PHP версия : 5.2.8
Windows 7 с пакетом обновления SP1 32бит
с наилучшими пожеланиями! : D
в целях безопасности ваш сервер может иметь ограниченный доступ к команде «exec». В этом случае, возможно, вам следует обратиться в хостинг-компанию, чтобы убрать это ограничение (если есть).
вы можете проверить permisssions пользователя IIS для УМК.exe
Если на выходе есть строка like (COMPUTERNAME=имя Вашего компьютера):
Это означает, что пользователь не имеет прав на выполнение команды.
вы можете добавить разрешения на выполнение с помощью команды:
он отлично работает на Windows 8.1 64bits с включенным UAC.