PHP - डीबगिंग कर्ल


210

मैं यह देखना चाहता हूं कि मुझे भेजने से पहले अनुरोध में पोस्ट फ़ील्ड क्या हैं। (डिबगिंग उद्देश्यों के लिए)।

PHP लाइब्रेरी (क्लास) जो मैं उपयोग कर रहा हूं वह पहले से ही (मेरे द्वारा नहीं) बनाया गया है, इसलिए मैं इसे समझने की कोशिश कर रहा हूं।

जहां तक ​​मैं बता सकता हूं, यह curl_setopt()हेडर और इस तरह के विभिन्न विकल्पों को सेट करने के लिए उपयोग करता है और फिर curl_exec()अनुरोध भेजने के लिए इसका उपयोग करता है।

कैसे पोस्ट फ़ील्ड भेजे जा रहे हैं देखने के लिए पर विचार?


जवाबों:


174

आप CURLOPT_VERBOSEविकल्प को सक्षम कर सकते हैं :

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

जब CURLOPT_VERBOSEसेट किया जाता है, तो आउटपुट को STDERR या फ़ाइल का उपयोग करके निर्दिष्ट किया जाता है CURLOPT_STDERR। आउटपुट बहुत जानकारीपूर्ण है।

नेटवर्क ट्रैफ़िक देखने के लिए आप tcpdump या wirehark का भी उपयोग कर सकते हैं।


16
यह ध्यान देने योग्य है कि अगर आपने सेट CURLINFO_HEADER_OUTकिया है तो यह काम नहीं करेगा TRUE। अब तक मैं बता सकता हूँ ...
माइक

399

आप CURLOPT_VERBOSEविकल्प को सक्षम कर सकते हैं और उस जानकारी को (अस्थायी) लॉग कर सकते हैं CURLOPT_STDERR:

// CURLOPT_VERBOSE: TRUE to output verbose information. Writes output to STDERR, 
// or the file specified using CURLOPT_STDERR.
curl_setopt($handle, CURLOPT_VERBOSE, true);

$verbose = fopen('php://temp', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);

कर्ल के अनुरोध के बाद आप इसे पढ़ सकते हैं:

$result = curl_exec($handle);
if ($result === FALSE) {
    printf("cUrl error (#%d): %s<br>\n", curl_errno($handle),
           htmlspecialchars(curl_error($handle)));
}

rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";

(मैंने मूल रूप से संबंधित प्रश्न में समान लेकिन अधिक विस्तारित उत्तर दिया है।)

अंतिम अनुरोध के बारे में मीट्रिक जैसी अधिक जानकारी उपलब्ध है curl_getinfo। यह जानकारी कर्ल अनुरोधों को डीबग करने के लिए भी उपयोगी हो सकती है। एक उपयोग उदाहरण, मैं सामान्य रूप से एक फ़ंक्शन में लपेटूंगा:

$version = curl_version();
extract(curl_getinfo($handle));
$metrics = <<<EOD
URL....: $url
Code...: $http_code ($redirect_count redirect(s) in $redirect_time secs)
Content: $content_type Size: $download_content_length (Own: $size_download) Filetime: $filetime
Time...: $total_time Start @ $starttransfer_time (DNS: $namelookup_time Connect: $connect_time Request: $pretransfer_time)
Speed..: Down: $speed_download (avg.) Up: $speed_upload (avg.)
Curl...: v{$version['version']}
EOD;

2
fopen ऑप्शन 'w +' होना चाहिए
iisisrael

1
@ आईसिसरेल: आप सही कह रहे हैं। सही किया। संकेत के लिए धन्यवाद।
हकरे

इससे पहले कि आप डिबगिंग में कूदें, हालाँकि: यदि कोई त्रुटि (जैसे कर्ल php स्थापित नहीं हो रहा है, तो फंक्शन विफल हो गया) तो अपाचे लॉग की जाँच करने का प्रयास करें!
TheSatinKnight

59

यहाँ उसी के लिए एक सरल कोड दिया गया है:

   curl_setopt($ch, CURLOPT_VERBOSE, 1);
   curl_setopt($ch, CURLOPT_STDERR, $fp);

जहां $ fp आउटपुट त्रुटियों के लिए एक फ़ाइल हैंडल है। उदाहरण के लिए:

   $fp = fopen(dirname(__FILE__).'/errorlog.txt', 'w');

( Http://curl.haxx.se/mail/curlphp-2008-03/0064.html पर पढ़ें )


मैं @ Michaël-R- के उत्तर का उपयोग करना पसंद करूंगा, लेकिन मुझे PHP लॉग में वर्बोज़ नहीं मिला। इस तरह काम करने के लिए एक नई फ़ाइल में लॉग इन करें।
जोनो

28

यहाँ एक और भी सरल तरीका है, सीधे php error output लिखकर

curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));

21

सिर्फ एक CURL अनुरोध की जानकारी प्राप्त करने के लिए ऐसा करें:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);

"के बाद" कर्ल_गेटीनो की प्रतिक्रिया के लिए इसके उत्कृष्ट लेकिन विकृत यूआरएल के लिए उदाहरण के लिए गेटिनॉफ गैर-जानकारी देता है, ऑप्ट CURLOPT_VERBOSE उदाहरण के लिए बेहतर है
girorme

1

यदि आप परिणाम को डीबग करने के लिए बस एक बहुत तेज़ तरीका चाहते हैं:

$ch = curl_init();
curl_exec($ch);
$curl_error = curl_error($ch);
echo "<script>console.log($curl_error);</script>"

0

पूर्ण अनुरोध को डंप करने के लिए नेटकैट का उपयोग करने के लिए एक और (क्रूड) विकल्प है:

nc -l -p 8000 -w 3 | tee curldbg.txt

और निश्चित रूप से यह करने के लिए असफल अनुरोध भेजने:

curl_setup(CURLOPT_URL, "http://localhost/testytest");

विशेष रूप से यह हमेशा लटका + विफल रहेगा, क्योंकि netcat कभी भी एक वैध HTTP प्रतिक्रिया का निर्माण नहीं करेगा। यह वास्तव में निरीक्षण के लिए है कि वास्तव में क्या भेजा गया है। बेशक, बेहतर विकल्प http अनुरोध डीबगिंग सेवा का उपयोग कर रहा है ।


0

STDERR को आउटपुट डिबग जानकारी:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option
     */
    CURLOPT_VERBOSE => true,
]);

curl_exec($curlHandler);

curl_close($curlHandler);

फ़ाइल के लिए आउटपुट डिबग जानकारी:

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/get?foo=bar',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify debug option.
     */
    CURLOPT_VERBOSE => true,

    /**
     * Specify log file.
     * Make sure that the folder is writable.
     */
    CURLOPT_STDERR => fopen('./curl.log', 'w+'),
]);

curl_exec($curlHandler);

curl_close($curlHandler);

Https://github.com/andriichuk/php-curl-cookbook#debug-request देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.