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


Starting phantomjs server from php and waiting for it's response

我想从我的php脚本运行一个phantomjs服务器,然后对它执行一个curl请求并读取它的响应(在最终版本中,这将提供生成pdf的路径(。从控制台运行 phantomjs 服务器文件,然后在浏览器中导航到它的地址时,一切正常。那是服务器.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();     
    });
});

基本上,我正在打开本地主机地址,将页面的内容切换到我的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因为我可以看到进程正在运行并且图标在扩展坞中可见,但我从未收到它的任何响应,并且没有创建 pdf。
  • 如果我从浏览器运行脚本,图标在扩展坞中不可见,因此服务器以其他方式启动。仍然没有回应也没有pdf。

任何人都可以在我的代码中看到任何错误或想到任何调试方法吗?

在OSX 10.7,php 5.3.6,phantomjs最新版本上进行测试。运行服务器的用户_www具有管理员权限,我正在写入文件的文件夹被格式化为 777。

您有几个问题:

  1. Phantomjs 在前台启动,这意味着您的 PHP 脚本会停止/休眠,直到 Phantomjs 停止。启动 phantomjs 服务,或在后台运行它。请参阅" php 执行后台进程 "以获取操作方法。
  2. Web 服务器可能无法访问操作系统的"图形部分",这意味着它无法与您的桌面交互。这就是为什么图标没有出现,但幻影仍然应该启动的原因。