Использование cURL Handle в качестве ключа массива - PullRequest
4 голосов
/ 11 февраля 2010

Я использую функции curl_multi для запроса нескольких URL-адресов и обработки их по мере их завершения.Когда одно соединение завершается, все, что у меня есть, - это дескриптор cURL (и связанные данные) из 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 сработа, которая их создала?

Ответы [ 3 ]

6 голосов
/ 11 октября 2014

Храните личные данные в легкой ручке cURL, например, какой-то идентификатор работы:

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 на странице).

2 голосов
/ 11 февраля 2010

Я должен согласиться с Пеккой ... это, вероятно, будет работать, но пахнет плохо. id использует целые числа с прямым порядком, как предлагает Пекка, или оборачивает дескрипторы в простой класс, а затем использует spl_object_hash или конструктор генерирует uniqid при его установке.

2 голосов
/ 11 февраля 2010

Вероятно, это сработает благодаря неявному приведению типов, но мне оно совершенно не кажется правильным. Я думаю, что это напрашивается на неприятности где-то в будущем, с будущими версиями, которые по-разному обрабатывают ресурсы, на разных платформах ...

Лично я бы не стал этого делать, но использовал бы числовые индексы.

...