2012-05-18 7 views
8

मैं अपने php स्क्रिप्ट से एक phantomjs सर्वर चलाने के लिए चाहता था, फिर इसे एक कर्ल अनुरोध करें और इसकी प्रतिक्रिया पढ़ें (जो अंतिम संस्करण में जेनरेट पीडीएफ का मार्ग देगा) । कंसोल से 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 खोलने कर रहा हूँ मेरी एचटीएमएल स्ट्रिंग के लिए पृष्ठ की सामग्री स्विचिंग और फिर पीडीएफ के रूप में प्रदान पेज बचत।

<? 
    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); 
?> 

इसके अलावा कोई जादू यहाँ:

अब मेरी PHP स्क्रिप्ट आता है। मैं टर्मिनल में phantomjs server.js कमांड निष्पादित करता हूं, और 5 के बाद (सर्वर में प्रवेश करने का समय) इसके लिए एक curlPOST अनुरोध करता है।
अब मैं दो मामलों है:

  • अगर मैं कंसोल से php स्क्रिप्ट चलाने, php script.php के साथ सर्वर शुरू होता है के रूप में मैं इस प्रक्रिया चल देख सकते हैं और आइकन गोदी में दिख रहा है, लेकिन मैं कोई जवाब कभी नहीं मिल यह और पीडीएफ नहीं बनाया गया है।
  • यदि मैं ब्राउज़र से स्क्रिप्ट चलाता हूं, तो आइकन डॉक में दिखाई नहीं देता है, इसलिए सर्वर किसी अन्य तरीके से शुरू होता है। अभी भी कोई प्रतिक्रिया नहीं और न ही पीडीएफ।

क्या कोई मेरे कोड में कुछ भी गलत देख सकता है या इसे डिबग करने के किसी भी तरीके के बारे में सोच सकता है?

ओएसएक्स 10.7, php 5.3.6, phantomjs पर परीक्षण। उपयोगकर्ता _www सर्वर चल व्यवस्थापक विशेषाधिकार, फ़ोल्डर है जहाँ मैं फ़ाइलों को लिख रहा हूँ 777

+1

डीबगिंग के मामले में, मैं 'shell_exec()' के आउटपुट को आउटपुट/लॉगिंग से शुरू करूंगा - बस 'echo' पर्याप्त होगा। चरण एक यह है कि इसे सीएलआई से काम करना है (यानी 'php script.php' चल रहा है) और उसके बाद इसे वेब से चलाने पर काम करें। जब आप कहते हैं "कोई प्रतिक्रिया नहीं है" - क्या phantomjs लटका है? क्या स्क्रिप्ट बाहर निकलती है या लटकती है? क्या आप स्क्रिप्ट द्वारा शुरू किए गए उदाहरण पर मैन्युअल रूप से phantomjs क्वेरी चला सकते हैं? – mjec

उत्तर

3

को chmoded गया है, तो आप कई मुद्दे हैं:

  1. phantomjs अग्रभूमि, जिसका अर्थ है अपने PHP स्क्रिप्ट बंद हो जाता है में शुरू किया गया है/जब तक phantomjs बंद हो जाता है सोता है। या तो phantomjs सेवा शुरू करें, या पृष्ठभूमि में इसे चलाएं। Howto के लिए "php execute a background process" देखें।
  2. वेब सर्वर शायद आपके ऑपरेटिंग सिस्टम के "आलेखीय भाग" तक नहीं पहुंच सकता है, जिसका अर्थ है कि यह आपके डेस्कटॉप से ​​बातचीत नहीं कर सकता है। यही कारण है कि आइकन प्रकट नहीं होता है, लेकिन phantomjs अभी भी शुरू होना चाहिए।
संबंधित मुद्दे