Не удается запустить командную строку 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. Я ничего не понимаю...
Спасибо за любую помощь, я схожу с ума. Дэвид.
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"
Решение :
Не используйте пакет wkhtmltopdf ubuntu (0.9.9-4)
Используйте официальный пакет из Wkhtmltopdf страница загрузки
Так что нет необходимости устанавливать xvfb ! ( Я видел этот совет много раз)
Похоже, проблема с разрешениями пользователя.
Когда вы запускаете команду с терминала, именно используемая в настоящее время учетная запись пользователя имеет необходимые разрешения для запуска команды в /usr/bin и выполнения определенного файла.
Когда вы запускаете его из php-скрипта, это учетная запись http-сервера в вашей системе, которой требуется разрешение на выполнение файла в /usr/bin. Обычно это пользователь apache.
Способ настройки разрешений зависит от вашего система. Просто помните, что то, что разрешено для apache, разрешено для любого, кто обращается к вашему http-серверу.
Это общий хостинг? Похоже, что shell_exec - это ограниченная функция. Попробуйте запустить error_reporting(E_ALL); ini_set('display_errors', 1);
перед вызовом shell_exec.
У меня была эта проблема целую вечность и все время. ' 2>&1'
после того, как $command
каким-то образом решил проблему.
Это:
$output = shell_exec($command . ' 2>&1');
Вместо:
$output = shell_exec($command);
Понятия не имею, почему, но это работает, и я благодарен.