Использование cURL Handle в качестве ключа массива
Я использую функции curl_multi для запроса нескольких URL-адресов и обработки их по мере их завершения. Когда одно соединение завершается, все, что у меня есть, - это дескриптор cURL (и связанные данные) из curl_multi_info_read()
,
URL поступают из очереди заданий, и после обработки мне нужно удалить задание из очереди. Я не хочу полагаться на URL для идентификации работы (не должно быть дублированных URL, но что, если они есть).
Решение, над которым я работал до сих пор, заключается в использовании дескриптора cURL в качестве ключа массива, указывающего на идентификатор задания. Форма, которую я могу сказать, когда рассматривается как строка, дескриптор выглядит примерно так:
"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 ответа
Это, вероятно, будет работать благодаря неявному приведению типов, но мне это не кажется правильным. Я думаю, что это напрашивается на неприятности где-то в будущем, с будущими версиями, которые по-разному относятся к ресурсам, на разных платформах...
Лично я бы этого не делал, но использовал числовые индексы.
Храните личные данные в легкой ручке 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
на странице).
Я должен согласиться с Пеккой... это, вероятно, сработает, но пахнет плохо. Идентификатор использует прямые целые числа, как предлагает Пекка, или оборачивает дескрипторы в простой класс, а затем использует spl_object_hash
или конструктор генерирует uniqid
когда его создали.