8
我想從我的php腳本運行一個phantomjs服務器,然後對它執行一個curl請求並讀取它的響應(在最終版本中會給出生成的pdf的路徑) 。從控制檯運行phantomjs服務器文件,然後在瀏覽器中導航到它的地址時,一切正常。這就是server.js文件:從php啓動phantomjs服務器並等待它的響應
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(初始化服務器的時間)後對其執行curlPOST請求。
現在我有兩種情況:
- 如果我運行從控制檯的PHP腳本,用
php script.php
服務器開始,我可以看到進程的運行狀態和圖標在碼頭看到,但我從來沒有得到任何迴應它和pdf不會被創建。 - 如果我從瀏覽器運行腳本,圖標在擴展塢中不可見,所以服務器以其他方式啓動。仍然沒有迴應,也沒有pdf。
任何人都可以在我的代碼中看到任何錯誤或想到任何調試方法嗎?
在OSX 10.7,php 5.3.6,phantomjs latest上測試。運行服務器的用戶_www具有管理員權限,文件夾,我在寫文件被chmoded 777
在調試方面,我首先輸出/記錄'shell_exec()'的輸出 - 只需''echo'就足夠了。第一步是使用CLI(即運行'php script.php'),然後從網絡運行它。當你說「得不到迴應」時 - phantomjs掛了嗎?腳本是否退出或掛起?你可以手動在腳本啓動的實例上運行phantomjs查詢嗎? – mjec