4

我正在使用 curl_multi 函数来请求多个 URL 并在它们完成时对其进行处理。当一个连接完成时,我真正拥有的只是来自curl_multi_info_read().

URL 来自作业队列,一旦处理完毕,我需要从队列中删除作业。我不想依赖 URL 来识别工作(不应该有重复的 URL,但是如果有的话怎么办

到目前为止,我研究的解决方案是使用 cURL 句柄作为指向 jobid 的数组键。形成我能说的,当被视为字符串时,句柄类似于:

"Resource id #1"

这对我来说相当独特。基本代码是:

$ch = curl_init($job->getUrl());
$handles[$ch] = $job;
//then later
$done = curl_multi_info_read($master);
$handles[$done['handle']]->delete();
curl_multi_remove_handle($master, $done['handle']);

以这种方式使用 cURL 句柄是否安全?

或者有没有更好的方法将 cURL 句柄映射到创建它们的作业?

4

3 回答 3

8

将私有数据存储在 cURL 简单句柄中,例如一些作业 ID:

curl_setopt($ch, CURLOPT_PRIVATE, $job->getId());
// then later
$id = curl_getinfo($done['handle'], CURLINFO_PRIVATE);

PHP 手册中没有(还)记录这个“私有数据”特性。它已在 PHP 5.2.4 中引入。它允许您在 cURL 句柄中存储和检索您选择的字符串。将其用作唯一标识作业的密钥。

编辑:功能现在记录在 PHP 手册中(在页面内搜索CURLOPT_PRIVATE)。

于 2014-10-11T15:38:24.603 回答
2

由于一些隐式类型转换,它可能会起作用,但我觉得它根本不对。我认为它在某处乞求麻烦,未来的版本会以不同的方式对待资源,不同的平台......

我个人不会这样做,但使用数字索引。

于 2010-02-11T15:57:48.643 回答
2

我必须同意 Pekka 的观点……它可能会起作用,但它闻起来很臭。id 使用 Pekka 建议的直接整数或将句柄包装在一个简单的类中,然后使用或让构造函数在设置时spl_object_hash生成 a 。uniqid

于 2010-02-11T16:05:52.933 回答