PHP - Hata Ayıklama Kıvrımı


210

İsteği göndermeden önce gönderi alanlarının ne olduğunu görmek istiyorum. (Hata ayıklama amacıyla).

Kullandığım PHP kütüphanesi (sınıf) zaten (benim tarafımdan değil) yapılmış, bu yüzden anlamaya çalışıyorum.

Anlayabildiğim kadarıyla, curl_setopt()başlıklar ve benzeri gibi farklı seçenekler ayarlamak için kullanır ve daha sonra curl_exec()isteği göndermek için kullanır .

Hangi gönderi alanlarının gönderildiğini nasıl göreceğinize dair fikirler?


Yanıtlar:


174

CURLOPT_VERBOSESeçeneği etkinleştirebilirsiniz :

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Ayarlandığında CURLOPT_VERBOSE, çıktı STDERR'a veya kullanılarak belirtilen dosyaya yazılır CURLOPT_STDERR. Çıktı çok bilgilendiricidir.

Ağ trafiğini izlemek için tcpdump veya wireshark da kullanabilirsiniz.


16
Bu ayarlamış olduğunuz değil işin eğer dikkati çekiyor CURLINFO_HEADER_OUTetmek TRUE. Anlayabildiğim kadarıyla ...
Mike

400

CURLOPT_VERBOSESeçeneği etkinleştirebilir ve bu bilgileri (geçici) olarak günlüğe kaydedebilirsiniz 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);

Daha sonra bukle isteği yaptıktan sonra okuyabilirsiniz:

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

(Başlangıçta benzer bir soruda benzer ama daha geniş cevap verdim .)

Son istekle ilgili metrikler gibi daha fazla bilgiyi adresinden edinebilirsiniz curl_getinfo. Bu bilgiler, kıvrılma isteklerinde hata ayıklamak için de yararlı olabilir. Bir kullanım örneği, ben normalde bir işlevin içine sarmak istiyorsunuz:

$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 seçeneği 'w +' olmalıdır
iisisrael

1
@iisisrael: Haklısın. Düzeltildi. İpucu için teşekkürler.
hakre

Eğer bununla birlikte, ayıklama içine atlamak önce: Bir hata içine atıldığı durumunda apache günlüğünü kontrol etmeyi deneyin (bukle php takılmamış olması gibi işlev başarısız böylece!)
TheSatinKnight

59

İşte bunun için daha basit bir kod:

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

burada $ fp hataları çıktılamak için bir dosya tanıtıcısıdır. Örneğin:

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

( Http://curl.haxx.se/mail/curlphp-2008-03/0064.html adresinde okuyun )


@ Michaël-R- cevabını kullanmak isterdim ama PHP günlüğünde ayrıntılı alamadım. Bunun gibi yeni bir dosyaya giriş yapmak tho çalıştı.
Jono

28

İşte doğrudan php hata çıktısına yazarak, daha da basit bir yol

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

22

Sadece bir CURL isteği hakkında bilgi almak için şunu yapın:

$response = curl_exec($ch);

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

Curl_getinfo'ya "after" yanıtı için mükemmel ancak hatalı biçimlendirilmiş URL'ler için örneğin getinfo bilgi içermez, CURLOPT_VERBOSE seçeneği daha iyi bir örnektir
girorme

1

Sonuçta hata ayıklamanın çok hızlı bir yolunu istiyorsanız:

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

0

Başka bir (kaba) seçenek, tüm isteği boşaltmak için netcat kullanmaktır:

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

Ve elbette, başarısız talebi ona göndermek:

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

Netcat geçerli bir HTTP yanıtı oluşturmayacağından, özellikle her zaman askıda kalır + başarısız olur. Gerçekten sadece gönderilenleri incelemek içindir. Elbette daha iyi bir seçenek, bir http istek hata ayıklama hizmeti kullanmaktır .


0

Hata ayıklama bilgilerini STDERR'a çıktılar:

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

Hata ayıklama bilgilerini dosyaya çıktılar:

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

Bkz. Https://github.com/andriichuk/php-curl-cookbook#debug-request

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.