PHPでのcurlの使用

WBOY
WBOYオリジナル
2016-07-29 09:15:061105ブラウズ

バージョンが異なると、PHP でのcurl の試用方法も異なります。確かに、curl の使用法はまだインターネット上で見つけることができますが、今日は説明がありません。みんなで見つけた情報

まず、いくつかの関数

curlm_multi_init

この関数は、他のすべての多関数への入力として使用される CURLM ハンドルを返します。この init 呼び出しはドキュメントのいくつかの場所で説明されています。 次の場合には、対応する curl_multi_cleanup への呼び出しが必要です。 操作は完了しました。

この関数は、他のすべてのマルチ関数への入力として使用される CURLM ハンドルを返します。つまり、この初期化呼び出しには対応する関数が必要です。この関数は、curl_multi_cleanup を呼び出します。操作が完了すると

curl_multi_exec

この関数は実際にcurlの基礎となるcurl_multi_perform関数を呼び出します

最も簡単な説明は次のとおりです。 ;

各簡単なハンドルから利用可能なデータを読み取り/書き込みます

中国語への翻訳は; データは各ハンドルから読み取りまたは書き込みによって取得できます

この関数は次のような処理を行います注意が必要な追加されたすべてのハンドルをノンブロッキングで転送します。

アプリケーションが multi_handle に利用可能なデータがあることを発見したとき、またはタイムアウトが経過したとき、アプリケーションはこの関数を呼び出して、必要なものすべてを読み書きする必要があります。今すぐ読み取りまたは書き込み etc.curl_multi_perform が返されます この関数は、読み取り/書き込みが完了するとすぐに、実際に読み取り可能なデータがあること、またはデータを書き込むことができることを必要としません。念のため、まだ残っているハンドルの数を書き込みます。 2番目にデータを転送します 引数の整数ポインター。

running_handles の量が前の呼び出しから変更されている場合 (または、マルチ ハンドルに追加した簡単なハンドルの量より少ない場合)、1 つ以上の転送があることがわかります。 その後、curl_multi_info_read を呼び出して、完了した各個人に関する情報を取得できます。 追加されたハンドルがすぐに失敗した場合、この関数の戻り時に running_handles

がゼロ (0) に設定されている場合、そのハンドルは running_handle としてカウントされない可能性があります。 、進行中の転送はもうありません。

この部分が実際に何を言っているか見てみましょう:この関数は、参照プログラムが処理する必要のあるデータがあることを検出したとき、またはタイムアウトになったときに、追加されたハンドル上のすべてのデータ転送を処理します。この関数は、実際に読み取りまたは書き込みが必要なデータがある必要はなく、どのような状況でもこの関数を呼び出すことができます。 、渡された 2 番目のパラメータ (running-handles) を設定します。これは、アクティブな接続が残っている数を示します

running-handles が前の呼び出しから呼び出された場合、転送が完了したか、転送が完了したことを意味します各接続の転送ステータスを確認するには、curl-multi-read-info 関数を呼び出す必要があります。詳細については、PHP ヘルプ ドキュメントを参照してください。

curl によって running-handles が 0 に設定されている場合、それはすべての転送が完了したことを意味します。

その戻り値が何なのか混乱するかもしれませんね? ?

CURLMcode タイプ、一般的な libcurl マルチ インターフェイス エラー コード。

バージョン 7.20.0 より前:

CURLM_CALL_MULTI_PERFORM

を受信した場合、 これは基本的に、他のアクションで select() を実行する前に、curl_multi_perform を再度呼び出す必要があることを意味します。 すぐに実行する必要はありませんが、戻りコードは、libcurl が返すことができるデータがさらにある可能性があること、または「満足」する前に送信するデータがさらにある可能性があることを意味します。curl_multi_perform が実行することに注意してください。 戻る

CURLM_CALL_MULTI_PERFORM

のみ 再度呼び出される場合は、

即時

を実行します。状況が良好で、すぐに実行したいことが何もない場合は、

CURLM_OK

を返します。 「アクション」を待ってから、この関数を再度呼び出す必要があります。

この関数は、マルチスタック全体に関するエラーなどを返すだけです。この関数が CURLM_OK を返した場合でも、個々の転送で問題が発生している可能性があります。 個々の転送がどのように行われたかを把握するには、curl_multi_info_read を使用します。バージョン 7.20.0 より前では、CURLM_CALL_MULTI_PERFORM を受け取った場合、処理するデータがない場合は、curl_multi_select を呼び出す前に、curl_multi_perform 関数を再度呼び出す必要があることを意味します。 action (他に適切な言葉が見つからないので、当面はアクションをアクションとして理解しましょう)、CURLM_OK が返された場合は、(注) まで待つだけで済みます。これは、呼び出したcurl_multi_selectです。値 -1 を返します。何があっても、アクションは待機しませんが、usleep の後でも、curl-multi-perform が呼び出されます。これは意味をなさないかもしれませんが、方法はありません。

curl_multi_select

まずこの関数の機能について説明しましょう

次のコードについて

while($still_running && $result==CURLM_OK)

{

do

{

$ result=curl_multi_exec($mh,$still_running);

}while($result==CURLM_CALL_MULTI_PERFORM);

}

このコードでcurl_multi_selectを使用しない場合、CPUがとんでもないことになることがわかります。テストすることができます。これは、この無意味なコードを(一定期間)呼び出し続けるため、CPU 使用効率に影響します

この関数は、PHP ヘルプドキュメントで次のように説明されています

cURL バッチまでブロックします。処理接続内のアクティブな接続

つまり、データ送信が検出されない場合はブロックされますが、次のコードは現在のバージョンでは適用されないことに注意する必要があります。

while($ Still_running && $result==CURLM_OK)

{

if(curl_multi_select($mh)!=-1)

{

do

{

$result=curl_multi_ exec($mh,$ Still_running) ;

}while($result==CURLM_CALL_MULTI_PERFORM);

}

}

このコードがデッドループに陥ってしまうのは本当に残念です 原因を辿ると、curl_multi_select が見つかります。 - 1 のみを返します。つまり、このコードを見たときに、少なくともエラーは発生しません

while($still_running && $result==CURLM_OK)

{

if(curl_multi_select($mh)==-1)

{

usleep(100);//詳細は自分で決める必要があります。は 100 ミリ秒です

}

do

{

$result=curl_multi_exec($mh,$still_running);

}while($result==CURLM_CALL_MULTI_PERFORM);

}

こうすれば、サーバーがデータを返すことを確認します。野蛮です。 高速です

curl_multi_info_read

この関数は、PHP ヘルプドキュメントで非常に明確に説明されています

バッチハンドルをクエリして、別の送信スレッドで返されたメッセージまたは情報があるかどうかを確認します。メッセージには、個々の転送スレッドから返されたエラー コードや、転送スレッドが完了したかどうかの単純なレポートなどのエラー コードが含まれる場合があります。


成功した場合は関連情報の配列を返し、失敗した場合は FALSE を返します。

FALSE

你只需要关心返回值就可以了

据我测试要存在消息,只有可能有两种情况:

1.传输已经完成了

2.传输出现错误


array(3) { ["msg"]=> int(1) ["result"]=> int(0) ["handle"]=> resource(5) of type (curl) }

这是我的结果

curl_multi_getcontent($res)

该函数就简单多了

如果设置了CURLOPT_RETURNTRANSFER気にする必要があるのは戻り値だけです

私のテストによると、メッセージがある場合、考えられる状況は次の 2 つだけです: 1. 送信が完了しました

2.送信

array( 3) { ["msg"]=> int(1) ["result"]=> int(0) ["handle"]=> タイプ(curl) }

これが私の結果です


curl_multi_getcontent($res)

この関数ははるかに単純です

🎜🎜🎜🎜CURLOPT_RETURNTRANSFERセット、リターン取得した出力のテキスト ストリーム🎜🎜🎜🎜$res パラメータは特定の CURL ハンドルであることに注意してください🎜🎜🎜🎜以下は誰にでもお勧めできる Web サイトです:🎜🎜🎜🎜http://curl.haxx.se/Hereもちろん、ユーザーとしては、curl の使用方法を知る必要があるだけです。🎜🎜🎜🎜🎜ここでは、curl_setopt のパラメータを設定する方法を紹介します。カールの謎はここにあります🎜🎜🎜🎜🎜🎜 🎜 上記では、PHP でのカールの使用法をその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。