PHP и Apache: команда shell_exec (wkhtmltopdf с xvfb) не работает

Я пытаюсь запустить wkhtmltopdf (0.11.0 rc1) с php (5.4.2) на apache (2.4.2). Когда я пытаюсь запустить wkhtmltopdf-i386 --use-xserver http://www.google.com google.pdf 2>&1, я могу найти свой pdf. Вот мой php-код

<?php
    $cmd= '/usr/bin/wkhtmltopdf-i386 http://www.google.com google.pdf 2>&1';
    $ret = shell_exec($cmd);
    echo $ret;
?>

Он работает с apache и как командная строка php test.php. Потому что моя целевая страница содержит много изображений и несколько «тяжелых» диаграмм js. У меня возникла ошибка сегментации с помощью команды wkhtmltopdf, когда я пытаюсь преобразовать ее в pdf. Единственный способ заставить его работать — использовать xvfb в качестве эмулятора X11. Код выглядит так:

<?php
    $cmd= '/usr/bin/xvfb-run  /usr/bin/wkhtmltopdf-i386 --use-xserver http://www.google.com google.pdf 2>&1';
    $ret = shell_exec($cmd);
    echo $ret;
?>

Этот скрипт работает с командной строкой php test.php, но не работает с apache. Если я взгляну на процесс апача с htop, я увижу, что есть два процесса (с php test.php):

  • xvfb
  • wkhtmltopdf

Когда я запускаю с apache, у меня есть только процесс xvfb. Он завершается по тайм-ауту от apache, потому что он ожидает процесса wkhtmltopdf.

Я могу заставить его работать с apache (2.2.21) и php (5.3.10).

Есть ли что-то, чего мне не хватает? Может быть что-то в конфигурационных файлах апача?


person alexgindre    schedule 18.09.2012    source источник


Ответы (3)


У меня была такая же проблема. Я использовал функцию exec, но то же самое относится и к shell_exec. Выполнение функции было отключено в php.ini.

РЕШЕНИЕ: Удалите строку shell_exec из disable_functions в файле php.ini.

person P. R. Ribeiro    schedule 07.01.2013

Я не уверен, почему ваша вторая версия не вызывается из Apache (она не должна использовать ту же оболочку, поскольку shell_exec использует оболочку?), но в качестве обходного пути вы могли бы (из Apache PHP) shell_exec("php test.php"); и получить желаемый результат?

Возможно, также попробуйте одну из других функций выполнения процесса, например pcntl_exec. .

person jimp    schedule 18.09.2012
comment
Я пытался это сделать, но у меня все еще запущен только процесс xvfb. - person alexgindre; 19.09.2012

это в основном из-за прав собственности и разрешений, попробуйте

su www-data (for debian)
php test.php

вы, вероятно, увидите ошибку.

person alpera    schedule 18.09.2012
comment
Уже попробовал. Он отлично работает с sudo -u www-data php test.php - person alexgindre; 19.09.2012