Сравнение цен в интернет-магазинах Украины
Мобильные телефоны Ноутбуки
Цифровые фотоаппараты Мониторы
Кондиционеры MP3 плееры
DVD плееры LCD телевизоры
Opera раздает бесплатные ручки! Такси на Химмаше (мульт)
Мар 06

Мы рассматривали реализацию многопоточности в PHP с помощью CURL

Тогда мы говорили, что многопоточности в PHP нет, но ее можно сделать если извернуться.

Одним из таких способов являются сокеты. В этом случае мы сами много раз открываем наш скрипт(как если бы на наш сайт зашло много пользователей) при этом передавая каждому из них данные, с которыми он будет работать методом GET или POST. Дальше по коду разберемся…

< ?php
 
/* Допустим, что у нас есть массив $links_array со списком ссылок,
 с которыми нам нужно что-то сделать, например скачать */
 
$host='example.com'; // наш хост
$max_threads = 20; // максимальное количество потоков
$threads = array(); // тут будем держать открытые потоки
 
$done = false;
reset($links_array);
 
while(!$done) {
	// если количество запущенных потоков меньше максимального
	if(count($threads) < $max_threads)	{
		// получаем очередную ссылку
		if($link=current($links_array)) {
			// закодируем ее для передачи по гету
			$link = urlencode($link);
			// открываем сокет и формируем заголовок
			$socket = fsockopen($host, 80);
			//script.php - скрипт который выполняет задачу
			$url="http://".$host."/script.php?link=$link";
			fputs($socket, "GET $url HTTP/1.0\r\n");
			fputs($socket, "Host: $host\r\n");
			fputs($socket, "\r\n");
			stream_set_blocking($socket, 0);
			stream_set_timeout($socket, 3600);
			// запоминаем запущенный сокет
			$threads[] = $socket;
 
			// переходим к следующей ссылке
			next($links_array);
		}
	}
	foreach ($threads as $key=>$socket) {
		if(feof($socket)) {
			// если поток отработал, убираем его
			fclose($socket);
			unset($threads[$key]);
		} else {
			/* иначе считываем чтобы отработало
			считываем "вникуда" так как в моем случае от
			скрипта-потока мы никаких данных не получаем,
			тоесть нет обратной связи со скриптом
			если связь нужна, то скрипт-поток
			выводит данные с помощью echo,
			а скрипт-launcher их читает,
			тут думаю понятно */
			fgets($socket, 1000);
		}
	}
	// делаем задержку иначе загрузка сервера приближается к 100%
	sleep(1);
	if (count($threads) == 0) $done = true;
}
 
?>

(1 голосов)
Loading ... Loading ...

Добавить в delicious.com Добавить в google.com/bookmarks/ Добавить в bobrdobr.ru Добавить на Memori.ru Добавить на news2.ru Добавить на digg.com

Комментарии к “Многопоточность в PHP на сокетах”

  1. Pavel   

    Ни фига не работает, куча ошибок проще написать самому с нуля.

  2. Freelite   

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

  3. Arteptweegree   

    Hello my friends :)
    ;)

  4. vovaNux   

    принцип понятен, но как таковой многопоточности я не вижу

  5. freelite   

    а ты покури и перечитай)

  6. VolCh   

    feof не ловится, точнее ловится, но с таймаутом в 10 секунд

    P.S. для таких конструкций лучше использовать do {….} while (count($threads) > 0), и оптимизация какая-никакая, а главноe код чище и понятнее :)

  7. freelite   

    используй)

  8. Денис   

    Спасибо, из того что я смотрел легче всего прикрутить к моим приложениям.
    Только эти строки работать не будут, т.к. <(пробел)? &(html теги)lt;:
    — < ?php
    — if(count($threads) < $max_threads)
    — foreach ($threads as $key=>$socket) {

  9. Денис   

    И ещё то что написал VolCh , вы исправили?

    В принципе сейчас проведу тесты, как инет нагрузит, думаю нормально работает скрипт! Спасибо ещё раз!

  10. Freelite   

    > Только эти строки работать не будут, т.к. <(пробел)?
    А это гребаный вордпресовский едитор тут косяков наставил

  11. Balamutikweb   

    Доброго времени суток! Мне вот тут стало интересно, а есть какие-нибудь он-лайн школы, курсы или что-то подобное, где учат на веб-мастеров? Пытаюсь найти, но ничего не нахожу. Очень хочу стать веб-мастером, слышал, что они хорошо получают. И вообще очень интересно, как это так они работают? И есть ли какие-нибудь спецпредметы, или ещё какие-нибудь специальные дисциплины, которые веб-мастерам знать обязательно? Может кто поможет, если не сложно?
    Слышал, что новичков в этой среде не очень любят - и как тогда быть?

  12. johnronni   

    HI all,
    where i find drivers for Minolta CF2002?
    this is wery important for me, please hlp
    If I wrote is not in the correct section, please move to the appropriate section.
    sorry my bad english, i use translator

  13. kirloyw   

    Здравствуйте

    Нужны игры, кто нибудь знает, как найти игры для PSP ?

  14. рамиль   

    это не многопточность. автор, почитай книжки по ОС и про многопточность. это у тебя простые циклы

  15. romexome   

    Предлагаем услуги качественного сервиса по сносу сайтов. Возможны различные режимы атаки, которые в 99% случаев приводят к положительным результатам. По среднестатистическим данным, заказанный сайт падает в течение 5 минут после начала. В качестве демонстрации наших возможностей, допускается предварительная проверка.

    Наши расценки:

    1 час – 10 $
    1 сутки – 70 $

    Цены для крупных проектов могут варьироваться.
    Для постоянных клиентов предусмотрены скидки.

    Обращаться в любое время суток, ICQ: 355949762

Оставить комментарий

Профессиональная школа моделей - модельное агентство LILAS