PHP CURL_Multi 检查已完成句柄的状态、删除、添加、超时

标签 php multithreading curl-multi

所以我正在处理大约 3000 个链接,我正在使用curl_multi 来加速这个过程。我一次使用了 20 个简单的进程,等待所有 20 个完成,再处理 20 个以上类型的方法,但我知道这是低效的,特别是如果这 20 个链接之一需要永远下载的话。因此,我需要知道如何编写一个循环,通过在从该 url 获取内容后立即添加/删除句柄来遍历所有 3000 个链接。

我正在使用其中一些基础知识:

define('RUNATONCE', 20); // Links to process at a time

// My URL holding multi-dimensional array:
// This first dimension is about 1000 and the second dimension is 3
$allurls[0][0];

我需要能够:

1) 检查句柄何时完成,并了解该句柄属于我的多维数组中的哪个 url

2) 检索该句柄的内容,并根据该句柄的内容是否属于 $allurls[0][0],$allurls[0][1] 的一部分来分配一个进程,或者$allurls[0][2](每个过程都有不同的过程)

3) 删除该句柄并从 $allurls 添加另一个 URL,直到处理完所有链接

4) 对任何花费超过一定时间(例如 2 分钟)的 URL 进行手动超时处理(因为 CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT 不起作用正确地在curl_multi环境中(或者至少这是我基于http://curl.haxx.se/mail/curlphp-2008-06/0006.html的经验和理解)),但我还需要在我的$allurls中知道该URL是否超时...

我知道这看起来有点工作,但对于知道这一点的人来说,这不应该是那么多工作...我只是不太知道如何做到这一点的具体细节...谢谢。

最佳答案

我遇到过类似的情况,我需要验证某些 URL,我找到的两个解决方案是首先使用 pcntl 让 PHP fork 一个新进程。如果它已安装或者(这很丑陋,但不幸的是我已经解决了,因为服务器上没有安装 pcntl)使用 AJAX 来请求验证 URL 的 PHP 页面。我将超时设置为 30 秒,所以即使某些事情花费很长时间也没关系。

关于PHP CURL_Multi 检查已完成句柄的状态、删除、添加、超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990301/

相关文章:

java - 在 Java 中停止线程?

multithreading - "RuntimeError: Calling Tcl from different appartment"tkinter 和线程

php - 在 PHP 中模拟启用 cookie 的浏览器

PHP MySQLi 准备语句和获取列的子集

php - 如何从SQLite获取错误消息执行PHP

multithreading - Qt : changing the position of a widget quickly in a loop makes it unvisible for the duration of the loop.为什么?

php - 理解 php curl_multi_exec

php - 为什么 curl_multi_select 和 curl_multi_info_read 相互矛盾?

php - 如何在 Magento 核心 API 之外获取订单的送货/账单地址 ID?

php - 在 mysql 中选择登录/注销对并计算时间跨度