<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Работа для  программистов &#187; многопроцессность</title>
	<atom:link href="http://job-interview.ru/articles/post/tag/%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%bd%d0%be%d1%81%d1%82%d1%8c/feed" rel="self" type="application/rss+xml" />
	<link>http://job-interview.ru/articles</link>
	<description>вакансии, вопросы, статьи</description>
	<lastBuildDate>Thu, 29 Mar 2012 20:53:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#8220;Многопоточность&#8221; в PHP (вступление)</title>
		<link>http://job-interview.ru/articles/post/62</link>
		<comments>http://job-interview.ru/articles/post/62#comments</comments>
		<pubDate>Thu, 09 Jul 2009 07:05:07 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[многозадачность]]></category>
		<category><![CDATA[многопоточность]]></category>
		<category><![CDATA[многопроцессность]]></category>

		<guid isPermaLink="false">/articles/?p=62</guid>
		<description><![CDATA[Intro
Эта небольшая серия статей является обобщением материала, найденного в интернете и не претендует на оригинальность. Идея ее написать возникла у меня после поиска информации по каждому из пунктов данного материала, чтобы облегчить задачу тем, кому придется столкнуться с данной темой.

Сразу хочу сказать, что многопоточности в PHP нет. Не зря слово многопоточность в заголовке взято в [...]]]></description>
			<content:encoded><![CDATA[<h3>Intro</h3>
<p>Эта небольшая серия статей является обобщением материала, найденного в интернете и не претендует на оригинальность. Идея ее написать возникла у меня после поиска информации по каждому из пунктов данного материала, чтобы облегчить задачу тем, кому придется столкнуться с данной темой.
</p>
<p>Сразу хочу сказать, что <b>многопоточности в PHP нет</b>. Не зря слово многопоточность в заголовке взято в кавычки. Да, существует <em>многопроцессность</em>, реализующаяся средствами операционной системы (этот случай будет разобран), <em>многозадачность</em>, но <em>многопоточности</em> не существует. Однако некоторые задачи все-таки можно выполнять <em>параллельно</em>.
</p>
<p>Возьмем пример, встречающийся достаточно часто: <strong>скачать программно содержимое нескольких страниц</strong>. Если страниц немного, то их можно без проблем и больших затрат времени загрузить последовательно. Но если их тысячи? И вот здесь можно применить подходы, позволяющие <strong>выполнить скачивание одновременно</strong>. Некоторые из них и будут подробно описаны в данном материале. Сначала мы рассмотрим <a href="/articles/post/67" target="_blank">использование библиотеки curl</a>, которая может производить загрузку одновременно нескольких страниц. Затем попробуем применить к нашей задаче <a href="/articles/post/92" target="_blank">stream-функции</a>. После этого сделаем то же самое с помощью <a href="/articles/post/194" target="_blank">асинхронных сокетов</a>. И наконец распараллелим наш процесс функцией fork.</p>
<p>Все способы проверены на личном опыте. Для примеров взят максимум простой код, без оптимизации, его цель – показать принципы работы каждого метода.
</p>
<p>Для вступления рассмотрим такой способ, как</p>
<h3>Вызов одновременно нескольких копий скрипта</h3>
<p>Суть состоит в том, что <strong>один скрипт вызывается с разными параметрами</strong>, разбивающими задачу на несколько одинаковых подзадач.</p>
<p>Пример. Пусть у нас есть скрипт getcontent.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$urls</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'yandex.ru'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'google.ru'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'rambler.ru'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bing.com'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mail.ru'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$k</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'k'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$urls</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$k</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://'</span><span style="color: #339933;">.</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$k</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.cont'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Здесь $urls – массив урлов, содержимое с которых нам надо получить.<br />
Вызывая этот скрипт как getcontent.php?k=n , где n равен какому-либо ключу массива $urls, мы получим на жестком диске файл с именем n.cont, в котором и сохранен html интересующей нас страницы.
</p>
<p>Теперь откроем в браузере пять вкладок, напишем в адресной строке первой http://путь/getcontent.php?k=0, адресной строке второй http://путь/getcontent.php?k=1 и т.д. до http://путь/getcontent.php?k=4 и в каждой быстро нажмем Enter. Если теперь зайти в папку с нашим скриптом, то мы увидим там 5 файлов с html сайтов из масива, причем их получение произошло практически (зависит от того, как быстро жать enter) одновременно. Вот на таком нехитром примере мы показали простейший способ <em>выполнения одного задания в несколько &#8220;потоков&#8221;</em> <img src='/articles/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
<p>Недостаток этого способа в том, что на каждый запущенный скрипт выделяется определенное количество памяти, общее количество которой в данном случае пропорционально количеству запущенных копий скрипта. Другой минус – неудобство управлением данными.</p>
<p>В <a href="/articles/post/67" target="_blank">следующей статье</a> мы попробуем для достижения нашей цели воспользоваться более гуманным способом – использовать библиотеку curl.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/62/feed</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
	</channel>
</rss>
