Я разработчик twittertrend.net, мне было интересно, есть ли более быстрый способ получить заголовки URL-адреса, кроме curl_multi? Я обрабатываю более 250 URL-адресов в минуту, и мне нужен действительно быстрый способ сделать это с точки зрения PHP. Можно использовать либо сценарий bash, а затем выводить заголовки, либо приложение C, что-нибудь, что может быть быстрее? В основном я программировал только на PHP, но я могу учиться. В настоящее время CURL_MULTI (с предоставлением 6 URL-адресов одновременно, работает нормально, но я бы предпочел что-то более быстрое? В конечном итоге я хотел бы придерживаться PHP для хранения и обработки любых MySQL.
Спасибо, Джеймс Хартиг






Самый простой способ получить заголовки URL-адреса - использовать get_headers (). Что касается производительности, я не думаю, что вы можете превзойти curl_multi, но попробуйте протестировать его и убедитесь. Сложно сказать.
Если вы не против заняться действительно низкоуровневыми вещами, вы можете отправлять конвейерные необработанные запросы HTTP 1.1, используя функции сокета.
Было бы полезно узнать, где узкое место в том, что вы сейчас используете - сеть, процессор и т. д.
re: threading-via-bash-script, это возможно, но маловероятно: накладные расходы на создание процесса для такого сценария, вероятно, убьют скорость.
Если это импорт для вас, запустите демон, который ничего не делает, кроме такого разрешения, а затем подключитесь к демону локально. Затем вы можете поработать над тем, чтобы этот демон работал как можно быстрее, на C или C++ или на чем-то еще.
curl_multi + эти параметры, вероятно, ваш лучший выбор:
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_NOBODY, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
Единственным другим вариантом может быть использование wget с
--server-response
а затем многопоточность с использованием C / C++, Java и т. д. Я не уверен, что в конечном итоге это будет более быстрый вариант.
Хорошо, я понял следующее: get_headers = 0,0606 секунды на URL cURL = 0,01235 на URL gethostbynamel = 0,001025 сек на URL
Что я собираюсь сделать, так это сначала запустить gethostbynamel (), а затем cURL, это должно сократить время, потому что он все время будет разрешать хост, и, таким образом, cURL никогда не будет зависать при загрузке URL-адреса.
Есть возражения?
Я думаю, вам нужен многопроцессорный демон получения URL-адресов. PHP не поддерживает многопоточность, но ничто не мешает вам запустить несколько процессов демона PHP.
При этом отсутствие в PHP надлежащего сборщика мусора означает, что длительные процессы могут вызывать утечку памяти.
Запустите демон, который порождает множество экземпляров (настраиваемое, но контролируемое число) программы php, которая, конечно же, должна быть способна читать рабочую очередь, извлекать URL-адреса и записывать результаты в манере, которая является множественной. безопасный процесс; несколько процедур не должны в конечном итоге пытаться выполнять одну и ту же работу.
Вам нужно, чтобы все это работало автономно как демон, а не с веб-сервера. Действительно.
Недавно я написал в блоге сообщение о том, как ускорить работу curl_multi. Обычно я обрабатываю каждый запрос, как только он завершается, и использую очередь для одновременного выполнения большого количества запросов. Я добился больших успехов с этой техникой и использую ее для обработки ~ 6000 RSS-каналов в минуту. Надеюсь, это поможет!
http://onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/
Хорошо, я сначала рассмотрю идею демона, чтобы увидеть, смогу ли я добраться куда-нибудь быстрее. Возможно, мне придется остаться с curl_multi. Другая проблема заключается в том, что я не могу получить время подключения или что-либо еще из curl_multi, только ответ.