Запуск сервера phantomjs из php и ожидание ответа

Я хотел запустить сервер phantomjs из своего php-скрипта, затем выполнить к нему запрос 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.

8
задан mike_hornbeck 18 May 2012 в 10:54
поделиться