<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>
PHPでは、 curl_multi_*シリーズ関数を使用して同時リクエストを実装することができ、それによりHTTP要求の効率が向上します。ただし、実際の開発では、 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> > </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が返されます。
ハンドルはマルチハンドルに追加されていません<br> curl_multi_add_handle()を介してマルチハンドルに追加されたCurlハンドルのみを削除できます。ハンドルが追加されていないか、削除されたことがない場合、 curl_multi_remove_handle()を呼び出すと失敗します。
ハンドルを繰り返します<br> 同じカールハンドルは、マルチハンドルから1回のみ削除できます。複数の呼び出しが障害を引き起こします。
マルチハンドルが閉じられています<br> curl_multi_close ()がcurl_multi_remove_handle()を呼び出す前に実行された場合、マルチハンドルが破壊されるため、クローンハンドルを削除できません。
実行中にカールが正しく停止しません<BR> Multi-Execループ( curl_multi_exec )が完了していないか、まだ実行されていない場合、ハンドルを取り外そうとすると故障する可能性があります。通常、 $ runningが最初に0であることを確認することをお勧めします。
破損したリソースまたは無効なハンドル<br> カールハンドルが予期せず閉じたり無効になっている場合、除去を故障させる可能性もあります。これは、多くの場合、例外処理またはエラーリソース管理で発生します。
ハンドルがマルチに追加されていることを確認します
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>
複数のハンドルがまだ有効であることを確認してください<br> curl_multi_close()を呼び出す前に、削除操作を実行します。
すべてのリクエストが完了するのを待ちます<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> > </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>
返された値とエラーメッセージを確認してください<br> falseが返された場合、 curl_error($ ch)またはcurl_multi_errno($ mh)を介して特定のエラー情報を取得できます。
デバッグログ<br> 複雑な同時リクエストでは、ハンドルが追加および削除される順序を使用してレコードを記録して、追加せずに繰り返し削除または削除を避けることができます。
常に各カールハンドルが1回だけ追加され、1回削除されていることを確認してください。
ハンドルを削除する前に、マルチ実行ループが終了したことを確認してください。
マルチハンドルを閉じた後、クローンハンドルを取り外さないでください。
デバッグロギングハンドルステータスを使用して、問題の迅速な場所を容易にします。
例外やリソースの破損に遭遇した場合は、ハンドルを再発達して試してみることができます。
上記の方法に従うことにより、 curl_multi_remove_handle()コールの故障を効果的に削減でき、PHP並行要求の安定性と保守性を改善できます。