PHP CURL_Multi проверка состояния готовых дескрипторов, удаление, добавление, тайм-ауты - PullRequest
3 голосов
/ 09 августа 2011

Итак, я обрабатываю до 3000 ссылок, я использую curl_multi для ускорения процесса. Я использовал простой процесс из 20 за один раз, дождался завершения всех 20, обработал еще 20 типов методов, но я знаю, что это неэффективно, особенно если для загрузки одной из этих 20 ссылок требуется вечность. Поэтому мне нужно знать, как написать цикл, который проходит по всем 3000 ссылкам, добавляя / удаляя дескрипторы, как только я получу содержимое этого URL.

Я использую некоторые из этих основ:

define('RUNATONCE', 20); // Links to process at a time

// My URL holding multi-dimensional array:
// This first dimension is about 1000 and the second dimension is 3
$allurls[0][0];

Мне нужно уметь:

1) Проверьте, когда дескриптор сделан, и чтобы узнать, к какому URL в моем многомерном массиве принадлежит этот дескриптор

2) Извлечь содержимое этого дескриптора и назначить процесс на основе того, является ли содержимое этого дескриптора частью $allurls[0][0],$allurls[0][1] или $allurls[0][2] (разные процессы для каждого из них)

3) Удалите этот дескриптор и добавьте еще один URL из $allurls, пока все ссылки не будут обработаны

4) Обработайте ручное время ожидания для любого URL, который занимал более определенного времени, скажем, 2 минуты (потому что CURLOPT_CONNECTTIMEOUT & CURLOPT_TIMEOUT не работают должным образом в среде curl_multi (или, по крайней мере, мой опыт и понимание основаны на http://curl.haxx.se/mail/curlphp-2008-06/0006.html)), но мне также нужно знать в моем $allurls, истек ли этот URL-адрес ...

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

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Так что я понял это. Если вам нужна помощь, прокомментируйте этот ответ, и я постараюсь опубликовать соответствующий код. Это слишком много кода, чтобы публиковать здесь, хотя

0 голосов
/ 09 августа 2011

У меня была похожая ситуация, когда мне нужно было проверить определенные URL-адреса, и два решения, которые я нашел, были первыми, чтобы сделать PHP-форк новым процессом с использованием pcntl , если он установлен или (и это уродливо, но к сожалению, на этом я остановился, так как pcntl не установлен на сервере) используйте AJAX для запроса страницы PHP, которая проверяет URL. У меня установлено время ожидания 30 секунд, поэтому даже если что-то занимает много времени, это не имеет значения.

...