8

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();     
    });
});

基本的に、ローカルホストアドレスを開き、ページのコンテンツを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要求を実行します。
今私は2つのケースがあります:

  • コンソールからphpスクリプトを実行するphp script.phpと、プロセスが実行されていることを確認でき、ドックにアイコンが表示されているため、サーバーが起動しますが、応答がなく、PDFが作成されません。
  • ブラウザからスクリプトを実行すると、ドックにアイコンが表示されないため、サーバーが別の方法で起動します。まだ応答もpdfもありません。

誰かが私のコードに何か問題があるのを見たり、それをデバッグする方法を考えたりできますか?

OSX 10.7、php 5.3.6、最新のphantomjsでのテスト。サーバーを実行しているユーザー_wwwには管理者権限があり、ファイルを書き込んでいるフォルダーは777に変更されました。

4

1 に答える 1

3

いくつかの問題があります。

  1. phantomjs はフォアグラウンドで開始されます。つまり、php スクリプトは phantomjs が停止するまで停止/スリープします。phantomjs サービスを開始するか、バックグラウンドで実行します。HowTo については、 「 php バックグラウンド プロセスを実行する」を参照してください。
  2. Web サーバーは、おそらくオペレーティング システムの「グラフィック部分」にアクセスできない可能性があります。つまり、デスクトップと対話できません。これがアイコンが表示されない理由ですが、phantomjs は起動するはずです。
于 2012-05-24T10:50:50.633 に答える