【发布时间】:2013-04-19 07:17:59
【问题描述】:
更新
我的目录结构如下
http://domainname.com/developer/clientName/ppt/phantom/ // inside this phantom folder, all files are present
在与 Bass Jobsen 聊天并查看服务器错误日志后,我发现日志中列出了这一点
[Tue Apr 23 08:31:34 2013] [error] [client xxx.xxx.xx.xxx] sh: line 1: 29443
Segmentation fault /home/xyz/public_html/developer/clientName/ppt/phantom/phantomjs --version 2>&1
================================================ ====================================
总结
我正在尝试在我的服务器上执行一个二进制文件。二进制文件名为phantomJS,主要用于创建网页截图。
我登录到我的 cPanel 并找到了有关我的服务器的以下信息:
Operating system : Linux
Architecture : i686
所以我继续从 phantomJS 网站下载了phantomjs-1.9.0-linux-i686.tar.bz2。我上传了位于下载的bin 文件夹内的phantomjs 文件(我刚刚上传了一个名为phantomjs 的文件,大小约为38 MB。我假设我不需要任何文件下载附带的其他文件。有一个examples 文件夹和一些ReadMes 和其他.txt 文件)
我还将另外三个文件上传到存在phantomjs 的同一文件夹中:
-
test.php(这是将在 浏览器) -
test.js(包含启动phantomjs的代码) -
createScreenshot.php(包含输出一些 HTML 的代码)
所以所有文件都在同一个文件夹中。因此,不应该因为路径错误而出现问题。
test.php
exec('phantomjs test.js');
test.js
var page = require('webpage').create();
var url = 'createScreenshot.php';
page.open(url, function (status) {
page.render('test.png');
phantom.exit();
});
createScreenshot.php
echo '<h1>This should be converted to an image</h1>';
问题
现在,当我浏览到www.mydomain.com/test/test.php 时,我得到的只是一个空白页面,这很好,因为唯一应该发生的事情是在test 文件夹中创建一个图像,但这永远不会发生。没有错误被输出。我也尝试将error_reporting(E_ALL) 放入test.php,但仍然没有显示错误,只是一个空白页。
调试
我决定测试我的服务器上是否完全启用了exec。我这样做是通过使用
echo exec('whoami');
这打印出了我的 cPanel 用户名。所以这意味着exec 正在工作。
接下来我要做的是检查文件夹权限。 test 文件夹拥有 755 权限,phantomjs 也是如此。我尝试将两者都更改为777,但这也无济于事。
这让我相信phantomjs 文件有问题。我不知道下一步该尝试什么。我确信我从 phantomJS 网站 (phantomjs-1.9.0-linux-i686.tar.bz2) 下载了正确的包。
我还能做些什么来调试问题?
更多调试
跑步
echo exec("ls -lh");
打印出来
-rw-r--r-- 1 abc abc 1.8K Apr 6 05:15 third-party.txt
这个third-party.txt 位于包含phantomjs 二进制文件的文件夹中,但我想知道为什么只打印了一个文件名。与third-party.txt 相同的文件夹中也有php 和js 文件。不太确定 1 在上面的输出中代表什么。
【问题讨论】:
-
您知道
phantomjs是否在您的PHP 可执行路径中吗?如果没有,您可能想尝试找到它并为其使用绝对路径(locate phantomjs或替代方法) -
PHP 通常从运行它的用户那里继承路径(通常是
/usr/bin, /usr/local/bin)。您需要检查的是phantomjs是否确实在其中。如果不是,您需要参考它的绝对路径(即它的确切位置)。locate phantomjs可能会返回它的位置。 -
当您将其上传到与脚本相同的文件夹时,尝试使用以下路径:
dirname(__FILE__)."/phantomjs"很可能证明有效。 -
抱歉这个菜鸟问题,但您的意思是尝试
echo exec(dirname(__FILE__)."/phantomjs")吗? -
是的,如果 phantomjs 与您的 PHP 脚本位于同一文件夹中。或随后的错误/警告/通知。