Использование 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 когда его создали.

Другие вопросы по тегам