当前位置: 首页 > 知识库问答 >
问题:

无法在php中通过shell_exec()函数运行wkhtmltopdf commad,但在命令行上使用相同的命令

章高爽
2023-03-14

我遇到了麻烦,对php shell_exec命令感到非常困惑。当命令由PHP执行时,我没有错误,但执行失败。如果我从终端使用完全相同的命令,它就会工作。

命令如下:

/usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf"

当我从终端发来这个:

$ /usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyWG9XTd.html" "/tmp/knplabs_snappyv3pD7h.pdf"
Loading page (1/2)
Printing pages (2/2)                                               
Done      

但是从我的php脚本:

// Construct the previous command
$command = $this->buildCommand($url, $path);
../..
shell_exec($command);
../..
$content = file_get_contents($path);
../..

我已经测试了shell_exec的输出,它是空的。

日志:

Warning: file_get_contents(/tmp/knplabs_snappyv3pD7h.pdf): failed to open stream: No such file or directory in /*****/lib/snappy/SnappyMedia.class.php on line 64

/tmp目录中没有权限pb:

$ ls -la /tmp
total 448
drwxrwxrwt 16 root  root    4096 mars  12 21:51 .
../..

我尝试了avec PHP exec()函数来获取错误信息,我只是在return_var中得到一个“1”错误代码,在输出中没有任何信息。

有关此问题的信息,请参见我的测试服务器、桌面计算机,但不在笔记本上。这三个版本都使用相同的PHP、Apache和Mysql版本。我什么都不懂。。。

谢谢你的帮助,我快疯了。大卫。

共有3个答案

闻人昕
2023-03-14

我已经有这个问题很长时间了,并且正在添加。'2

这:

$output = shell_exec($command . ' 2>&1');

而不是:

$output = shell_exec($command);

不知道为什么,但它奏效了,我很感激。

钱繁
2023-03-14

看起来像是用户的权限问题。

从终端运行命令时,当前使用的用户帐户具有在 /usr/bin中运行命令和执行特定文件的权限。

当您从php脚本运行它时,它是您系统上的超文本传输协议服务器帐户,它需要权限来执行 /usr/bin.文件通常这是apache用户。

如何设置权限取决于您的系统。请记住,apache所允许的,是允许任何人访问http服务器的。

万涵亮
2023-03-14

我在这里找到了解决方案:从PHP执行wkhtmltopdf失败

感谢Krzychu。

首先从shell\u exec命令add“2”获取信息

$no_output = shell_exec($command);
echo $no_output; // nothing

$output = shell_exec($command . ' 2>&1');
echo $output; // in my case : "cannot connect to X server"

解决方案:

>

  • 不要使用wkhtmltopdf ubuntu包(0.9.9-4)

    使用Wkhtmltopdf下载页面中的官方软件包

    所以不需要安装xvfb!(这个建议我已经看过很多次了)

  •  类似资料:
    • 我使用wkhtmltopdf从html生成pdf,我试图通过PHP exec()函数运行下面的命令,但它不生成pdf,我没有显示任何错误,虽然。但是当我通过命令行运行相同的命令时,它就工作了。 下面是我用来执行pdf生成命令的PHP代码taht。 有关我的设置的一些信息: 操作系统-Ubuntu 12.04 PHP版本 任何帮助将不胜感激,谢谢。

    • 我有一个工作的外壳脚本,使用Kilall杀死程序的所有实例,如下所示: 基尔abc 现在,我编写了一个php网页,使用shell_exec函数执行此脚本: shell_exec('sh./myscript.sh'); 问题是,我的PHP代码在命令行上正确地使用"phpmyscript.php",但在浏览器中不起作用!。然而,我知道命令行中的用户是root,而php中的用户是apache(我用who

    • 问题内容: 我有一个文件,其中我必须替换所有单词,如$ xyz,对于它们,我必须替换为以下内容: 这个文件也有一些像$ {abcd}这样的词,我不必更改。我正在使用此命令 sed -i’s?\ $([A-Z _] +)?\ $ {\ 1}?g’文件 它可以在命令行上正常工作,但不能在perl脚本中作为 ; 我想念什么?我认为添加一些反斜杠会有所帮助。我尝试添加一些但没有成功。 谢谢 问题答案: 在

    • 问题内容: 我正在通过Java上的JSch建立ssh连接,在我尝试运行此.sh文件之前,一切似乎都工作正常。外壳程序脚本的名称是 repoUpdate.sh ,它非常简单: 这是我在Linux控制台上直接获得的输出,其中包含命令的正确响应: 现在,这是带有ssh连接的我的方法的Java代码,该代码试图调用同一文件 我得到的答复如下: svn命令(版本9432)没有任何输出或执行的迹象。 我认为这可

    • 我正在通过Java上的JSch建立一个SSH连接,在我尝试运行它之前,一切似乎都很正常。sh文件。shell脚本的名称是

    • 我有一个运行selenium phpunit测试的ant构建脚本。我可以在命令行上运行构建脚本,然后看到测试正在进行,浏览器窗口打开,并且selenium测试正在执行。命令行上一切正常。 但是,如果我得到创建一个jenkins jobs来运行构建脚本。它在尝试运行phpunit任务时失败。这是控制台输出。 看起来,当jenkins运行构建时,它不能访问Selenium。请参阅“访问被拒绝”和“网页