PHP:不能exec()wkhtmltopdf:“sh:/ usr / bin / wkhtmltopdf:权限被拒绝”

我没有真正进入unix,这就是为什么这个东西对我来说有点奇怪。

操作系统是CentOS 6。

我读了几乎所有有关wkhtmltopdf的话题,但是我的问题依然存在。 其实这不是一个wkhtmltopdf问题,而是一个权限问题。
总结一下:wkhtmltopdf可以在命令行中运行,但不能和php exec()一起运行。
但是wget和php exec()一起工作正常:

我可以在命令行执行wkhtmltopdf,工作正常:
/usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1

我可以用php执行wget,工作正常:
exec('/usr/bin/wget -O /var/www/html/test/test123.txt "test.de" 2>&1', $output, $return_var);

但是我不能用php执行wkhtmltopdf:
exec('/usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1', $output, $return_var);

这导致“sh:/ usr / bin / wkhtmltopdf:权限被拒绝”

我检查了/ usr / bin / wkhtmltopdf并将其与/ usr / bin / wget进行比较。
权限是相同的:rwxr-xr-x或0755
即使我将/ usr / bin / wkhtmltopdf的chmod设置为777,并将所有者设置为apache,错误仍然是相同的。

也许这是一个百胜的问题? Becauce我通过yum和wkhtmltopdf安装了wget。 这是我能想到的唯一的区别。

我用以下方法安装了wkhtmltopdf:

tar -vxjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2
mv wkhtmltopdf-amd64 /usr/bin/wkhtmltopdf
chmod +x /usr/bin/wkhtmltopdf

或者它可能是一个SELinux的问题? 我对此不太了解,但是通过我的研究了解到,“httpd_ssi_exec”和“httpd_execmem”可能会有所帮助,并且我将这两个都设置为“yes”,但拒绝权限的问题依然存在。

所以我想知道为什么wget工作与PHP和wkhtmltopdf不? 希望有人能帮助我,我可以停止对此感到生气;)

最好的问候,Alex

PS:在我的脚本中,test.de是http://test.de ,但是我不允许发布两个以上的链接。

您可以使用:

 exec('/usr/local/bin/wkhtmltopdf --print-media-type index.html termo590.pdf 2>&1'); 

即使权限是777,这个命令也会以www用户的身份执行。因为www的权限级别很低,所以会有很多限制。所以使用setuid File Permission

setuid表示在执行时设置用户ID。 如果setuid位打开文件,那么执行该可执行文件的用户将获得拥有该文件的个人或组的权限。因此,您可以以root / high特权用户身份执行该命令。

如果您不想禁用SELinux另一种方法是使用cron来运行此命令。 /usr/bin/wkhtmltopdf "test.de" "/var/www/html/test/test.pdf" 2>&1

1)从你的PHP程序中写入参数名称到一个文件。

  $Handle = fopen("myfile", 'w'); fwrite($Handle, "test.de"); fclose($Handle); 

2)创建一个bash脚本来读取参数名称并将其转换为pdf。

 #!/bin/sh arg=$(head -n 1 myfile) /usr/bin/wkhtmltopdf arg "/var/www/html/test/test.pdf" 2>&1 

保存为pdf_converter.sh

 chmod +x pdf_converter.sh 

3)在crontab中配置脚本

crontab -e并粘贴这个

 * * * * * pdf_converter.sh