exec()和phantomjs问题与绝对path

我正在使用phantomJS编程取网页的屏幕截图。 我的networking服务器运行在Linux 64位上。

情景

我的test.php文件

 exec('./phantomjs --version', $o, $e); print_r($o); echo $e; 

我在浏览器中打开test.php 。 我得到的是:

 1.9.1 // version number 0 // exit code 

这certificate我可以通过exec()运行命令, phantomJS正在完美运行。

问题

现在,当我用上面的代码replace:

 exec('./phantomjs http://mywebsite.com/test.js', $o, $e); print_r($o); echo $e; 

输出是:

 Array ( ) // empty output 139 // exit code which on investigating turned out to be segmentation fault 

我也试过:

 exec('./phantomjs ./test.js', $o, $e); // since phantomjs and test.js are in same folder 

但结果是一样的(段错误)

test.js代码:

 var page = require('webpage').create(); var url = 'http://www.rediff.com/'; page.open(url, function (status) { phantom.exit(); }); 

这使我相信使用完整的path作为phantomJS的第二个参数会导致它崩溃。 因此,我想知道的事情是:

  • 我的想法是对的吗?
  • 或者是因为我的networking服务器阻止exec()通过绝对URL访问.js文件的一些限制吗?

Solutions Collecting From Web of "exec()和phantomjs问题与绝对path"

经过大量的搜索和测试,我得到了以下补充:

 //throws a lot of errors because searching some libraries $cmd = 'unset DYLD_LIBRARY_PATH ;'; $cmd.= ' /abs/path/to/phantomjs'; $cmd.= ' /abs/path/to/script.js'; //set environment variable to node source putenv('PATH=/abs/path/to/node/bin/'); //now exec the cmd and pipe the errors to stdout exec($cmd.' 2>&1', $output); //and output the results print_r($output); 

我不是最好的服务器管理员,所以我不能详细解释一切,但是上面的代码生成了pdf。 是啊。

我有一个类似的问题。 PHP + PhantomJS栅格化我发现phantomjs不喜欢从apache进程运行。 尝试从命令行运行你的exec命令:

 php -r "exec('./phantomjs http://mywebsite.com/test.js', $o, $e); print_r($o); echo $e;" 

如果这工作,你有几个选择:

1.)有些人建议修改sudoers,不要给apache用户密码sudo权限,以phantomjs二进制

2.)像我一样,并运行你的脚本作为一个cron。

尝试将test.js放在test.php所在的文件夹(调用exec('./phantomjs ./test.js', $o, $e); )或使用完整路径时。

我发现问题是与selinux(现在默认在所有生产服务器版本上被禁用作为标准)。

在文件/ etc / selinux / config中找到包含以下内容的行:

SELINUX =

并将其更改为:

SELINUX =禁用

运行命令(无需重启立即生效)

/ usr / sbin / setenforce 0