16

サーバー上のいくつかのcURLエラーをデバッグしようとしていますが、STDERRログを確認したいと思います。現在、エラーについて確認できるのは「エラーコード:7」であり、ターゲットサーバーに接続できません。ホストに連絡し、必要なポートを開くための特別なルールを作成しました。当面は証明書を無視します。

それでも接続できません。これをデバッグする必要がありますが、自分の側に関連する情報が表示されません。

「VERBOSE」と「STDERR」という行が最も重要だと思います。$curl_logには何も書き込まれません。私は何が間違っているのですか?マニュアルロジックに従って、これは正しいはずです...

使用中のPHP:

<?php
$curl = curl_init();
$curl_log = fopen("curl.txt", 'w');
$url = "http://www.google.com";

curl_setopt_array($curl, array(
    CURLOPT_URL             => $url,        // Our destination URL
    CURLOPT_VERBOSE         => 1,           // Logs verbose output to STDERR
    CURLOPT_STDERR          => $curl_log,   // Output STDERR log to file
    CURLOPT_SSL_VERIFYPEER  => 0,           // Do not verify certificate
    CURLOPT_FAILONERROR     => 0,           // true to fail silently for http requests > 400
    CURLOPT_RETURNTRANSFER  => 1            // Return data received from server
));

$output = fread($curl_log, 2048);
echo $output; // This returns nothing!
fclose($curl_log);

$response = curl_exec($curl);
//...restofscript...
?>

PHPマニュアルから:http://php.net/manual/en/function.curl-setopt.php

CURLOPT_VERBOSE TRUEは、詳細情報を出力します。出力をSTDERRCURLOPT_STDERRに書き込みます 。STDERRの代わりにエラーを出力するための代替の場所。

これもアクセス許可の問題ではありません。サーバー側でファイルとスクリプトのアクセス許可を777に設定し、ローカルクライアントはWindowsであり、アクセス許可の設定を気にしませんでした(とにかく開発者専用です)。

4

6 に答える 6

12

あなたはあなたの例でいくつかの間違いを犯しています:

1)アクションを実行しないcurl_exec()ため、「詳細ログ」から読み取る前に呼び出す必要があります。そのため、curl_exec()の前に何もログに記録できません。curl_setopt()

2)書き込み専用で開いている$curl_log = fopen("curl.txt", 'w');ため、ファイルに書き込んで内部ファイルポインタを巻き戻した後でも、何も読み取ることができませんでした。

したがって、正しい短縮コードは次のようになります。

<?php
$curl = curl_init();
$curl_log = fopen("curl.txt", 'rw'); // open file for READ and write
$url = "http://www.google.com";

curl_setopt_array($curl, array(
    CURLOPT_URL             => $url,
    CURLOPT_VERBOSE         => 1,
    CURLOPT_STDERR          => $curl_log,
    CURLOPT_RETURNTRANSFER  => 1
));

$response = curl_exec($curl);

rewind($curl_log);
$output= fread($curl_log, 2048);
echo "<pre>". print_r($output, 1). "</pre>";
fclose($curl_log);

// ...

?>

注:冗長ログは2048バイトより長くなる可能性があるため、curl_exec()の後に$ curl_logを「fclose」してから、たとえばfile_get_contents()を使用してファイル全体を読み取ることができます。その場合、ポイント2)は間違いと見なされるべきではありません:-)

于 2012-12-30T02:23:14.057 に答える
9

パーティーに少し遅れましたが、このページはまだGoogleの上位に表示されているので、行きましょう。

CURLINFO_HEADER_OUTもTRUEに設定されている場合、CURLOPT_VERBOSEは何もログに記録しないようです。

これはPHPの既知のバグ(#65348)であり、理由により、修正しないことにしました。

于 2016-09-06T12:02:19.857 に答える
1

上記のすべての回答をまとめると、この関数を使用して、loggin toafileオプションを使用してCurlPostRequestを作成します。

function CURLPostRequest($url, array $post = NULL, array $options = array(), $log_file = NULL){
    $defaults = array(
            CURLOPT_POST => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_URL => $url,
            CURLOPT_FRESH_CONNECT => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_FORBID_REUSE => 1,
            CURLOPT_TIMEOUT => 4,
            CURLOPT_POSTFIELDS => http_build_query($post)
    );

    if (is_resource($log_file)){
        $defaults[CURLOPT_VERBOSE]=1;
        $defaults[CURLOPT_STDERR]=$log_file;
        $defaults[CURLINFO_HEADER_OUT]=1;
    }

    $ch = curl_init();
    curl_setopt_array($ch, ($options + $defaults));
    if( ! $result = curl_exec($ch)){
        throw new Exception(curl_error($ch));
    }

    if (is_resource($log_file)){

        $info = curl_getinfo($ch);

        if (isset($info['request_header'])){
            fwrite($log_file, PHP_EOL.PHP_EOL.'* POST Content'.PHP_EOL.PHP_EOL);
            fwrite($log_file, print_r($info['request_header'],true));
            fwrite($log_file, http_build_query($post));
        }

        fwrite($log_file, PHP_EOL.PHP_EOL.'* Response Content'.PHP_EOL.PHP_EOL);
        fwrite($log_file, $result.PHP_EOL.PHP_EOL);
    }

    curl_close($ch);
    return $result;
}

これが誰かに役立つことを願っています。

于 2014-11-18T19:50:46.927 に答える
0

関数curl_setoptのphpマニュアルから:

CURLOPT_FILE The file that the transfer should be written to. The default is STDOUT (the browser window).  
于 2012-01-15T09:50:05.077 に答える
0

あなたが置く必要があります

$output = fread($curl_log, 2048);
echo $output; // This returns nothing!
fclose($curl_log);

$response = curl_exec($curl);それ以外の場合、curlの実行中にファイルが閉じられます。

于 2012-12-28T02:39:46.200 に答える
0

私はそれを読むことができる前にファイルを閉じる必要がありました、これは私のために働きました:

$filename = 'curl.txt';
$curl_log = fopen($filename, 'w'); // open file for write (rw, a, etc didn't help)
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $curl_log);        

$result = curl_exec($ch);

fclose($curl_log);      
$curl_log = fopen($filename, 'r'); // open file for read
$output= fread($curl_log, filesize($filename));
echo $output;

(PHP 5.6.0、Apache / 2.2.15)

于 2019-03-18T16:39:18.040 に答える