Эмуляция многопоточности в PHP
Вход Регистрация

Эмуляция многопоточности в PHP

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

Хочу сразу отметить, что в PHP многопоточности нет. Конечно, есть многопроцессность, которую можно реализовать с помощью операционной системы (такой случай мы рассмотрим), а также многозадачность, а многопоточности нет в языке PHP. Но несмотря на это, отдельные задачи выполнять параллельно возможно.

Для начала, рассмотрим часто встречающийся пример: скачать с помощью скрипта HTML содержимое заданных веб-страниц. Если страниц немного, то эта задача легко решаема. А если страниц сотни или тысячи, десятки тысяч? Тогда здесь можно использовать способы, благодаря которым можно одновременно выполнять скачивание. Такие способы будут подробно описаны далее в этих статьях. Сперва мы рассмотрим применение библиотеки CURL для загрузки одновременно нескольких веб-страниц. Далее будем использовать для решения нашей задачи stream-функции. Затем, сделаем это используя асинхронные сокеты. И в завершение обзора, распараллелим наш процесс с помощью функции fork.

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

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

Одновременные вызовы одного и того-же скрипта

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

Допустим, у нас имеется скрипт get_content.php, вот его исходный код:


$links = array('google.ru', 'rambler.ru', 'yandex.ru', 'yahoo.com', 'mail.ru');
$u = $_GET['u'];
$link = $links[$u];
$content = file_get_contents('http://'.$link);
$f = fopen($u.'.cont', 'w');
fwrite($f, $content);
fclose($f);

Здесь $links – массив ссылок, содержимое которых мы должны получить. Обращаясь к скрипту как get_content.php?u=n , где n является каким-либо ключом массива $links, на жестком диске у нас запишется файл под именем n.cont, внутри которого записано HTML содержимое с запрашиваемой веб-страницы.

Для этого нужно открыть в браузере пять вкладок, написать в адресной строке первой вкладки http://путь/get_content.php?u=0, во второй http://путь/get_content.php?u=1 и далее до http://путь/get_content.php?u=4. Затем, в каждой вкладке быстро нажимаем Enter. Далее, можно заглянуть в папку со скриптом, где должно быть 5 файлов с HTML содержимым веб-сайтов, указанных в массиве. Вот на таком тривиальном примере мы представили простейший способ эмуляции многопоточности в PHP.

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

В следующей статье мы применим для нашей задачи библиотеку CURL, и посмотрим, что из этого выйдет.


Комментировать

captcha

  #1 / Гость
15 октября 2012 / Ответить  

Это не "эмуляция многопоточности", а вызов одного и того же скрипта с разными параметрами :)

  #2 / codomaza
12 ноября 2012 / Ответить  

Верно, это вызов одного и того же скрипта с разными параметрами, но, можно назвать и Эмуляцией многопоточности.

Вход

Зарегистрируйтесь, если нет учетной записи

Напомнить пароль
Регистрация
Напомнить пароль
Войти в личный кабинет