Ant*_*ore 4 php curl deprecated
do {
$mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)
还有其他选择吗?卷曲版本7.27.0
Sud*_*oti 10
尝试像:
do {
$mrc = curl_multi_exec($mc, $active);
} while ($active > 0);
Run Code Online (Sandbox Code Playgroud)
tho*_*ter 10
您应该保持代码不变,因为这仍然是调用 curl_multi_exec 的最佳方式。
常数本身仍然存在;在 Curl 7.20.0 及更高版本中根本不使用它。但是,更改是以这样的方式完成的,您之前的代码根本不需要修改,并且将继续工作。
在 Curl 7.20.0 之前, curl_multi_exec 一次只处理一个任务,调用之后可能还有其他任务可以立即执行而不会阻塞。为确保完成所有这些任务,您必须执行以下操作:
do {
$mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)
所有这一切都是在没有阻塞的情况下完成的,因为 CURLM_CALL_MULTI_PERFORM 仅在其他任务准备好完成时才返回,并且 curl 希望您立即再次调用它。
从 7.20.0 开始,Curl 意识到这很愚蠢,并且如果 curl_multi_exec(实际上是上游 curl 中的curl_multi_perform)需要一次做不止一件事,它应该在返回之前自己做所有事情。
因此,它不再需要返回 CURLM_CALL_MULTI_PERFORM。
今天,等价于上面的代码很简单,
curl_multi_exec($mc, $active);
Run Code Online (Sandbox Code Playgroud)
您不需要检查结果是否为 CURLM_CALL_MULTI_PERFORM 并再次调用该函数。
但是,为了同时支持旧版本和新版本的 Curl,您仍然需要检查返回码:
do {
$mrc = curl_multi_exec($mc, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
Run Code Online (Sandbox Code Playgroud)
这正是您之前所做的。
为此,CURLM_CALL_MULTI_PERFORM 仍然作为符号存在。所以,让你的代码保持原样,新旧 Curl 一切都会好起来的。
为什么使用 $active 不一样
引用的第二个参数,在本例中为 $active,不能以同样的方式处理。$active 将始终返回 true,直到所有正在进行的 HTTP 请求都终止,无论是否有任何准备好立即处理的内容。因此,它不能用作您应该再次调用 curl_multi_exec 的指示符。它仅表明您希望将来对连接采取进一步措施。
使用 curl_multi 接口的通常原因是,您可以以非阻塞方式执行 HTTP 请求,以便您可以在等待发送或接收数据的同时执行其他任务 - 或者至少,因此您可以管理多个请求并在每个请求返回后立即处理。为了实现这一点,您将 curl_multi_exec 作为循环的一部分调用。如果有一些数据需要发送或接收, curl_multi_exec 会这样做。如果没有任何东西可以处理而您只是在等待,那么它什么都不做。在循环的其余部分,您可以完成其他任务和/或对 curl_multi_info_read 做出反应,指示其中一个请求已完成。
但是,如果您要执行以下操作
// Do NOT do this
do {
$mrc = curl_multi_exec($mc, $active);
} while ($active);
Run Code Online (Sandbox Code Playgroud)
...然后,此循环将永远不会退出,直到所有挂起的 HTTP 请求终止,从而以阻塞方式运行,并且永远不会让您在等待时处理其他任务。
| 归档时间: |
|
| 查看次数: |
5012 次 |
| 最近记录: |