从 php 启动 phantomjs 服务器并等待它的响应

Posted

技术标签:

【中文标题】从 php 启动 phantomjs 服务器并等待它的响应【英文标题】:Starting phantomjs server from php and waiting for it's response 【发布时间】:2012-05-25 22:49:00 【问题描述】:

我想从我的 php 脚本运行一个 phantomjs 服务器,然后向它发出 curl 请求并读取它的响应(在最终版本中将给出生成的 pdf 的路径)。从控制台运行 phantomjs 服务器文件然后在浏览器中导航到它的地址时,一切正常。那是 server.js 文件:

var server, service, page = require('webpage').create(), address, output,
    html = '<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>';

server = require('webserver').create();

var rasterize = function(html, callback)
    address = 'http://localhost';
    output = '/Users/me/print.pdf'
    page.viewportSize =  width: 600, height: 600 ;
    page.open(address, function (status) 
        if (status !== 'success') 
            console.log('Unable to load the address!');
         else 
            window.setTimeout(function () 
                page.content = html;
                page.render(output);
                callback();
            , 2000);
        
    );


service = server.listen(8080, function (request, response) 
    response.statusCode = 200;

    rasterize(html, function()
        response.write('<h1>BAR</h1>');
        response.close();
        phantom.exit();     
    );
);

基本上我正在打开 localhost 地址,将页面内容切换到我的 html 字符串,然后将呈现的页面保存为 pdf。

现在是我的 php 脚本:

<?
    function send_callback($data)
        echo 'type: success, data: '.$data.'';
    

    function curl_post($url, array $post = NULL, array $options = array())  
        $defaults = array( 
            CURLOPT_POST => 1, 
            CURLOPT_HEADER => 0, 
            CURLOPT_URL => $url, 
            CURLOPT_FRESH_CONNECT => 1, 
            CURLOPT_RETURNTRANSFER => 1, 
            CURLOPT_FORBID_REUSE => 1, 
            CURLOPT_TIMEOUT => 5, 
            CURLOPT_POSTFIELDS => http_build_query($post) 
        ); 

        $ch = curl_init(); 
        curl_setopt_array($ch, ($options + $defaults)); 
        if( ! $result = curl_exec($ch))  
            trigger_error(curl_error($ch)); 
         
        curl_close($ch);
        send_callback($result);
    

        shell_exec('phantomjs '.escapeshellarg(dirname(__FILE__).'/server.js'));
        //wait to allow server to start
        sleep(5);

        $data = array('html'=> 'foo');    
        curl_post('http://localhost:8080', $data);
?>

这里也没有魔法。我在终端中执行phantomjs server.js 命令,并在 5 秒后(启动服务器的时间)向它发出 curlPOST 请求。 现在我有两种情况:

如果我从控制台运行 php 脚本,使用php script.php 服务器启动,因为我可以看到进程正在运行并且图标在 Dock 中可见,但我从未得到任何响应,并且未创建 pdf。 如果我从浏览器运行脚本,图标在 Dock 中不可见,因此服务器以其他方式启动。还是没有回复,也没有pdf。

任何人都可以看到我的代码有什么问题或想出什么方法来调试它吗?

在 OSX 10.7、php 5.3.6、phantomjs 最新测试。运行服务器的用户 _www 具有管理员权限,我正在写入文件的文件夹已更改为 777。

【问题讨论】:

在调试方面,我会从输出/记录shell_exec() 的输出开始 - 只需echo 就足够了。第一步是让它从 CLI 运行(即运行php script.php),然后从 Web 运行它。当你说“没有回应”时 - phantomjs 会挂起吗?脚本是退出还是挂起?能否在脚本启动的实例上手动运行 phantomjs 查询? 【参考方案1】:

你有几个问题:

    phantomjs 在前台启动,这意味着您的 php 脚本会停止/休眠,直到 phantomjs 停止。要么启动 phantomjs 服务,要么在后台运行它。请参阅“php execute a background process”获取操作方法。 Web 服务器可能无法访问您操作系统的“图形部分”,这意味着它无法与您的桌面交互。这就是图标没有出现的原因,但 phantomjs 仍应启动。

【讨论】:

以上是关于从 php 启动 phantomjs 服务器并等待它的响应的主要内容,如果未能解决你的问题,请参考以下文章

从PHP执行PhantomJS

使用PhantomJS和node.js保存并呈现网页

多个 PhantomJS 实例挂起

为什么这个PhantomJS进程导致“目录 不存在。“错误?

如何让Mink Selenium 2 Driver等待页面加载Behat

centos7更改引导项等待时间