Когда я называю /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 здесь?
здесь выдаёт ошибку сегментации в/USR/местные/бен/Pdftk, верно? Не PHP? – ebynum
Не обязательно, и поскольку он отлично работает от cli (и это _is_ тот же двоичный файл). Может быть, но более маловероятно ИМХО. Это может быть даже в Apache. Вы можете сделать быстрый тест, называя его с веб-сервера с помощью perl или python, любого другого языка сценариев, чтобы проверить, является ли это комьютер webserver/pdftk. – Wrikken
«Нет обязательно» => «Не обязательно», конечно (до конца для редактирования :(). – Wrikken