<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// The following is a PHP code example unrelated to the article content</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Welcome to PHP Tools!\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">"Current time: <span class="hljs-subst">$time</span>\n";</span></span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
In PHP, the curl_multi_* functions allow concurrent HTTP requests, improving request efficiency. However, in real-world development, curl_multi_remove_handle() sometimes fails. This article analyzes common causes and provides quick troubleshooting and solutions.
curl_multi_remove_handle() is used to remove a single cURL handle from a multi-handle:
<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>("https://example.com");
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>("https://example.org");
<p></span>curl_multi_add_handle($mh, $ch1);<br>
curl_multi_add_handle($mh, $ch2);</p>
<p>// Execute requests<br>
</span>$running = null;<br>
do {<br>
curl_multi_exec($mh, $running);<br>
} while ($running > 0);</p>
<p>// Remove handles<br>
</span>curl_multi_remove_handle($mh, $ch1);<br>
curl_multi_remove_handle($mh, $ch2);</p>
<p>// Close handles<br>
</span>curl_multi_close($mh);<br>
curl_close($ch1);<br>
curl_close($ch2);<br>
</span>
If curl_multi_remove_handle() fails, it usually returns FALSE.
Handle not added to multi-handle
Only cURL handles that have been added with curl_multi_add_handle() can be removed. If a handle was never added or has already been removed, calling curl_multi_remove_handle() will fail.
Removing handle multiple times
A cURL handle can only be removed from a multi-handle once. Repeated calls will cause failure.
Multi-handle already closed
If curl_multi_close() has been executed before calling curl_multi_remove_handle(), the multi-handle is destroyed, and child handles cannot be removed.
cURL execution not properly stopped
If the multi-execution loop (curl_multi_exec) is still running, attempting to remove handles may fail. It is recommended to ensure $running equals 0 first.
Corrupted resources or invalid handles
If a cURL handle has been unexpectedly closed or invalidated, removal will fail. This often occurs in error handling or improper resource management.
Confirm handle is added to multi-handle
Before calling curl_multi_remove_handle(), you can keep track of added handles:
<span><span><span class="hljs-variable">$handles</span></span> = [];
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span>($mh, $ch1);
</span><span>$handles[] = $ch1;
</span></span>
Ensure multi-handle is still valid
Perform removal before calling curl_multi_close().
Wait for all requests to complete
Check in a loop that $running equals 0 before removing handles.
<span><span><span class="hljs-keyword">do</span></span> {
</span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span>($mh, $running);
} </span><span><span class="hljs-keyword">while</span> ($running > 0);
<p></span>curl_multi_remove_handle($mh, $ch1);<br>
</span>
Check return values and error messages
If it returns FALSE, use curl_error($ch) or curl_multi_errno($mh) to get detailed error information.
Debug logs
For complex concurrent requests, use logs to track the order of handle addition and removal to avoid repeated removals or removal before addition.
Ensure each cURL handle is added once and removed once.
Ensure the multi-execution loop has finished before removing handles.
Do not remove child handles after closing the multi-handle.
Use debug logs to track handle status for quick problem identification.
For exceptions or corrupted resources, reinitialize the handle before retrying.
By following these methods, you can effectively reduce curl_multi_remove_handle() failures and improve the stability and maintainability of PHP concurrent requests.