Многопроцесорно демони на PHP - Леонид Shevtsov

Рано или късно ще дойде на мястото за изпълнение на задачи, които са директно на страницата, за да се справят добре, по никакъв начин не работи. За да се справят с големи обеми от данни. Изискване на бавни външни услуги. За да направите сложни изчисления.

И след това, е необходимо да се помни, че PHP - не само в началните страници предпроцесорни, но и пълноправен скриптов език. Да направим този език демон за извършване на фонови задачи.

  • PID - ID на процеса. Уникален към настоящия момент положително число.
  • pcntl - PHP разширение за работа с деца процеси. Дим ръководство.
  • POSIX - PHP разширение за работа с функциите на POSIX. Дим ръководство.

Ако имате въпрос за някаква неизвестна функция - не се притеснявайте! Всички те са документирани в ръководството за PHP. Това е малко вероятно, че ще говоря за тях все повече и по-интересно.

Разклоняване (фетален процеси)

Как да направите две от един и същ процес? Програмистите под Windows (включително и аз) е по-запознати със системата, когато пишем функция, която ще бъде основен () за дете резба. В Linux, това не е така, защото имам малко се говори за тази система на голям брой процеси. Линукс потребителите може спокойно да пропуснете тази част, ако те вече знаят всичко.

И така Съществува функция pcntl_fork. Той прави две неща: да копирате всички паметта разпределени за текущия процес и започва друг процес на същото място, където бе призован, но с ново копие на данните.

По този начин, след pcntl_fork ни ​​остава два еднакви скриптове.

Ако просто поставете в pcntl_fork скрипт. нищо няма да видите визуално, с изключение на това, че конфликтите на достъп до ресурси. Затова pcntl_fork 0 възвръщаемост на дъщерен процес и процеса на дете PID на - майки. Това е по обичайния начин за използване на pcntl_fork:

Между другото, pcntl_fork работи само в CGI и CLI -rezhimah. От под Apache - това е невъзможно. Логически.

демонизиране

За да се демонизира сценария, трябва да го прекрати връзката си с конзолата и пусната в безкраен цикъл. Нека да видим как се прави.

След тези действия, ние оставаме с демон - програма без конзола. Че то не е завършено изпълнението му веднага я пусна в един безкраен цикъл (е, почти)

процесите деца

В момента нашата демон odnoprotsessovy. Поради различни очевидни причини, това не може да бъде достатъчно. Помислете за създаване на деца процеси.

обработка на сигнали

Следващата най-важна задача - осигуряване на обработка на сигнали. Сега нашата демон не знае нищо за външния свят, и да го убие само чрез завършването на -SIGKILL процеса убие. Това е лошо. Това е лошо - SIGKILL прекъсне процесите в средата. В допълнение, той не може да се предава информацията.

Има един куп интересни сигнали, които могат да се обработват, но ние ще се съсредоточи върху SIGTERM - сигнализира korretnogo изключване.

Това е всичко. Ние прихване сигнала, задаване на флаг в сценария, и използвате този флаг, за да не започнете да създавате нови теми и да завърши основния цикъл.

Поддържането на уникален демон

И последен щрих. Необходимо е, че демонът не избяга два пъти. Обикновено се използва за тази цел, така наречената PID-файл: файл, в който записва PID този демон, ако тя работи.

След демонизиране на необходимостта да се пише в текущия PID демон PID-файла.

Това е всичко, което трябва да знаете за писане на демони в PHP. Аз не говоря за споделяне на ресурси, тъй като този проблем е по-широка от демоните на писане.