PhantomJS脚本的shell_exec杀死了PHP-FPM和Apache

时间:2016-05-11 22:34:11

标签: php bash apache phantomjs shell-exec

shell_exec我遇到了一个非常奇怪的问题。 我想要做的是调用一个PhantomJS并使用shell_exec传递4个参数(用户会话ID,URL,文件保存名称和我需要采取的元素),以便在页面上制作某个元素的屏幕截图。

所以,我的命令看起来像这样:

/usr/local/bin/phantomjs  --ignore-ssl-errors=true  /Users/Igor/Sites/something/public_html/lib/phantomjs/script.js https://testsite.com/dashboard/\?dashboard_view=somedash /Users/Igor/Sites/something/uploads/screenshots/j78O3LstYumBnUi fef81e774e845d44044c167c6847f4d1 chart1 2>&1

这是我使用shell_exec执行的:

$command = ' --ignore-ssl-errors=true ' . $this->script . ' ' . escapeshellarg($this->uri) . ' ' . escapeshellarg($path) . ' ' . $this->session . ' ' . $this->element;
$output = shell_exec("$this->phantomjs $command 2>&1 1> /dev/null");

在我调用shell_exec后,我清楚地看到该命令已使用"ps uax | grep phantom"执行,但它永远停留在那里,导致服务器上的PHP-FPM(v5.4.45)和Apache2立即死亡。我需要补充一点,我正在通过AJAX调用异步执行此命令。

我尝试了不同的方法 - 使用其他东西而不是shell_exec,制作一个接受参数的Bash脚本,PhantomJS Runner ....没有任何作用。

如果我在控制台中执行此命令 - 它可以正常运行。

我真的没有想法 - 不确定如何继续进行,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

也许是文件权限问题? /Users/Igor/Sites/something/public_html/lib/phantomjs/script.js的权限是什么?

答案 1 :(得分:0)

我最近发布了一个项目,可以让PHP访问浏览器。在这里获取:https://github.com/merlinthemagic/MTS,幕后是PhantomJS的一个实例,就像你想要的那样。

下载并设置后,您只需使用以下代码:

$myUrl          = "https://testsite.com/dashboard/?dashboard_view=somedash";
$windowObj      = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl);

//find the dimensions of the element, i **ASSUME** the id of the element is 'chart1', if not enter the correct value here
$selector   = '[id=chart1]';
$element    = $windowObj->getElement($selector);
$loc         = $element['location'];

//tell the screenshot to only get the part you want
$windowObj->setRasterSize($loc['top'], $loc['left'], ($loc['right'] - $loc['left']), ($loc['bottom'] - $loc['top']));

$imageData  = $windowObj->screenshot("png");

//save your image
file_put_contents("/path/where/you/wanna/save.png", $imageData);

答案 2 :(得分:0)

我与PHP7.0 + php-fpm + nginx有类似的问题。 (甚至运行exec('phantomjs -v');

在我的情况下,在通过nginx运行命令后,我在php7.0-fpm.log中收到了无休止的警告消息(试图重启子进程)。此外,如果我从命令行执行也没有问题。

你是如何安装phantomjs的?

http://phantomjs.org/download.html而不是npm -g install phantomjs抓取二进制包为我解决了这个问题。

希望这会有所帮助:)