Я хотел запустить 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 script.php
сервер запускается, так как я вижу, что процесс работает, и значок отображается в доке, но я никогда не получаю от него никакого ответа, и файл pdf не создается. Может ли кто-нибудь увидеть что-то не так в моем коде или подумать о любых способах его отладки?
Тестирование на OSX 10.7, php 5.3.6, последние phantomjs. Пользователь _www, выполняющий сервер, имеет права администратора, папка, где я пишу файлы, была изменена на 777.
У вас есть несколько вопросов: