現在の位置: ホーム> 最新記事一覧> curl_multi_closeリクエストを閉じるときにリダイレクトされた応答を処理する方法

curl_multi_closeリクエストを閉じるときにリダイレクトされた応答を処理する方法

gitbox 2025-05-12

Curl_multi_*シリーズ関数は、同時リクエストにPHPのCurl拡張機能を使用する場合に非常に一般的です。 curl_multi_close()は、リソースをリリースし、Curlハンドルコレクションを閉じるために使用される関数です。ただし、リダイレクト(301、302など)を含む回答を扱うとき、多くの開発者が困惑する可能性があります。

この記事では、リクエストを閉じるときに重要なリダイレクト応答を失わないように、原則と実用的な観点からcurl_multi_close()を正しく使用することを教えます。

curl_multi_closeの基本的な役割を理解します

まず、 curl_multi_close($ multi_handle)の主な機能は次のとおりであることを理解する必要があります。

  • マルチハンドラーを閉じます

  • 関連するすべてのリソースを同時にリリースします

重要なヒント

  • curl_multi_close()はリソースクリーニングのみを担当し、リダイレクトを自動的に処理しません

  • リダイレクトの処理は、リクエスト実行フェーズcurl_multi_exec()の前にオプションを設定するなど)中に完了する必要があります。

  • 閉じた後、リダイレクト情報を含むリクエスト応答データを取得できなくなります。

したがって、 curl_multi_close()を呼び出す前に、すべてのリクエストが完全に実行され、必要な応答が読み取られていることを確認する必要があります。

リダイレクト応答を正しく処理します

Curlを取得してリダイレクトを正しく追跡し、閉じる前に最終的な応答を取得するには、これを行う必要があります。

  1. CURLオプションを設定して、自動フォローアップリダイレクトを可能にします。

  2. 要求を完全に実行し、必要なすべてのデータを取得します。

  3. 最後に、 curl_multi_close()が呼び出され、リソースをリリースします。

サンプルコード

<?php
// マルチハンドルプロセッサを作成します
$multiHandle = curl_multi_init();

// 個別に初期化します cURL セッション
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自動フォローアップリダイレクトを許可します
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // せいぜいフォローしてください5リダイレクション

// 将セッション添加到多句柄处理器
curl_multi_add_handle($multiHandle, $ch);

// リクエストを実行します
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > 0) {
        echo "cURL Error: " . curl_multi_strerror($status);
    }
    // アクティブな接続を待っています
    curl_multi_select($multiHandle);
} while ($running > 0);

// 閉じる前にコンテンツと情報を取得します
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);

// 印刷応答コンテンツ
echo "Final URL: " . $info['url'] . PHP_EOL;
echo "HTTP Code: " . $info['http_code'] . PHP_EOL;
echo "Response Body: " . $response . PHP_EOL;

// クリーニング
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
curl_multi_close($multiHandle);
?>

重要な解釈

  • curlopt_followlocationは、リダイレクトを自動的に処理するためにtrueに設定されています。

  • curl_multi_execが完全に実行されたら、 curl_multi_getContent()およびcurl_getinfo()を使用して最終的な応答情報を取得します。

  • curl_multi_close()は、データを完全に取得した後にのみ安全に呼ばれます。

curl_multi_close()の前にこれらの手順を正しく処理しない場合、リダイレクトされた最終応答データを取得できません。

一般的なエラーの例

これがそれを書くための間違いのある方法です:

 <?php
$multiHandle = curl_multi_init();
$ch = curl_init('https://gitbox.net/redirect-example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);

// 間違い:実行が完了していない場合は、直接閉じます
curl_multi_close($multiHandle);

$response = curl_multi_getcontent($ch); // この時点で取得したコンテンツは空または未定義の場合があります
?>

問題分析
マルチハンドルは、リクエストが完了する前に閉じられており、その後、リダイレクト応答とデータを正しく取得できなくなります。

まとめ

  • curl_multi_close()はリダイレクトを処理せず、リソースの清掃のみを担当します。

  • curlopt_followlocationを設定してリダイレクトを設定する必要があり、閉じる前にリクエスト処理が完了する必要があります。

  • curl_multi_close()の前に、必ず必要なデータを抽出してください

  • 正しい順序で(実行→コンテンツを取得→ハンドルを削除→multiを閉じる)、リクエストが完了し、データが失われないことを確認します。

これらの詳細をマスターすると、特に応答のリダイレクトに関しては、複雑な同時リクエストを簡単に処理できるようになります。