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 ....没有任何作用。
如果我在控制台中执行此命令 - 它可以正常运行。
我真的没有想法 - 不确定如何继续进行,所以任何帮助都会受到赞赏。
答案 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
抓取二进制包为我解决了这个问题。
希望这会有所帮助:)