Ответ 1
Добавьте 2>&1
в конец вашей команды, чтобы перенаправить ошибки из stderr в stdout. Это должно дать понять, что происходит не так.
У меня есть определенный PHP script, который вызывает exec() для выполнения команды для преобразования PDF в JPG. Эта команда отлично работает в bash.
Чтобы упредить ваши первоначальные догадки об устранении неполадок, обратите внимание на следующее:
Когда я вызываю этот PHP script из браузера (посещая http://www.example.com/script.php), exec() не выполняет свой аргумент.
ВАЖНО: Я знаю, что никаких проблем с моим script и способом, которым я создал команду bash, нет, потому что из bash я могу выполнить script с 'php', и он работает ( например, "PHP скрипт.php" преобразует файл)
Я также попытался отключить exec() с помощью system().
Наконец, у меня была эта проблема раньше, но я не помню, как я ее исправил.
Я знаю, что чего-то не хватает, поэтому я надеюсь, что кто-то еще испытал это, как я, и помнит, как его исправить!
Заранее благодарю вас за любую помощь, которую вы можете предоставить.
Алекс
Добавьте 2>&1
в конец вашей команды, чтобы перенаправить ошибки из stderr в stdout. Это должно дать понять, что происходит не так.
Просто догадаться, возможно, пользователь вашего веб-сервера не имеет привилегий для этого.
Так как он работает, когда из командной строки (которая будет находиться под вашей учетной записью пользователя), это звучит для меня как учетная запись, на которой работает веб-сервер (часто "www-data" ), не имеет разрешений на выполнение программа конверсии.
Рассматривали ли вы разрешения на файл? В браузере php работает под одним пользователем, но когда вы запустите его в bash, он, скорее всего, будет работать с вашими правами пользователя.
Это первое, что я проверил.
Эми
У вашего пользователя Apache/webserver есть необходимые права для запуска команды оболочки?
При запуске из cl вы, скорее всего, работаете как другой пользователь, который может объяснить, какой cl работает, но через браузер не делает.
Возможно, это связано с тем, что пользователи, работающие под управлением script через веб-сервер, и script через bash.
Обычно скрипты /exec, вызываемые через сервер, как и пользователь 'www', и этот пользователь не имеет права на запись в вашу область. но при запуске script в bash у вас есть права на запись.
Пользователю Apache www-data
должны быть предоставлены привилегии для выполнения определенных приложений с помощью sudo
.
sudo visudo
. На самом деле мы хотим отредактировать файл в etc/sudoers
. Для этого, используя sudo visudo
в терминале, он дублирует (temp) sudoers
файл для редактирования. www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(Предполагается, что вы хотите запускать команды restart
и mount
, используя суперпользователя
(root).)
Однако, если вы хотите запускать каждое приложение, используя
супер пользовательских привилегий, а затем добавьте следующее вместо того, что указано выше. Возможно, вы не захотите делать это, а не для команд ALL
, очень опасных.
www-data ALL=NOPASSWD: ALL
3. После редактирования файла sudoers (visudo
мы редактируем временный файл sudoers
, чтобы сохранить и выйти из файла temp (visudo), чтобы записать в файл sudoers
. (wq!
)
4.Thats it, теперь используйте exec()
следующим образом внутри xxx.php
script. не забывайте использовать sudo
, прежде чем использовать команду в PHP скрипт.
например: -
exec ("sudo /etc/init.d/smokeping restart 2>&1");
Итак, в вашей проблеме добавьте команды, которые вы хотите использовать, в step no (2.)
по мере добавления и измените свой PHP скрипт как на то, что вы хотите.
Я решил, что это проблема с ImageMagick, а не с PHP. Я пытаюсь сделать несколько исправлений, и если они не сработают, я собираюсь в конечном итоге использовать некоторую общую библиотеку PHP (возможно, imagick) для выполнения этой работы.
Изменено устройство вывода по умолчанию.
login as www (после включения) дает результат через оболочку, но не через php.