Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在php中通过shell_exec()函数运行wkhtmltopdf commad,但在命令行上使用相同的命令_Php_Wkhtmltopdf_Shell Exec - Fatal编程技术网

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

无法在php中通过shell_exec()函数运行wkhtmltopdf commad,但在命令行上使用相同的命令,php,wkhtmltopdf,shell-exec,Php,Wkhtmltopdf,Shell Exec,我遇到了麻烦,对php shell_exec命令感到非常困惑。 当命令由PHP执行时,我没有错误,但执行失败。如果我从终端使用完全相同的命令,它就会工作 命令如下: /usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf" $no_output = shell_exec($command); echo

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

命令如下:

/usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf"
$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"
当我从终端启动时:

$ /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版本。 我什么都不懂

谢谢你的帮助,我快疯了。
David。

看起来像是用户权限问题

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

当您从php脚本运行它时,它是系统上的http服务器帐户,它需要在/usr/bin中执行文件的权限。通常这是apache用户


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

它是共享主机吗?shell_exec似乎是一个受限函数。尝试运行
错误报告(E\u ALL);ini设置(“显示错误”,1)在调用shell_exec之前。

我在这里找到了解决方案:

多亏了克鲁兹楚

首先要从
shell_exec
命令获取信息,请在命令末尾添加“2>&1”。这样,您将在命令返回时获得信息:

/usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf"
$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"
解决方案:

  • 不使用该软件包(0.9.9-4)

  • 使用来自


  • 因此无需安装xvfb(这个建议我已经看过很多次了)

    我有这个问题已经很久了<代码>'2>&1'
    $命令
    以某种方式解决了问题之后

    这:

    而不是:

    $output = shell_exec($command);
    

    不知道为什么,但它可以工作,我很感激。

    我偶然发现了同样的问题,在我的例子中,exec命令中的absolut路径(如/var/www)不起作用,我必须使用从执行php文件的点开始的相对路径


    我还想注意,它在使用shell_exec时不起作用,但是它在使用普通的exec命令时起作用,不知道这里的区别在哪里

    不,不是,apache服务器使用“david”uid(不是www数据)运行。这不会改变这一点。我已成功获取错误消息,命令执行结束时出现了2>&1:
    $output=shell_exec($commande.2>&1”);echo$输出我得到“无法连接到X服务器”。很高兴您找到了解决方案。我在想,您不允许使用该函数,错误报告将打开“投诉模式”,因此您会看到类似的内容:
    shell\u exec()由于安全原因在第1行被禁用。