2010-10-04 5 views
2

Когда я называю /usr/local/bin/pdftk из PHP в Apache (через shell_exec(), exec(), system(), и т.д.), он возвращает СИНТАКСИС как ожидалось.Почему я получаю Segfault, когда я называю Pdftk от PHP/Apache, но не PHP/CLI или непосредственно

Когда я звоню /usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten через shell_exec(), ничего не возвращается.

Когда я копирую и вставляю одну и ту же строку в один и тот же путь в оболочке (как пользователь apache), файл output.pdf генерируется, как ожидалось.

Перемещение команды pdftk в скрипт оболочки PHP (shebang is #!/usr/bin/php) и выполнение его с помощью php script.php работает отлично.

Вызов, что скрипт (с его STDERR перенаправлены на стандартный вывод) из PHP в Apache (через shell_exec(script.php);) результатов в этой строке:

sh: line 1: 32547 Segmentation fault  /usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flatten 2>&1 

Всякий раз, когда я запускаю скрипт из командной строки (через PHP или непосредственно), он отлично работает. Всякий раз, когда я запускаю скрипт через PHP через Apache, он либо терпит неудачу без какого-либо уведомления, либо дает SegFault, перечисленные выше.

Это PHP 4.3.9 на RHEL4. Пожалуйста, не стреляйте в меня. Я установил память на 512M с помощью ini_set() и удостоверился, что пользователь apache читал/записывал все пути (с помощью fopen()) и регистрировался как apache ...

Просто пошел и проверил/var/журнал/сообщения, чтобы найти это:

Oct 4 21:17:58 discovery kernel: audit(1286241478.692:1764638): 
    avc: denied { read } for pid=32627 comm="pdftk" name="zero" 
    dev=tmpfs ino=2161 scontext=root:system_r:httpd_sys_script_t 
    tcontext=system_u:object_r:zero_device_t tclass=chr_file 

Примечание: Отключение SELinux "фиксированной" проблема. Это перешло в вопрос ServerFault? Может ли кто-нибудь дать мне 30-секундный праймер управления доступом SELinux здесь?

ответ

0

php-cli & php-cgi (или модуль, в зависимости от используемого сервера) - это разные двоичные файлы. Им даже не нужно делиться одной и той же версией, чтобы жить счастливо бок о бок на вашем сервере. Они также могут не иметь одинаковой конфигурации. Увеличение памяти обычно не делает ничего, чтобы помочь Segfaults. Очки для проверки:

  1. Являются ли они той же версией?
  2. Имеют ли они одинаковые настройки (обратитесь к позициям * .ini, загруженным в вывод phpinfo();, и, возможно, к самому самому выпуску), если нет: попробуйте, что произойдет, если вы измените тот, который для вашего веб-сервера, на тот, который для cli настолько далеко, насколько возможно.
  3. Segfaults встречаются больше в расширениях, чем в ядре afaik, а иногда и кажутся несвязанными. Попробуйте отключить ненужные расширения один за другим, чтобы узнать, не исчезла ли проблема.
  4. Еще не успел? Возможно, вы захотите запустить apache с gdb, но у меня нет опыта с этим, он может что-то сказать вам.
  5. Не повезло? Перекомпилируйте либо модуль cgi, используемый вашим веб-сервером.

Это PHP 4.3.9 на RHEL4. Пожалуйста, не стреляйте в меня.

Я чувствую себя более грустным для вас, чем гневом, мы за пределами знака 5.3, приходите сюда, здесь гораздо более счастливо.

+0

здесь выдаёт ошибку сегментации в/USR/местные/бен/Pdftk, верно? Не PHP? – ebynum

+0

Не обязательно, и поскольку он отлично работает от cli (и это _is_ тот же двоичный файл). Может быть, но более маловероятно ИМХО. Это может быть даже в Apache. Вы можете сделать быстрый тест, называя его с веб-сервера с помощью perl или python, любого другого языка сценариев, чтобы проверить, является ли это комьютер webserver/pdftk. – Wrikken

+0

«Нет обязательно» => «Не обязательно», конечно (до конца для редактирования :(). – Wrikken