PHP - Gỡ lỗi Curl


210

Tôi muốn xem các trường bài trong yêu cầu là gì trước khi tôi gửi nó. (Đối với mục đích gỡ lỗi).

Thư viện PHP (lớp) tôi đang sử dụng đã được tạo (không phải bởi tôi), vì vậy tôi đang cố gắng hiểu nó.

Theo như tôi có thể nói, nó sử dụng curl_setopt()để đặt các tùy chọn khác nhau như tiêu đề và sau đó nó sử dụng curl_exec()để gửi yêu cầu.

Ý tưởng về cách xem trường bài nào đang được gửi?


Câu trả lời:


174

Bạn có thể kích hoạt CURLOPT_VERBOSEtùy chọn:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Khi CURLOPT_VERBOSEđược đặt, đầu ra được ghi vào STDERR hoặc tệp được chỉ định bằng cách sử dụng CURLOPT_STDERR. Đầu ra rất nhiều thông tin.

Bạn cũng có thể sử dụng tcpdump hoặc wireshark để xem lưu lượng mạng.


16
Điều đáng chú ý là điều này sẽ không hoạt động nếu bạn đã đặt CURLINFO_HEADER_OUTthành TRUE. Theo như tôi có thể nói ...
Mike

399

Bạn có thể bật CURLOPT_VERBOSEtùy chọn và đăng nhập thông tin đó vào (tạm thời) 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);

Sau đó, bạn có thể đọc nó sau khi curl đã thực hiện yêu cầu:

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

(Ban đầu tôi trả lời tương tự nhưng mở rộng hơn trong một câu hỏi liên quan.)

Thông tin thêm như số liệu về yêu cầu cuối cùng có sẵn thông qua curl_getinfo. Thông tin này cũng có thể hữu ích để gỡ lỗi các yêu cầu curl. Một ví dụ sử dụng, tôi thường sẽ bọc nó thành một hàm:

$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
tùy chọn fopen phải là 'w +'
iisisrael

1
@iisisrael: Bạn nói đúng. Đã sửa. Cảm ơn đã gợi ý.
hakre

Tuy nhiên, trước khi bạn nhảy vào gỡ lỗi: Hãy thử kiểm tra nhật ký apache trong trường hợp có lỗi xảy ra (như curl php không được cài đặt, vì vậy chức năng không thành công!)
TheSatinKnight

59

Đây là một mã đơn giản hơn cho cùng:

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

trong đó $ fp là một tệp xử lý các lỗi đầu ra. Ví dụ:

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

(Đọc trên http://curl.haxx.se/mail/curlphp-2008-03/0064.html )


Tôi muốn sử dụng câu trả lời của @ Michaël-R- nhưng tôi không nhận được sự dài dòng trong nhật ký PHP. Đăng nhập vào một tập tin mới như thế này tho.
Jono

28

Đây là một cách thậm chí đơn giản hơn, bằng cách viết trực tiếp vào đầu ra lỗi php

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

21

Để nhận thông tin về yêu cầu CURL, hãy làm điều này:

$response = curl_exec($ch);

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

Đối với phản hồi "sau", curl_getinfo xuất sắc nhưng đối với các url không đúng định dạng, ví dụ getinfo trả về thông tin không, hãy chọn CURLOPT_VERBOSE, ví dụ tốt hơn
girorme

1

Nếu bạn chỉ muốn một cách rất nhanh để gỡ lỗi kết quả:

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

0

Một tùy chọn (thô) khác là sử dụng netcat để từ bỏ yêu cầu đầy đủ:

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

Và tất nhiên gửi yêu cầu thất bại đến nó:

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

Đáng chú ý là điều đó sẽ luôn bị treo + thất bại, vì netcat sẽ không bao giờ xây dựng phản hồi HTTP hợp lệ. Nó thực sự chỉ để kiểm tra những gì thực sự được gửi. Tất nhiên, tùy chọn tốt hơn là sử dụng dịch vụ gỡ lỗi yêu cầu http .


0

Thông tin gỡ lỗi đầu ra cho 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);

Thông tin gỡ lỗi đầu ra để tập tin:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.