PHP 3 ベースの cURL によるクイック スタート

WBOY
リリース: 2016-06-13 13:03:27
オリジナル
843 人が閲覧しました

PHP 3 ベースの cURL によるクイックスタート

以下のコードは少し複雑なので、順を追って詳しく説明します:

以下は引用内容です:

// 1. 批处理器
$mh = curl_multi_init();
// 2. 加入需批量处理的URL
for ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
}
// 3. 初始处理
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 4. 主循环
while ($active && $mrc == CURLM_OK) {
// 5. 有活动连接
if (curl_multi_select($mh) != -1) {
// 6. 干活
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 7. 有信息否?
if ($mhinfo = curl_multi_info_read($mh)) {
// 意味着该连接正常结束
// 8. 从curl句柄获取信息
$chinfo = curl_getinfo($mhinfo['handle']);
// 9. 死链么?
if (!$chinfo['http_code']) {
$dead_urls []= $chinfo['url'];
// 10. 404了?
} else if ($chinfo['http_code'] == 404) {
$not_found_urls []= $chinfo['url'];
// 11. 还能用
} else {
$working_urls []= $chinfo['url'];
}
// 12. 移除句柄
curl_multi_remove_handle($mh, $mhinfo['handle']);
curl_close($mhinfo['handle']);
// 13. 加入新URL,干活
if (add_url_to_multi_handle($mh, $url_list)) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
}
}
// 14. 完了
curl_multi_close($mh);
echo "==Dead URLs==\n";
echo implode("\n",$dead_urls) . "\n\n";
echo "==404 URLs==\n";
echo implode("\n",$not_found_urls) . "\n\n";
echo "==Working URLs==\n";
echo implode("\n",$working_urls);
// 15. 向批处理器添加url
function add_url_to_multi_handle($mh, $url_list) {
static $index = 0;
// 如果还剩url没用
if ($url_list[$index]) {
// 新建curl句柄
$ch = curl_init();
// 配置url
curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
// 不想输出返回的内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 重定向到哪儿我们就去哪儿
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// 不需要内容体,能够节约带宽和时间
curl_setopt($ch, CURLOPT_NOBODY, 1);
// 加入到批处理器中
curl_multi_add_handle($mh, $ch);
// 拨一下计数器,下次调用该函数就能添加下一个url了
$index++;
return true;
} else {
// 没有新的URL需要处理了
return false;
}
}
ログイン後にコピー

?


上記のコードを以下に説明します。リスト内のシリアル番号は、コード コメント内の連続番号に対応します。
新しいバッチプロセッサを作成します。マルチハンドルを作成しました。
後で、URL をバッチ ハンドラーに追加する関数 add_url_to_multi_handle() を作成します。この関数が呼び出されるたびに、新しい URL がバッチ プロセッサに追加されます。最初に、10 個の URL をバッチ プロセッサに追加します (この数は $max_connections によって決まります)。
初期化作業を行うには、curl_multi_exec() を実行する必要があります。CURLM_CALL_MULTI_PERFORM が返される限り、やるべきことはまだあります。これは主に接続を作成するために行われ、完全な URL 応答を待ちません。
バッチ内にアクティブな接続がある限り、メイン ループは継続します。
curl_multi_select() は、URL クエリによってアクティブな接続が生成されるまで待機します。
cURL の役割は、主に応答データを取得するためにここでも行われます。
さまざまな情報を確認してください。 URL リクエストが完了すると、配列が返されます。
返された配列には cURL ハンドルがあります。これを使用して、単一の cURL リクエストに対応する情報を取得します。
これがデッドリンクであるか、リクエストがタイムアウトした場合、http ステータス コードは返されません。
このページが見つからない場合は、404 ステータス コードが返されます。
その他の場合は、このリンクが利用できると思います (もちろん、500 エラーなどを再度確認することもできます...)。
この cURL ハンドルをこのバッチから削除します。使用価値がないため、閉じてください。
これで、別の URL を追加できるようになりました。再び初期化作業が始まります...
さて、やるべきことはすべて終わりました。バッチ プロセッサを閉じて、レポートを生成します。
バッチプロセッサに新しい URL を追加する関数を振り返ってください。この関数が呼び出されるたびに、静的変数 $index がインクリメントされるため、処理すべき URL がいくつ残っているかがわかります。

このスクリプトをブログで実行しました (テストの必要があり、いくつかの間違ったリンクが意図的に追加されました)。結果は次のとおりです。

以下は引用された内容です:

<img border="0" src="http://nettuts.s3.cdn.plus.org/534_curl/ss_4.png" />
ログイン後にコピー

?



合計約 40 の URL がチェックされましたが、所要時間は 2 秒もかかりませんでした。より多くの URL をチェックする必要がある場合、その心配を軽減する効果は想像できます。 10 個の接続を同時に開くと、速度は 10 倍になります。さらに、cURL バッチ処理のノンブロッキング機能を利用して、Web スクリプトをブロックせずに大量の URL リクエストを処理することもできます。

?

その他の便利な cURL オプション

HTTP 認証

URL リクエストに HTTP ベースの認証が必要な場合は、次のコードを使用できます:
コンテンツをクリップボードにコピー コード:

以下は引用内容です:

$url = "http://www.somesite.com/members/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 发送用户名和密码
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
// 你可以允许其重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// 下面的选项让 cURL 在重定向后
// 也能发送用户名和密码
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$output = curl_exec($ch);
curl_close($ch);
ログイン後にコピー

?


FTP アップロード

PHP には独自の FTP クラス ライブラリが付属していますが、cURL を使用することもできます:

以下は引用された内容です。

// 开一个文件指针
$file = fopen("/path/to/file", "r");
// url里包含了大部分所需信息
$url = "ftp://username:password@mydomain.com:21/path/to/new/file";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 上传相关的选项
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
// 是否开启ASCII模式 (上传文本文件时有用)
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch);
ログイン後にコピー

?


ファン ウォール テクニック

プロキシを使用して cURL リクエストを開始できます:


以下は引用された内容です:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 指定代理地址
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
// 如果需要的话,提供用户名和密码
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');
$output = curl_exec($ch);
curl_close ($ch);
ログイン後にコピー

?



コールバック関数

を使用すると、cURL は URL リクエスト中に指定されたコールバック関数を呼び出すことができます。たとえば、コンテンツまたは応答がダウンロードされたら、完全にダウンロードされるまで待つのではなく、すぐにデータの利用を開始します。


以下は引用内容です:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
curl_exec($ch);
curl_close ($ch);
function progress_function($ch,$str) {
echo $str;
return strlen($str);
}
ログイン後にコピー
?



このコールバック関数は文字列の長さを返す必要があります。そうでない場合、この関数は正しく動作しません。

URL 応答を受信するプロセス中、データ パケットが受信されている限り、この関数が呼び出されます。

まとめ

今日は、cURL ライブラリの強力な機能と柔軟な拡張性について学びました。気に入っていただければ幸いです。次回 URL リクエストを行う場合は、cURL を検討してください。

原文: Quick Start with cURL based on PHP

英語原文: http://net.tutsplus.com/tutorial%20...%20for-mastering-curl/

原著者: Burak Guzel

この記事へのリンク: http://www.blueidea.com/tech/program/2010/7348.asp
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート