使用cURL句柄作为数组键

时间:2010-02-11 15:53:08

标签: php curl curl-multi

我正在使用curl_multi函数来请求多个URL并在完成时处理它们。当一个连接完成时,我真正拥有的是来自curl_multi_info_read()的cURL句柄(和相关数据)。

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句柄映射到创建它们的作业吗?

3 个答案:

答案 0 :(得分:6)

将私人数据存储在cURL easy handle中,例如一些工作ID:

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

PHP手册中尚未记录此“私有数据”功能。它已在PHP 5.2.4中引入。它允许您在cURL句柄中存储和检索您选择的字符串。将其用于唯一标识作业的密钥。

编辑:PHP手册中的功能现在为documented(在页面中搜索CURLOPT_PRIVATE)。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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