我的目录结构如下
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
。我上传了phantomjs
文件,该文件位于下载的bin
文件夹中(我刚刚上传了一个名为phantomjs
的文件,大小约为38 MB。我假设我不需要下载附带的任何其他文件。有一个examples
文件夹和一些ReadMe
和其他.txt
个文件)
我还将另外三个文件上传到phantomjs
所在的同一文件夹:
test.php
(这是将在中执行的主要文件
浏览器)test.js
(包含启动phantomjs的代码)createScreenshot.php
(包含输出一些HTML的代码)所以所有文件都在同一个文件夹中。因此,不应该因错误的路径而出现问题。
exec('phantomjs test.js');
var page = require('webpage').create();
var url = 'createScreenshot.php';
page.open(url, function (status) {
page.render('test.png');
phantom.exit();
});
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
二进制文件的文件夹中,但我想知道为什么只打印了一个文件名。 php和js文件也与third-party.txt
在同一文件夹中。但不确定1
代表上述输出。
答案 0 :(得分:6)
如果通过FTP上传二进制文件,由于FTP客户端更改文件内的行结尾,它可能会损坏。
要解决此问题,请将传输模式更改为二进制(在FileZilla:Transfer - &gt; Transfer type - &gt; Binary)。
答案 1 :(得分:1)
我尝试过你做过的事。
test.php的:
<?
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo exec('./phantomjs-1.9.0-linux-i686/bin/phantomjs ./test.js 2>&1');
exit;
而不是./
我也可以使用$_SERVER['DOCUMENT_ROOT']
。
my test.js:
var page = require('webpage').create();
page.open('http://github.com/', function () {
page.render('github.png');
phantom.exit();
});
所有文件都在我的文档根目录(/ var / www /)中。 Test.php从网络服务器运行,所以当通过exec()
调用时,phantomjs也是如此。运行Web服务器的用户(www-data needs rights)写'github.png'。为了得到这个我使用chmod 0777 / var / www /。现在一切正常。
没有chmod test.php给我一个空白页面。 phantomjs不会打印错误。
注意,不要在生产环境中更改根目录的权限。为您的屏幕截图创建新目录并chmod this并改变test.js中的保存路径
答案 2 :(得分:1)
exec
运行IMAGEMAGICK库时,我遇到了类似的问题。奇怪的是, exec 似乎无法正确找到某些可执行文件的路径。因此,我不得不使用convert
,而是使用完整的应用程序路径/usr/bin/convert
。
要查找完整的应用程序路径,请在终端中键入以下内容:
type -a YOUR_COMMAND
还有一条建议:使用PHP的 exec 命令的可选参数,这是手册中的定义:
string exec ( string $command [, array &$output [, int &$return_var ]] )
我能够在第三个参数的帮助下跟踪我的问题,该参数返回已执行语句的状态。如果您获得127状态,则必须使用应用程序的完整路径!
答案 3 :(得分:1)
当您使用exec或其任何姐妹函数时,请尝试使用绝对路径指定文件 - &gt;我的服务器上的exec,shell_exec等不工作具有相对路径。
如果您在共享主机上,它当然会有所不同,但有类似的内容:
exec('/var/www/html/script')
//or if youre on a shared server it would be something more like
exec('/user2342jh/www-docs/html')
几年前,我经历了一些令人头疼的事情,处理这类事情。