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

Я хотел запустить phantomjs-сервер из своего php-скрипта, затем сделать запрос на завиток и прочитать его ответ (который в окончательной версии даст путь к сгенерированному 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 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 в терминале, а через 5 phantomjs server.js (время для запуска сервера) выполняет запрос curlPOST.
Теперь у меня есть два случая:

  • Если я запускаю php-скрипт из консоли, с php script.php сервер запускается, так как я вижу, что процесс работает, и значок отображается в доке, но я никогда не получаю от него никакого ответа, и файл pdf не создается.
  • Если я запустил скрипт из браузера, значок не будет виден на доке, поэтому сервер начнет каким-то другим способом. Еще нет ответа или нет.

Может ли кто-нибудь увидеть что-то не так в моем коде или подумать о любых способах его отладки?

Тестирование на OSX 10.7, php 5.3.6, последние phantomjs. Пользователь _www, выполняющий сервер, имеет права администратора, папка, где я пишу файлы, была изменена на 777.

У вас есть несколько вопросов:

  1. phantomjs запускается на переднем плане, что означает, что ваш php-скрипт останавливается / засыпает до тех пор, пока phantomjs не остановится. Либо запустите службу phantomjs, либо запустите ее в фоновом режиме. См. « Php выполнить фоновый процесс » для HowTo.
  2. Возможно, веб-сервер не может получить доступ к «графической части» вашей операционной системы, что означает, что он не может взаимодействовать с вашим рабочим столом. Вот почему значок не появляется, но phantomjs все равно должен начинаться.