2009-05-02 12 views
12

ほとんどのPHPプログラマは、クレジットカード決済処理、悪意のあるスクリーンスクレイピング、またはその中間の処理のために、生のHTTPリクエストを送信するためにCURLを使用する必要がありました。PHP cURLの問題のトラブルシューティングにはどのような手順が必要ですか?

PHPプログラマーが集まるフォーラムは、誰でも多くの人がいます。can't get the cURL functions to do what they want

cURLが機能していない場合、どのようなトラブルシューティング手法を使用して問題が解決しないのですか? PHPのカールの実装で何が変わったの?誰かがフォーラムで「HALP MY CURL IZ BROKEN」の質問をした場合、そのリクエストがうまくいかない理由を把握するための手順は何ですか?

+0

だけヘッダを取得するためにCURLOPT_HEADERを使用..ストリームライブラリについての素晴らしい点だその機能 –

答えて

15

CURLINFO_HEADER_OUTオプションは非常に便利です。

<?php 
$curl = curl_init('http://www.php.net'); 

curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data'); 
curl_setopt($curl, CURLINFO_HEADER_OUT, true); 

curl_exec($curl); 

echo '<fieldset><legend>request headers</legend> 
    <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre> 
</fieldset>'; 

echo '<fieldset><legend>response</legend> 
    <pre>', htmlspecialchars(dbg_curl_data(null)), '</pre> 
</fieldset>'; 

function dbg_curl_data($curl, $data=null) { 
    static $buffer = ''; 

    if (is_null($curl)) { 
    $r = $buffer; 
    $buffer = ''; 
    return $r; 
    } 
    else { 
    $buffer .= $data; 
    return strlen($data); 
    } 
}
+0

これはポストデータでも動作しますか? C:\ xampp \ htdocs \ my_project \ login.php'でCURLOPT_WRITEFUNCTIONを呼び出せませんでした。ここで、 '$ res = curl_exec($ curl); ' – diEcho

+0

はい、POSTデータでも動作します。 curl_setopt/CURLOPT_WRITEFUNCTIONに渡した関数名が実際に関数/呼び出し可能関数に解決されないようです。 – VolkerK

+1

うわー、これは非常にきれいで効率的な解決策でした。本当にありがとう、トンを助けてくれた! – angularsen

3

実際には、私は決してCURL(php)を使用しません。 PHPストリームapiははるかに使いやすく、POSTデータにも使用できます。 Wez Furlongにはこれに関する記事があります。

私はそれを使用するのですか?私はすべてのメッセージをオンにすることから始めます(エラー報告をE_ALLに設定する)。 PHPがエラーメッセージに必要な情報を教えてくれないことが分かった場合は、実際に何が起こっているのかを見るために、おそらくプロキシアプローチを使用します。ターゲットURLを次のようなローカルPHPページに変更する:

<?php 
var_dump($_POST); 
var_dump($_GET); 
var_dump($_SERVER); 

です。もう一つの方法は、ポート80でリッスンし、そこにリクエストを送信するためのnetcatのようなユーティリティを使用することです:

netcat -l -p 80 

これは、カールには何も返さないだろうが、それはあなたがサーバー送信されます正確に何を見ることができるようになります、問題を診断するのに十分かもしれません。

apache_request_headers()機能を使用して、PHPからヘッダを取得することもできます。しかし、ほとんどの場合、私はnetcatアプローチを好みます。それは、変更されていない真実を確認し、生の投稿データを表示することを保証するからです。

+0

の必要はありません。 fopen urlラッパーがオフの場合、ストリーム関数は使用可能ですか? –

+0

ストリーム関数はおそらく利用可能ですが、私がリンクしている例では、実際の接続がfopen()を使用して行われる必要があります。つまり、allow_url_fopenを無効にしても機能しません。その場合、あなたはカールを使うことになります。個人的に、私はいつもそれをオンにし、最初からセキュリティ問題にURLをfopenに変える間違いを避ける。 :) –

+0

私は間違いなくストリームapiが好きです。注意:php(またはcurl拡張)は、いくつかのURLラッパーのハンドラーとしてcurlを使用するようにコンパイルすることができます。 – VolkerK

関連する問題