我正在使用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句柄映射到创建它们的作业吗?
答案 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
。