通过PHP的exec在Linux Web服务器上执行二进制文件

时间:2013-04-19 07:17:59

标签: php linux exec

更新

我的目录结构如下

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所在的同一文件夹:

  1. test.php(这是将在中执行的主要文件 浏览器)
  2. test.js(包含启动phantomjs的代码)
  3. createScreenshot.php(包含输出一些HTML的代码)
  4. 所以所有文件都在同一个文件夹中。因此,不应该因错误的路径而出现问题。

    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二进制文件的文件夹中,但我想知道为什么只打印了一个文件名。 php和js文件也与third-party.txt在同一文件夹中。但不确定1代表上述输出。

4 个答案:

答案 0 :(得分:6)

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

要解决此问题,请将传输模式更改为二进制(在FileZilla:Transfer - &gt; Transfer type - &gt; Binary)。

[source]

答案 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')

几年前,我经历了一些令人头疼的事情,处理这类事情。