demoni multiprocesare pe php - Leonid Shevtsov

Mai devreme sau mai târziu, ai venit la site-ul pentru a-și îndeplini sarcinile care sunt direct de pe pagina de a face bine în nici un fel nu funcționează. Pentru a manipula cantități mari de date. Necesită servicii externe lente. Pentru a face calcule complexe.

Și atunci este necesar să ne amintim că PHP - nu doar paginile de pornire preprocesor, dar, de asemenea, un limbaj de scripting cu drepturi depline. Să facem ca limba daemon pentru a efectua sarcinile de fundal.

  • PID - ID-ul procesului. Unic la numărul pozitiv momentul prezent.
  • PCNTL - extensie PHP pentru lucrul cu procese copil. manual de fum.
  • POSIX - extensie PHP pentru lucrul cu funcțiile POSIX. manual de fum.

Dacă aveți o întrebare despre o anumită funcție necunoscută - nu vă faceți griji! Toate acestea sunt documentate în Manualul PHP. Este puțin probabil ca voi vorbi despre ele mai mult și mai interesant.

Bifurcare (procese fetale)

Cum de a face două din același proces? Programatorii sub Windows (inclusiv eu) este mai familiarizat cu sistemul, atunci când vom scrie o funcție care va fi principala () pentru firul de copil. În Linux, nu este așa, pentru că am o mică discuție despre acest sistem de multiprocesare. Utilizatorii Linux pot sări peste această secțiune în condiții de siguranță, dacă ei știu deja totul.

Deci Există o pcntl_fork funcție. Ea face două lucruri: copiați toate memoria alocată pentru procesul actual și începe un alt proces, în același loc în care a fost chemat, dar cu o nouă copie a datelor.

Astfel, după ce pcntl_fork am rămas cu două script-uri identice care rulează.

Dacă pur și simplu inserați în script-ul pcntl_fork. nimic nu se va vedea un vizual, cu excepția faptului că conflictele de acces la resurse. Prin urmare, pcntl_fork 0 întoarce procesul de copil și procesul copil PID - părinte. Acesta este modul obișnuit de utilizare pcntl_fork:

Apropo, pcntl_fork funcționează numai în CGI și CLI -rezhimah. De sub Apache - este imposibil. Logică.

demonizarea

Pentru a demonizare script-ul, trebuie să-l deconectați de la consolă și a pus într-o buclă infinită. Să vedem cum se face.

După aceste acțiuni, am rămas cu un demon - un program fără o consolă. Că nu a finalizat executarea sa lase imediat ei într-o buclă infinită (bine, aproape)

procese pentru copii

În acest moment, odnoprotsessovy nostru demon. Pentru o varietate de motive evidente, acest lucru nu poate fi suficient. Luați în considerare crearea de procese copil.

Procesarea semnalului

Următoarea cea mai importantă sarcină - furnizarea de procesare a semnalului. Acum, demonul nu știe nimic despre lumea din afară, și să-l omoare numai prin finalizarea procesului de -SIGKILL ucide. Acest lucru este rău. Asta e prea rău - SIGKILL întrerupe procesele în mijloc. În plus, nu se poate transmite informația.

Există o mulțime de semnale interesante, care pot fi prelucrate, dar ne vom concentra pe SIGTERM - semnal korretnogo de închidere.

Asta e tot. Am intercepta semnalul, a stabilit un steag în script-ul, și de a folosi acest pavilion pentru a nu începe fire noi și să completeze ciclul de bază.

Menținerea unui demon unic

Iar tușa finală. Este necesar ca demonul nu a rulat de două ori. De obicei, utilizate în acest scop, așa-numitele BIP-fișier: fișier în care a înregistrat pid acest demon special, în cazul în care se execută.

După demonizarea necesitatea de a scrie la curent PID daemon pid-fișier.

Asta e tot ce trebuie sa stiti pentru a scrie daemon în PHP. Nu vorbesc despre schimbul de resurse, pentru că această problemă este mai largă decât demonii de scriere.