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) &lt; $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=&gt;$socket) {
		if(feof($socket)) {
			// если поток отработал, убираем его
			fclose($socket);
			unset($threads[$key]);
		} else {
			/* иначе считываем чтобы отработало
			считываем "вникуда" так как в моем случае от
			скрипта-потока мы никаких данных не получаем,
			тоесть нет обратной связи со скриптом
			если связь нужна, то скрипт-поток
			выводит данные с помощью echo,
			а скрипт-launcher их читает,
			тут думаю понятно */
			fgets($socket, 1000);
		}
	}
	// делаем задержку иначе загрузка сервера приближается к 100%
	sleep(1);
	if (count($threads) == 0) $done = true;
}
 
?>

Читать также:

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

  1. Pavel

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

  2. Freelite

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

  3. Mureroambum

    It’s obvious Britney and her bratty pals are being silly. pornhub video It’s all just her and some guy flirting around and I gotta tell you without make up on Paris is ugly as fuck. megarotic video com/videos/ee20f0eba7 (posted 11 days ago) freeloader Report real news man. megarotic girl gone wild “All I want to say to Paris is you’re being led down the wrong path ” Letterman jibed during last Thursday’s Late Show. free pornhub I can’t understand why people are saying bad things about her. http pornhub

  4. Arteptweegree

    Hello my friends :)
    ;)

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