0

更新

我的目录结构如下

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-1.9.0-linux-i686.tar.bz2从 phantomJS 网站下载。我上传了phantomjs位于bin下载文件夹内的文件(我刚刚上传了一个名为 的文件,phantomjs大小约为 38 MB。我假设我不需要下载附带的任何其他文件。那里是一个examples文件夹和一些ReadMes和其他.txt文件)

我还将另外三个文件上传到存在的同一文件夹中phantomjs

  1. test.php(这是将在浏览器中执行的主文件)
  2. test.js(其中包含启动 phantomjs 的代码)
  3. createScreenshot.php(其中包含输出一些 HTML 的代码)

所以所有文件都在同一个文件夹中。因此,不应该因为路径错误而出现问题。

测试.php

exec('phantomjs test.js');

测试.js

var page = require('webpage').create();
var url = 'createScreenshot.php';
page.open(url, function (status) {
    page.render('test.png');
    phantom.exit();
});

创建屏幕截图.php

echo '<h1>This should be converted to an image</h1>';

问题

现在,当我浏览到 时www.mydomain.com/test/test.php,我得到的只是一个空白页,这很好,因为唯一应该发生的是在test文件夹中创建图像,但这永远不会发生。没有错误被输出。我也试过把error_reporting(E_ALL)inside 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代表什么。

4

4 回答 4

6

如果通过 FTP 上传二进制文件,它可能会由于 FTP 客户端更改文件内的行结尾而损坏。

要解决此问题,请将传输模式更改为二进制(在 FileZilla 中:传输 -> 传输类型 -> 二进制)。

[资源]

于 2013-04-27T10:13:30.007 回答
1

When you use exec or any of its sister functions, try specifying the file with an absolute path -> exec, shell_exec, etc DO NOT WORK on my servers with a relative path.

If youre on shared hosting it'll be different of course, but something like:

exec('/var/www/html/script')
//or if youre on a shared server it would be something more like
exec('/user2342jh/www-docs/html')

I went through a bit of a hair-pulling situation years ago working with this very type of thing.

于 2013-04-27T10:05:24.900 回答
1

我已经尝试过您所做的相同操作。

测试.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'].

我的 test.js:

var page = require('webpage').create();
page.open('http://github.com/', function () {
page.render('github.png');
phantom.exit();
});

所有文件都在我的文档根目录 (/var/www/) 中。Test.php 从网络服务器运行,phantomjs 在通过 调用时也是如此exec()。运行网络服务器的用户(www-data 需要权限)来编写“github.png”。为此,我使用 chmod 0777 /var/www/。现在一切正常。

没有 chmod test.php 给我一个空白页。phantomjs 不会打印错误。

注意不要在生产环境中更改根目录的权限。为您的屏幕截图创建新目录并对其进行 chmod 并在 test.js 中更改保存路径

于 2013-04-22T20:53:15.047 回答
1

在运行 IMAGEMAGICK 库时,我遇到了类似的问题exec。奇怪的是exec似乎无法正确找到某些可执行文件的路径。因此,convert我不得不使用完整的应用程序路径,而不是只使用/usr/bin/convert。要查找完整的应用程序路径,请在终端中键入以下内容:

type -a YOUR_COMMAND

另一个建议:使用 PHP 的exec命令的可选参数,这是手册中的定义:

string exec ( string $command [, array &$output [, int &$return_var ]] )

我能够在第三个参数的帮助下跟踪我的问题,它返回执行语句的状态。如果您获得 127 作为状态,您肯定必须使用应用程序的完整路径!

于 2013-04-23T14:05:49.293 回答