从PHP开始phantomjs服务器,并等待它的响应(Starting phantomjs serv

2019-06-24 13:33发布

我想从我的PHP脚本运行phantomjs服务器,然后做一个卷曲请求,并读取它的响应(其最终版本将给予生成的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();     
    });
});

基本上我打开本地主机ADDRES,切换页面的内容,我的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在终端的命令,5s后(时间给init服务器)做一个curlPOST请求给它。
现在我有两种情况:

  • 如果我从控制台运行PHP脚本,用php script.php服务器开始,我可以看到进程的运行状态和图标在码头看到,但我从来没有得到任何回应,而不是创建PDF文件。
  • 如果我在浏览器中运行的脚本,所以服务器以其他方式启动图标是不是在被告席上可见。 还是没有反应,也没有PDF格式。

任何人都可以看到什么错在我的代码或想调试它的任何方式?

测试在OSX 10.7,PHP 5.3.6,phantomjs最新。 运行服务器的用户_www具有管理员权限,在那里我正在写文件被chmoded 777文件夹中。

Answer 1:

你有几个问题:

  1. phantomjs在前台,这意味着你的PHP脚本停止/休眠,直到phantomjs停止启动。 无论是启动phantomjs服务,或在后台运行它。 请参阅“ PHP执行后台进程 ”为HOWTO。
  2. Web服务器可能可能无法访问您的操作系统,这意味着它无法与桌面交互的“图形的一部分”。 这就是为什么图标没有出现,但phantomjs仍应启动。


文章来源: Starting phantomjs server from php and waiting for it's response