Лучшая поддержка CURL с PHP и Linux

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

Спасибо Джеймс Хартиг

11.12.2008 22:15:41
7 ОТВЕТОВ
РЕШЕНИЕ

Я думаю, вам нужен многопроцессорный демон выборки URL-адресов. PHP не поддерживает многопоточность, но ничто не мешает вам создавать несколько процессов PHP-демонов.

Сказав это, отсутствие надлежащего сборщика мусора в PHP означает, что долго работающие процессы могут пропускать память.

Запустите демон, который порождает множество экземпляров (настраиваемое, но контролируемое число) программы php, которая, конечно же, должна быть способна читать рабочую очередь, извлекать URL-адреса и записывать результаты в несколько раз. процесс безопасен; несколько проков не должны заканчиваться попыткой сделать одну и ту же работу.

Вы хотите, чтобы все это работало автономно как демон, а не с веб-сервера. В самом деле.

1
12.12.2008 05:27:09

Самый простой способ получить заголовки URL-адреса с помощью get_headers () . С точки зрения производительности, я не думаю, что вы можете победить curl_multi, но попробуйте сравнить его и посмотреть. Сложно сказать.

1
11.12.2008 22:32:18

Если вы не против того, чтобы заниматься действительно низкоуровневыми вещами, вы можете отправлять конвейерные необработанные запросы HTTP 1.1, используя функции сокетов.

Было бы полезно узнать, где находится узкое место в том, что вы сейчас используете - сеть, процессор и т. Д.

0
11.12.2008 22:29:53

re: threading-via-bash-script, это возможно, но маловероятно: накладные расходы на создание процесса для такого сценария, вероятно, убьют скорость.

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

1
11.12.2008 22:32:52

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 и т. д. Я не уверен, что в конечном итоге это будет более быстрый вариант.

1
11.12.2008 22:36:09
Хорошо, я сначала изучу идею демона, чтобы увидеть, смогу ли я добраться куда-нибудь быстрее. Возможно, мне придется остаться с curl_multi. Другая проблема заключается в том, что я не могу получить время соединения или что-то еще из curl_multi, только ответ.
James Hartig 11.12.2008 22:38:26

Хорошо, я выяснил следующее: get_headers = .0606 с на URL cURL = .01235 на URL gethostbynamel = .001025 с на URL

То, что я собираюсь сделать, это сначала запустить gethostbynamel (), а затем cURL, это должно уменьшить время, потому что это будет постоянно разрешать хост, и, таким образом, cURL не придется застревать при загрузке URL.

Есть возражения?

0
12.12.2008 01:54:32

Недавно я написал сообщение в блоге о том, как ускорить curl_multi. По сути, я обрабатываю каждый запрос, как только он заканчивается, и использую очередь для одновременного выполнения большого количества запросов. У меня был хороший успех с этой техникой, и я использую ее для обработки ~ 6000 RSS-каналов в минуту. Надеюсь, это поможет!

http://onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/

2
27.01.2009 01:42:25