2009-05-02 16 views
12

लगभग किसी भी काम कर रहे PHP प्रोग्रामर को कच्चे HTTP अनुरोध भेजने के लिए कर्ल का उपयोग करना पड़ता है, भले ही यह क्रेडिट कार्ड भुगतान प्रसंस्करण, घृणित स्क्रीन स्क्रैपिंग या बीच में कुछ के लिए हो।PHP curl के साथ समस्याओं का निवारण करने के लिए आप क्या कदम उठाते हैं?

लगभग कोई भी मंच जहां PHP प्रोग्रामर एकत्रित होते हैं, उनमें बड़ी संख्या में लोग can't get the cURL functions to do what they want हैं।

जब कर्ल आपके लिए काम नहीं कर रहा है, तो यह पता लगाने के लिए आप किस समस्या निवारण तकनीकों का उपयोग करते हैं, यह क्यों काम नहीं कर रहा है? PHP के कर्ल कार्यान्वयन के साथ क्या अजीब गेटचास आप भागते हैं? अगर कोई फोरम पर "HALP MY CURL IZ BROKEN" प्रश्न पूछता है, तो यह पता लगाने के लिए आप क्या कदम उठा रहे हैं कि उनका अनुरोध क्यों काम नहीं कर रहा है?

+0

सिर्फ शीर्ष लेख प्राप्त करने के लिए CURLOPT_HEADER का उपयोग .. कि समारोह –

उत्तर

15

मुझे बहुत उपयोगी होने के लिए CURLINFO_HEADER_OUT विकल्प मिल गया है।

<?php 
$curl = curl_init('http://www.php.net'); 

curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLINFO_HEADER_OUT, true); 

curl_exec($curl); 

echo '<fieldset><legend>request headers</legend> 
    <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre> 
</fieldset>'; 

echo '<fieldset><legend>response</legend> 
    <pre>', htmlspecialchars(dbg_curl_data(null)), '</pre> 
</fieldset>'; 

function dbg_curl_data($curl, $data=null) { 
    static $buffer = ''; 

    if (is_null($curl)) { 
    $r = $buffer; 
    $buffer = ''; 
    return $r; 
    } 
    else { 
    $buffer .= $data; 
    return strlen($data); 
    } 
}
+0

क्या यह पोस्ट डेटा पर भी काम करता है ?? मुझे त्रुटि मिल रही है 'चेतावनी: curl_exec() [function.curl-exec]: C: \ xampp \ htdocs \ my_project \ login.php' में CURLOPT_WRITEFUNCTION को कॉल नहीं कर सका जहां ate 49 पर लिखा गया है' $ res = curl_exec ($ कर्ल); ' – diEcho

+0

हां, यह पोस्ट डेटा के साथ भी काम करता है। ऐसा लगता है कि आपने curl_setopt/CURLOPT_WRITEFUNCTION को पारित किया गया फ़ंक्शन नाम वास्तव में किसी फ़ंक्शन/कॉल करने योग्य को हल नहीं करता है। – VolkerK

+1

वाह, यह एक बहुत ही साफ और कुशल समाधान था। वास्तव में मुझे बहुत मदद मिली, धन्यवाद! – angularsen

3

वास्तव में, मैं कभी भी curl (php में) का उपयोग नहीं करता। PHP स्ट्रीम एपीआई बहुत साफ है, और इसका उपयोग डेटा को भी पोस्ट करने के लिए किया जा सकता है। Wez Furlong इस बारे में एक लेख है।

यदि मैं इसका उपयोग करना चाहता था? मैं सभी संदेशों को चालू करने के साथ शुरू करूंगा (E_ALL में त्रुटि रिपोर्टिंग सेटिंग)। अगर मुझे लगता है कि PHP मुझे यह नहीं बताता कि मुझे त्रुटि संदेशों में क्या चाहिए, तो शायद यह देखने के लिए कि मैं वास्तव में क्या चल रहा हूं, प्रॉक्सी दृष्टिकोण का उपयोग करता हूं।

<?php 
var_dump($_POST); 
var_dump($_GET); 
var_dump($_SERVER); 

जैसे एक स्थानीय PHP पृष्ठ पर लक्ष्य यूआरएल को बदलना एक तरीका है। एक और तरीका है पोर्ट 80 पर netcat की तरह एक उपयोगिता का उपयोग सुनने के लिए और वहाँ अनुरोध भेजने के लिए है:

netcat -l -p 80 

यह कर्ल करने के लिए कुछ भी वापस नहीं होगा, लेकिन यह आप को देखने के लिए वास्तव में क्या सर्वर से भेजा जाता है की अनुमति देगा, जो समस्या का निदान करने के लिए पर्याप्त हो सकता है।

आप apache_request_headers() फ़ंक्शन का उपयोग कर PHP से शीर्षलेख पुनर्प्राप्त भी कर सकते हैं। ज्यादातर मामलों में मैं नेटकैट दृष्टिकोण पसंद करता हूं, हालांकि, यह गारंटी देता है कि मैं असम्बद्ध सत्य देखता हूं, और कच्चे पोस्ट डेटा को भी प्रदर्शित करता हूं।

+0

धारा पुस्तकालय के बारे में बहुत बात है कि कोई आवश्यकता नहीं। क्या फॉरेन यूआरएल रैपर बंद होने पर स्ट्रीम फ़ंक्शन उपलब्ध हैं? –

+0

धारा फ़ंक्शंस संभवतः उपलब्ध हैं, लेकिन उदाहरण के लिए मैंने जो लिंक जोड़ा है, उसे अभी भी fopen() का उपयोग करके वास्तविक कनेक्शन की आवश्यकता होती है, जिसका अर्थ है कि यह allow_url_fopen बंद होने के साथ काम नहीं करेगा। यदि ऐसा है तो आप कर्ल का उपयोग करने के लिए बर्बाद हो जाते हैं। व्यक्तिगत रूप से, मैं इसे हमेशा चालू करता हूं, और गलतियों को टालने से बचता हूं जो शुरुआत से सुरक्षा समस्या में यूआरएल फॉपेन को बदल देते हैं। :) –

+0

मुझे निश्चित रूप से स्ट्रीम एपीआई पसंद है। एक साइड नोट के रूप में: PHP (या कर्ल एक्सटेंशन) को कुछ यूआरएल रैपर के लिए हैंडलर के रूप में कर्ल का उपयोग करने के लिए संकलित किया जा सकता है। – VolkerK

संबंधित मुद्दे