|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64247.2012 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
30.06.2010, 17:46
|
#1
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
|
PHP Multi-threading
Кто как реализует многопоточность на пыхе?
Накидайте инфы по рабочим схемам, плиз
|
|
|
30.06.2010, 17:58
|
#2
|
Senior Member
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $94751
|
Если чето парсить - Rolling Curl
тут либа:
http://code.google.com/p/rolling-cur...ollingCurl.php
PHP код:
$rc = new RollingCurl("request_callback"); $rc->window_size = 10; //потоки
foreach ($urls as $url) { $request = new Request($url); $rc->add($request); } $rc->execute();
function request_callback($page, $info) {
//сюда чего будем делать, когда пага скачалась
}
Вроде и POST слать можно, но я не умею, example не нашел
|
|
|
30.06.2010, 18:04
|
#3
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
ТС -->
|
ТС
Спс, покурю.
Ну идеально, конечно, чтобы хуяк и запараллелить куски кода, но в принципе основной экшн на внешней активности: пост, гет...
|
|
|
30.06.2010, 19:40
|
#4
|
/dev/null
Регистрация: 16.09.2008
Адрес: Мариуполь / Украина
Сообщений: 805
Бабло: $2302714
|
А кто что использует для многопоточного постинга?
|
|
|
30.06.2010, 19:50
|
#5
|
кодер
Регистрация: 21.01.2008
Сообщений: 315
Бабло: $69585
|
Как то замерял, больше 90% времени у скриптов уходило на коннекты, так что мультикурл вполне подходит. Правда, с проксями он плохо дружит..
Паралелить код можно с помощью pcntl, но там тоже свои ньансы (надо доустановить, и ресурсы тож жрет..)
__________________
php скрипты от $25 Отзывы: 2013-2011, 2010, 2009. acя: 384 846 ноль два шесть
|
|
|
30.06.2010, 20:33
|
#6
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
|
|
|
30.06.2010, 21:19
|
#7
|
Ниибаца крутой програмер
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
|
config.php
PHP код:
// путь, где расположены скрипты
$path = '_ttp://domain.com/path/';
// число потоков
$max_threads = 20;
launcher.php
PHP код:
require_once(”config.php”);
// инициализация
$sockets = array();
$done = false;
// будем работать, к примеру с набором
// ключевых слов
$keywords = fopen(”keywords.txt”, “r”);
// приступаем к многопоточной работе
while (!$done)
{
// если обнаружен файл,
// то прекращаем выполнение скрипта
if (file_exists(”stop-file”))
die;
// если число запущенных потоков меньше
// разрешенного максимума
// то запускаем потоки еще
if ($max_threads > count($sockets))
{
if (!feof($keywords))
{
$buffer = array();
// читаем ключевое слово
// в реальности в этот массив можно
// положить очень много всего
// а не только одно ключевое слово…
$buffer[] = trim(fgets($keywords));
// задаем данные для запуска сокета
// request.php - это тот файл,
// который делает “дело”
$query_url = $path . “request.php”;
$url_info = parse_url($query_url);
$url_info[port] = ($url_info[port]) ? $url_info[port] : 80;
$url_info[path] = ($url_info[path]) ? $url_info[path] : “/”;
$url_info[query] = ($url_info[query]) ? “?” . $url_info[query] : “”;
// пакуем данные для передачи
// в генерирующий скрипт
// использование serialize очень удобно,
// так как позволяет
// залить в request.php мегабайты данных
$request = serialize($buffer);
// формируем запрос для передачи по сокету
$query = “POST ” . $url_info[path] . ” HTTP/1.1\r\n”;
$query = $query . “Content-Type: text/xml\r\n”;
$query = $query . “Host: ” . $url_info[host] . “\r\n”;
$query = $query . “Content-length: ” . (strlen($request)) . “\r\n\r\n”;
$query = $query . $request;
// создаем сокет, переводим его
// в неблокирующий режим и запускаем
// обработчик запросов
$errno = 0;
$error = “”;
$socket = fsockopen($url_info[host], $url_info[port], $errno, $error, 30);
stream_set_blocking($socket, 0);
stream_set_timeout($socket, 3600);
fputs($socket, $query);
// запоминаем запущенный сокет
$sockets[md5(time())] = $socket;
}
}
// читаем данные из сокета. формально они нам
// не нужны, но это позволяет
// отработать обработчкику запросов
reset($sockets);
while ($socket = current($sockets))
{
if (feof($socket))
{
// убиваем сокет, который отработал
unset($sockets[key($sockets)]);
}
else
{
// читаем данные из сокета
$temp = fgets($socket, 1000);
}
// обрабатываем следующий сокет
next($sockets);
}
// делаем небольщую задержку,
// иначе загруженность сервера
// приближается к 100 процентам
sleep(1);
// если нет активных сокетов, то можно выходить
if (count($sockets) == 0)
$done = true;
}
fclose($keywords);
die;
stableversion.com/blog/mnogopotochnost_na_php
|
|
|
30.06.2010, 22:16
|
#8
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от oso
Правда, с проксями он плохо дружит..
|
бред, с проксями там все нормально, включая socks4/5. У меня на php+multi_curl мультипоточный парсер-чекер проксей строчит только так. У кого не пашет или таймауты большие на socks, обновите либкурл до последней версии, только мне для этого пришлось php пересобирать руками.
про RollingCurl я уже писал в похожих топиках: нормальный класс, его можно брать за основу и дорабатывать по своим запросам.
вот здесь еще несколько слов про мульти поточность в php
|
|
|
30.06.2010, 23:11
|
#9
|
Дохуя дорвейщик
Регистрация: 26.11.2008
Сообщений: 898
Бабло: $55079
|
Писал на пыхе просто неимоверно быстрые парсилки, хуярсилки и прочую дребедень, на неблокирующихся сокетах. Написать с нуля что-то подобное очень тяжко, даже для бывалых прогеров, особенно если нету глубокого понимания принципов, но это и не обязательно, т.к. есть замечательная штука - nanoweb (ебанитесь, но это веб-сервер написанный на php), скачать его можно вот тут - http://nanoweb.si.kz/. Если руки растут откуда надо, то из него можно вытащить весь нужный функционал, который хорошо отлажен и прекрасно функционирует.
__________________
If you can dream - and not make dreams your master
|
|
|
01.07.2010, 08:37
|
#10
|
Senior Member
Регистрация: 09.01.2010
Адрес: ☭
Сообщений: 203
Бабло: $39450
|
Цитата:
Сообщение от qazxcvbnm
config.php
PHP код:
$socket = fsockopen($url_info[host], $url_info[port], $errno, $error, 30);
stream_set_blocking($socket, 0);
stream_set_timeout($socket, 3600);
fputs($socket, $query);
die;
stableversion.com/blog/mnogopotochnost_na_php
|
здесь коннект блокируется как минимум.
p.s. извращенцы
Последний раз редактировалось Painkiller; 01.07.2010 в 12:54.
|
|
|
|