2

当我/usr/local/bin/pdftk从 Apache 中的 PHP 调用时(通过shell_exec()exec()system()等),它会按预期返回 SYNOPSIS 消息

当我调用/usr/local/bin/pdftk input.pdf fill_form input.fdf output output.pdf flattenviashell_exec()时,没有任何返回。

当我将完全相同的字符串复制并粘贴到 shell 中的相同路径(作为 apache 用户)时,将按预期生成 output.pdf 文件。

pdftk命令移动到 PHP shell 脚本 (shebang is #!/usr/bin/php) 并php script.php完美地执行它。

从 Apache 中的 PHP(通过)调用该 shell 脚本(其标准错误重定向到标准输出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 或直接)运行脚本时,它都可以正常工作。每当我通过 Apache 通过 PHP 运行脚本时,它要么在没有任何通知的情况下失败,要么给出上面列出的 SegFault。

它是 RHEL4 上的 PHP 4.3.9。请不要射击我。我已使用 ini_set() 将内存设置为 512M,并确保 apache 用户已读取/写入所有路径(使用 fopen())并以 apache ...

刚刚去检查 /var/log/messages 找到这个:

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 访问控制入门吗?

4

1 回答 1

0

php-cli 和 php-cgi(或模块,取决于您的服务器使用什么)是不同的二进制文件。他们甚至不必共享相同的版本就可以在您的服务器上愉快地并肩生活。它们也可能不共享相同的配置。增加内存通常无助于 Segfaults。检查点:

  1. 它们是同一个版本吗?
  2. 它们是否具有相同的设置(请参阅输出中加载的 *.ini 位置phpinfo();,可能还有整个输出本身),如果没有:尝试如果您将网络服务器的设置更改为 cli 的设置,会发生什么情况.
  3. 段错误更多地发生在扩展中,然后在核心 afaik 中,有时看似无关。尝试一一禁用不需要的扩展,看看问题是否消失。
  4. 还是没有成功?你可能想用 运行 apache gdb,但我没有这方面的经验,但它可能会告诉你一些事情。
  5. 没运气?重新编译您的网络服务器使用的 cgi 模块。

它是 RHEL4 上的 PHP 4.3.9。请不要射击我。

比起生气,我更心疼你,我们已经超过了5.3分,过来,这里更快乐。

于 2010-10-05T01:02:58.727 回答