Многопоточность в php как реализуется. Информационный портал по безопасности


Оффициальной нет, сразу скажу. Есть только многочисленные костылики. Примеры, в основном, будут полезны в сео софте.

Встала вобщем задача передо мной — накатать многопоточный нескажу что, причем не просто многопоточный, а чтобы еще и потоками можно было управлять, как в том же делфи. То есть, чтобы можно было поток остановить, запустить, запауазить, возобновить и потоки еще должны оповещать о своем состоянии, мол в данный момент выполняю то-то.

Собсно, теория реализации.

Два скрипта — один поток, второй запускалка потоков. Поток делает свои дела, запускалка вычисляет, сколько потоков запустить и с какими параметрами.

Пример первый, запускает 20 потоков, если общее количество потоков ниже чем 10

1): $thCount = exec("ps a | thread.php | wc -l"); echo $thCount."\r\n"; if($thCount < 10){ for($i = 0; $i < 20; $i++){ echo "launch thread\r\n"; passthru("(php -f thread.php &) >> /dev/null 2>&1"); //sleep(1); } } else { sleep(5); } endwhile; ?>

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

Вариант 2.

Тут уже захотелось сделать более гибкую штуку. А именно — взять например 1к урлов и раздать их поровну N потокам.

> /dev/null 2>&1"); } if($i == $threads-1) { passthru("(php -f thread.php "".$perThread * $i."|".count($base)."" &) >> /dev/null 2>&1"); } if(($i !== 0)&&($i !== $threads-1)) { $start = $perThread * $i + 1; $end = $start -1 + $perThread; passthru("(php -f thread.php "".$start."|".$end."" &) >> /dev/null 2>&1"); } } ?>

Данный пример запускает поток с параметрами, который тот потом достает из массива $argv и использует. Такое вот разделение труда.

Взаимодействие между потоком и «мамой».
Тут у меня только теория. Думаю реализовать это через файлы. Поток создает файл с именем своей сессии (номера, пида), мама читает оттуда. Чтобы вывести инфу о потоках красиво и наглядно, думаю заюзать ncurses . Это сишная либа, на ней сделаны midnight commander, top. Доступна не только для пхп.

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

Саня, он же похапэ дуд , сразу обрубил — Я бы такие задачи не решал на php. Я тоже посматриваю в сторону других языков, думаю выучить что-то типа си, но пока я выучу, мне наверно уже ничего не надо будет. Есть вариант на питоне. И как раз в ридере попалась статья одного камрада, который начал изучать его и

Иногда появляется необходимость выполнять несколько действий одновременно, например, проверять изменения в одной таблице БД и вносить модификации в другую. Причем если одна из операций (например, проверка изменений), занимает много времени, очевидно, что последовательное выполнение не обеспечит балансировки ресурсов.

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

Хотя PHP и не поддерживает многопоточность, есть несколько методов её эмуляции, о них и пойдет речь ниже.

1. Запуск нескольких копий скрипта - по копии для операции

//woman.php if (!isset($_GET["thread"])) { system("wget http://localhost/woman.php?thread=make_me_happy"); system("wget http://localhost/woman.php?thread=make_me_rich"); } elseif ($_GET["thread"] == "make_me_happy") { make_her_happy(); } elseif ($_GET["thread"] == "make_me_rich") { find_another_one(); }

Когда мы выполняем этот скрипт без параметров, он автоматически запускает две копии себя, с идентификаторами операций ("thread=make_me_happy" и "thread=make_me_rich"), которые инициируют выполнение необходимых функций.

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

2. Путь джедая - использование расширения PCNTL

PCNTL - расширение, позволяющее полноценно работать с процессами. Кроме управления, поддерживает отправку сообщений, проверку состояния и установку приоритетов. Вот так выглядит предыдущий скрипт с использованием PCNTL:

$pid = pcntl_fork(); if ($pid == 0) { make_her_happy(); } elseif ($pid > 0) { $pid2 = pcntl_fork(); if ($pid2 == 0) { find_another_one(); } }

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

В первой строке мы "форкаем" текущий процесс (форк - копирование процесса из сохранением значений всех переменных), разделяя на два процесса (текущий и дочерний) выполняющихся параллельно.

Чтобы понять, где мы находимся в данный момент, в дочернем или материнском процессе, функция pcntl_fork возвращает 0 для дочернего и идентификатор процесса для материнского. Поэтому, во второй строке, мы смотрим на $pid, если он равен нулю, значит мы в дочернем процессе - выполняем функцию, в противном случае, мы находимся в материнском (строка 4), тогда создаем еще один процесс и аналогично выполняем задачу.

Процесс выполнения скрипта:

Таким образом скрипт создает еще 2 дочерних процесса, которые являются его копиями, содержат те же переменные с аналогичными значениями. А при помощи идентификатора возвращаемого функцией pcntl_fork мы ориентируемся в каком потоке находимся в данный момент и выполняем необходимые действия.

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



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



    Что такое pthreads

    Вот и все! Ну почти все. На самом деле есть то, что может огорчить пытливого читателя. Все это не работает на стандартном PHP, скомпилированным с опциями по умолчанию. Чтобы насладиться многопоточностью, надо, чтобы в вашем PHP был включен ZTS (Zend Thread Safety).

    Настройка PHP

    Далее, PHP с ZTS. Не обращайте внимание на такую большую разницу во времени выполнения в сравнении с PHP без ZTS (37.65 против 265.05 секунд), я не пытался привести к общему знаменателю настройки PHP. В случае без ZTS у меня включен XDebug например.


    Как видно, при использовании 2-х потоков скорость выполнения программы примерно в 1.5 раза выше, чем в случае с линейным кодом. При использовании 4-х потоков - в 3 раза.


    Можно обратить внимание, что хоть процессор и 8-ядерный, время выполнения программы почти не менялось, если использовалось более 4 потоков. Похоже, это связано с тем, что физических ядра у моего процессора 4. Для наглядности изобразил табличку в виде диаграммы.


    Резюме

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

    Теги:

    • php
    • pthreads
    Добавить метки

    Одна из самых важных и популярных задач в PHP - передача данных. Вы, наверное, не раз сталкивались с url вроде site.ru/page.php?id=114841 или формой с полями ввода текста (регистрация, новый комментарий и тд). В этом и следующем уроках поговорим об передаче данных в PHP .

    Метод POST в PHP

    Метод состоит из двух частей: HTML c формой и полями и файла-обработчика на PHP.

    Внимание! Для работы нам достаточно создать соответственно всего два файла .

    Демонстрация Скачать исходники
    Рассмотрим пример с комментариями - реализация авторизации пользователя на сайте:

    Код HTML (файл post.html)



    Форма





    Ваш логин:

    Ваш пароль:





    Теперь подробнее о методах передачи данных. Существует два вида GET (через url, открытый - можно изменить url вручную) и POST (через форму, закрытый). Отличие будет заключаться в содержании адресной строки, то есть url.

    При получении данных переданных одним из этих способов в массив соответствующего методу типа ($_GET или $_POST) собираются данные. Также существует массив $_REQUEST, который может содержать и $_GET, и $_POST одновременно. Но это для других примеров. Рекомендую большинство данных передавать методом POST.

    Теперь рассмотрим код обработчика.

    Код PHP (в файле test_reg.php)

    $login = $_POST["login"]; // принимаем данные отправленные POST
    $pass = $_POST["pass"]; // login и pass - это name полей ввода

    If (($login == "Admin") && ($pass == "Pass"))
    echo "Здравствуйте, Admin! Сегодня кофе или чай?)";
    else echo "Вы ввели неверную связку логин-пароль. Попробуйте ещё Назад";
    ?>
    Вы можете видеть как в отдельные переменные мы записываем значение полей с соответствующими name в массиве $_POST, хотя также можно было собрать и в $_REQUEST.

    В обработчике, пожалуй, проработаем условие авторизации - совпадают ли логин и пароль в форме с нашим выдуманным (соответственно Admin и Pass). И либо поздороваемся с входящим (Здравствуйте, Admin! Сегодня кофе или чай?), либо нет (Вы ввели неверную связку логин-пароль. Попробуйте ещё). Однако для создания полноценной авторизации Вам ещё надо ознакомиться с cookie, сессиями и . Но об этом позже.

    Непосредственно в скрипте можно как угодно обрабатывать данные: дописывать, стирать, шифровать и так далее. Главное - это знать имя переменной (задаётся в HTML-форме) и дальше собирать их с помощью массивов $_POST, $_GET и $_REQUEST.

    Спасибо за внимание!

    Посмотрело: 1256

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



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



    Что такое pthreads

    Вот и все! Ну почти все. На самом деле есть то, что может огорчить пытливого читателя. Все это не работает на стандартном PHP, скомпилированным с опциями по умолчанию. Чтобы насладиться многопоточностью, надо, чтобы в вашем PHP был включен ZTS (Zend Thread Safety).

    Настройка PHP

    Далее, PHP с ZTS. Не обращайте внимание на такую большую разницу во времени выполнения в сравнении с PHP без ZTS (37.65 против 265.05 секунд), я не пытался привести к общему знаменателю настройки PHP. В случае без ZTS у меня включен XDebug например.


    Как видно, при использовании 2-х потоков скорость выполнения программы примерно в 1.5 раза выше, чем в случае с линейным кодом. При использовании 4-х потоков - в 3 раза.


    Можно обратить внимание, что хоть процессор и 8-ядерный, время выполнения программы почти не менялось, если использовалось более 4 потоков. Похоже, это связано с тем, что физических ядра у моего процессора 4. Для наглядности изобразил табличку в виде диаграммы.


    Резюме

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

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

    Если когда-либо в мир гитарной музыки приходил настоящий гений, то его имя Джеймс Маршалл Хендрикс, известный всему миру как Джими...

    Как отследить по номеру? Наложенный платеж Способы доставки Доставка день в день; Сумма к оплате Способы оплаты...

    Для однозначного определения положения точки в пространстве необходимо и достаточно иметь проекции на двух плоскостях проекций, но в...
    Блок-схема представляет последовательные этапы задачи или процесса. Существует много разных макетов SmartArt, которые можно использовать...
    Вы давно интересуетесь, как сделать много лайков в ВК? В таком случае мы предлагаем вам воспользоваться нашим уникальным предложением.!...
    Вкладка ввода средств в My Lands My Lands – это игра, которая позиционирует себя как способ заработать реальные деньги посредством...
    Интерфейс и настройки камерыНарекания вызывает и программная оболочка фотоаппарата. К слову, меню и интерфейс здесь практически такие же,...
    Уже давно компания «Сони» презентовала своим покупателям фотоаппараты собственного производства. Их линейка довольно часто пополняется и...