PHP - Debugging Curl

211

Saya ingin melihat bidang pos dalam permintaan itu sebelum saya mengirimnya. (Untuk tujuan debugging).

Perpustakaan PHP (kelas) yang saya gunakan sudah dibuat (bukan oleh saya), jadi saya mencoba memahaminya.

Sejauh yang saya tahu, digunakan curl_setopt()untuk mengatur opsi yang berbeda seperti header dan semacamnya dan kemudian digunakan curl_exec()untuk mengirim permintaan.

Gagasan tentang cara melihat bidang pos apa yang sedang dikirim?

Matius
sumber

Jawaban:

175

Anda dapat mengaktifkan CURLOPT_VERBOSEopsi:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Ketika CURLOPT_VERBOSEdiatur, output ditulis ke STDERR atau file yang ditentukan menggunakan CURLOPT_STDERR. Outputnya sangat informatif.

Anda juga dapat menggunakan tcpdump atau wireshark untuk menonton lalu lintas jaringan.

netom
sumber
16
Perlu dicatat bahwa ini tidak akan bekerja jika Anda telah menetapkan CURLINFO_HEADER_OUTuntuk TRUE. Sejauh yang saya tahu ...
Mike
400

Anda dapat mengaktifkan CURLOPT_VERBOSEopsi dan mencatat informasi itu ke (sementara) 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);

Anda kemudian dapat membacanya setelah ikal telah melakukan permintaan:

$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";

(Saya awalnya menjawab yang serupa tetapi lebih luas dalam pertanyaan terkait.)

Informasi lebih lanjut seperti metrik tentang permintaan terakhir tersedia melalui curl_getinfo. Informasi ini dapat berguna untuk men-debug permintaan curl juga. Contoh penggunaan, saya biasanya membungkusnya menjadi fungsi:

$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;
hakre
sumber
2
Opsi fopen harus 'w +'
iisisrael
1
@ iisisrael: Anda benar. Dikoreksi. Terima kasih atas petunjuknya.
hakre
Namun, sebelum Anda beralih ke debugging: Coba periksa log apache kalau-kalau ada kesalahan dilemparkan (seperti php curl tidak diinstal, jadi fungsinya gagal!)
TheSatinKnight
60

Berikut adalah kode yang lebih sederhana untuk hal yang sama:

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

di mana $ fp adalah pegangan file untuk menghasilkan kesalahan. Sebagai contoh:

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

(Baca di http://curl.haxx.se/mail/curlphp-2008-03/0064.html )

Mario S
sumber
Saya ingin menggunakan jawaban @ Michaël-R- tapi saya tidak mendapatkan verbose di log PHP. Masuk ke file baru seperti ini berhasil.
Jono
29

Inilah cara yang bahkan lebih sederhana, dengan menulis langsung ke output kesalahan php

curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_STDERR, fopen('php://stderr', 'w'));
Michaël R
sumber
22

Untuk mendapatkan informasi permintaan CURL, lakukan ini:

$response = curl_exec($ch);

$info = curl_getinfo($ch);
var_dump($info);
Andrew
sumber
Untuk respons "setelah", curl_getinfo sangat bagus tetapi untuk url yang salah bentuk, misalnya getinfo mengembalikan non info, pilih CURLOPT_VERBOSE yang lebih baik misalnya
girorme
1

Keluarkan info debug ke 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);

Keluarkan info debug ke file:

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

Lihat https://github.com/andriichuk/php-curl-cookbook#debug-request

Serhii Andriichuk
sumber
1

Jika Anda hanya ingin cara yang sangat cepat untuk men-debug hasilnya:

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

Opsi (kasar) lainnya adalah menggunakan netcat untuk membuang permintaan penuh:

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

Dan tentu saja mengirimkan permintaan yang gagal ke sana:

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

Khususnya itu akan selalu hang + gagal, karena netcat tidak akan pernah membangun respons HTTP yang valid. Ini benar-benar hanya untuk memeriksa apa yang benar-benar dikirim. Opsi yang lebih baik, tentu saja, menggunakan layanan debug permintaan http .

mario
sumber