現在の位置: ホーム> 最新記事一覧> curl_multi_remove_handleコールの障害の一般的な理由は何ですか?すぐにトラブルシューティングと解決する方法は?

curl_multi_remove_handleコールの障害の一般的な理由は何ですか?すぐにトラブルシューティングと解決する方法は?

gitbox 2025-09-09

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 以下は記事の内容とは何の関係もありません PHP コードの例</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"いらっしゃいませPHPウィジェット!\n"</span></span><span>;
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"現在の時刻: <span class="hljs-subst">$time</span></span></span><span>\n";
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

PHPでは、 curl_multi_*シリーズ関数を使用して同時リクエストを実装することができ、それによりHTTP要求の効率が向上します。ただし、実際の開発では、 curl_multi_remove_handle()呼び出しが頻繁に失敗します。この記事では、一般的な原因を分析し、迅速なトラブルシューティングとソリューションを提供します。

1. curl_multi_remove_handle()の基本的な使用

curl_multi_remove_handle()は、curlマルチスレッドハンドルから単一のカールハンドルを削除するために使用されます。

 <span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://example.com"</span></span><span>);
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://example.org"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);

</span><span><span class="hljs-comment">// リクエストを実行します</span></span><span>
</span><span><span class="hljs-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// ハンドルを取り外します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);

</span><span><span class="hljs-comment">// ハンドルを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>);
</span></span>

curl_multi_remove_handle()呼び出しが失敗すると、通常はfalseが返されます。

2。通話障害の一般的な理由

  1. ハンドルはマルチハンドルに追加されていません<br> curl_multi_add_handle()を介してマルチハンドルに追加されたCurlハンドルのみを削除できます。ハンドルが追加されていないか、削除されたことがない場合、 curl_multi_remove_handle()を呼び出すと失敗します。

  2. ハンドルを繰り返します<br> 同じカールハンドルは、マルチハンドルから1回のみ削除できます。複数の呼び出しが障害を引き起こします。

  3. マルチハンドルが閉じられています<br> curl_multi_close ()がcurl_multi_remove_handle()を呼び出す前に実行された場合、マルチハンドルが破壊されるため、クローンハンドルを削除できません。

  4. 実行中にカールが正しく停止しません<BR> Multi-Execループ( curl_multi_exec )が完了していないか、まだ実行されていない場合、ハンドルを取り外そうとすると故障する可能性があります。通常、 $ runningが最初に0であることを確認することをお勧めします。

  5. 破損したリソースまたは無効なハンドル<br> カールハンドルが予期せず閉じたり無効になっている場合、除去を故障させる可能性もあります。これは、多くの場合、例外処理またはエラーリソース管理で発生します。

3。迅速な検査方法

  1. ハンドルがマルチに追加されていることを確認します
    curl_multi_remove_handle()を呼び出す前に、追加されたハンドルを記録できます。

     <span><span><span class="hljs-variable">$handles</span></span><span> = [];
    </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
    </span><span><span class="hljs-variable">$handles</span></span><span>[] = </span><span><span class="hljs-variable">$ch1</span></span><span>;
    </span></span>
  2. 複数のハンドルがまだ有効であることを確認してください<br> curl_multi_close()を呼び出す前に、削除操作を実行します。

  3. すべてのリクエストが完了するのを待ちます<br> ループを使用して、 $ runningが0かどうかを確認し、ハンドルを取り外します。

     <span><span><span class="hljs-keyword">do</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
    } </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);
    
    </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
    </span></span>
  4. 返された値とエラーメッセージを確認してください<br> falseが返された場合、 curl_error($ ch)またはcurl_multi_errno($ mh)を介して特定のエラー情報を取得できます。

  5. デバッグログ<br> 複雑な同時リクエストでは、ハンドルが追加および削除される順序を使用してレコードを記録して、追加せずに繰り返し削除または削除を避けることができます。

4。戦略の概要を解決します

  • 常に各カールハンドルが1回だけ追加され、1回削除されていることを確認してください。

  • ハンドルを削除する前に、マルチ実行ループが終了したことを確認してください。

  • マルチハンドルを閉じた後、クローンハンドルを取り外さないでください。

  • デバッグロギングハンドルステータスを使用して、問題の迅速な場所を容易にします。

  • 例外やリソースの破損に遭遇した場合は、ハンドルを再発達して試してみることができます。

上記の方法に従うことにより、 curl_multi_remove_handle()コールの故障を効果的に削減でき、PHP並行要求の安定性と保守性を改善できます。