Не удается запустить командную строку wkhtmltopdf через функцию shell exec() в php, но та же команда работает в командной строке


У меня проблемы, и я сильно запутался в команде php shell_exec. Когда команда выполняется PHP, у меня нет ошибки, но выполнение завершается неудачно. Если я использую точно ту же команду с терминала, она работает.

Вот команда:

/usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf"

Когда я получаю это с терминала:

$ /usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyWG9XTd.html" "/tmp/knplabs_snappyv3pD7h.pdf"
Loading page (1/2)
Printing pages (2/2)                                               
Done      

Но из моего php-скрипта:

// Construct the previous command
$command = $this->buildCommand($url, $path);
../..
shell_exec($command);
../..
$content = file_get_contents($path);
../..

Я проверил вывод shell_exec, он пустой.

Журнал:

Warning: file_get_contents(/tmp/knplabs_snappyv3pD7h.pdf): failed to open stream: No such file or directory in /*****/lib/snappy/SnappyMedia.class.php on line 64

Нет разрешения pb в каталог /tmp:

$ ls -la /tmp
total 448
drwxrwxrwt 16 root  root    4096 mars  12 21:51 .
../..

Я пробовал использовать функцию PHP exec() для получения информации об ошибках, я просто получаю код ошибки "1" в return_var и ничего в выводе.

Для получения дополнительной информации эта проблема появляется на моем тестовом сервере, на моем настольном компьютере, но не на моем ноутбуке. Все 3 имеют одинаковые версии PHP, Apache, Mysql. Я ничего не понимаю...

Спасибо за любую помощь, я схожу с ума. Дэвид.

Author: David, 2015-03-12

4 answers

Я нашел решение здесь: Выполнение wkhtmltopdf из PHP завершается неудачно

Спасибо Кржичу.

Сначала , чтобы получить информацию из команды shell_exec, добавьте "2>&1" в конце команды. Таким образом, вы получите информацию в ответ на команду:

$no_output = shell_exec($command);
echo $no_output; // nothing

$output = shell_exec($command . ' 2>&1');
echo $output; // in my case : "cannot connect to X server"

Решение :

  1. Не используйте пакет wkhtmltopdf ubuntu (0.9.9-4)

  2. Используйте официальный пакет из Wkhtmltopdf страница загрузки

Так что нет необходимости устанавливать xvfb ! ( Я видел этот совет много раз)

 3
Author: David, 2017-05-23 11:52:56

Похоже, проблема с разрешениями пользователя.

Когда вы запускаете команду с терминала, именно используемая в настоящее время учетная запись пользователя имеет необходимые разрешения для запуска команды в /usr/bin и выполнения определенного файла.

Когда вы запускаете его из php-скрипта, это учетная запись http-сервера в вашей системе, которой требуется разрешение на выполнение файла в /usr/bin. Обычно это пользователь apache.

Способ настройки разрешений зависит от вашего система. Просто помните, что то, что разрешено для apache, разрешено для любого, кто обращается к вашему http-серверу.

 2
Author: Igor Greg, 2015-03-13 11:13:15

Это общий хостинг? Похоже, что shell_exec - это ограниченная функция. Попробуйте запустить error_reporting(E_ALL); ini_set('display_errors', 1); перед вызовом shell_exec.

 0
Author: s3v3n, 2015-03-13 11:37:48

У меня была эта проблема целую вечность и все время. ' 2>&1' после того, как $command каким-то образом решил проблему.

Это:

$output = shell_exec($command . ' 2>&1');

Вместо:

$output = shell_exec($command);

Понятия не имею, почему, но это работает, и я благодарен.

 -1
Author: user5750936, 2016-01-06 07:17:57