exec()和phantomjs问题与绝对路径

时间:2013-09-07 10:58:03

标签: php linux exec phantomjs

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

情景

我的test.php文件

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

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

1.9.1 // version number
0 // exit code

这证明我可以通过exec()运行命令,phantomJS工作正常。

问题

现在我用以下代码替换上面的代码:

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

但结果是相同的(segfault)

test.js 代码:

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

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

  • 我的假设是对的吗?
  • 或者是因为我的网络服务器受到某些限制,阻止exec()通过绝对网址访问.js文件?

4 个答案:

答案 0 :(得分:3)

经过大量的搜索和测试后,我得到了以下新增功能:

//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。呀。

答案 1 :(得分:1)

我有类似的问题。 PHP + PhantomJS Rasterize我发现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运行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我发现selinux存在问题(默认情况下,所有生产服务器版本都默认禁用它)。

文件/ etc / selinux / config中的

查找包含以下内容的行:

SELINUX =

并将其更改为:

SELINUX =禁止

运行命令(立即生效而不重启)

/ usr / sbin / setenforce 0