Puncte:0

PHP 7.4 sub nginx cu php-fpm - un singur cache APCu partajat - cum?

drapel cn
C C

Am un set de scripturi PHP 7.4 care rulează cu extensia APCu, care este folosit de cod ca magazin de obiecte general pentru toți utilizatorii care vizitează site-ul unic găzduit. Din cauza propriei lipse de înțelegere, am aflat ulterior că cache-ul APCu este stabilit per proces PHP. Deci ceea ce văd este că în unele cazuri utilizator „a” primește o valoare din cache diferită de utilizator „b” (probabil de când PHP-FPM a introdus un nou proces pentru utilizatorul „b”).

Dar încă nu îmi este clar cum să configurez php-fpm, astfel încât toate cererile primite să fie în interiorul proceselor copil care sunt derivate din același proces părinte.

APCu guru krakjoe spus asta în 2015 (sublinierea mea cu aldine):

Doar pentru a răspunde la întrebarea inițială... așa cum a spus @fruitl00p, puteți configurați-vă calea de ieșire din problema de a nu putea partaja dacă folosești fpm.

Există o diferență între utilizarea fpm și utilizarea fcgi, ar trebui probabil a pus un PR la phptherightway pentru a lămuri.

Regula este că numai procesele secundare pot accesa ceea ce părintele lor creată; În FCGI, procesele generate nu sunt neapărat un copil al părintele lor, s-ar putea să nu fie adevărate furculițe. Dacă managerul dvs. de proces funcționează ca FCGI/CGI convențional, atunci nu veți putea partaja, dacă funcționează ca FPM și inițializează PHP într-un părinte și furcă copilul interpreți atunci nu veți avea nicio problemă.

Cercetările ulterioare m-au condus la fișierul php-fpm www.conf și la setările pentru:

pm = dinamic
pm.max_children = 50

Deci - este la fel de simplu ca schimbarea asta în:

pm = static
pm.max_children = 50

adică aceasta este modalitatea de a forța php-fpm pentru a vă asigura că toate procesele copil indică înapoi la un singur părinte? Astfel, asigurându-vă că există un singur cache global APCu în joc? Îmi dau seama că trebuie să fac matematică pentru a afla valoarea corectă a pm.max_children.

Vă rugăm să rețineți: Nu pot trece la memcached în acest moment, deoarece mă bazez pe o iterație regex peste tastele APCu prin intermediul unui obiect APCUIterator. S-ar putea să ajung acolo până la urmă, dar de acum trebuie să rămân cu APCu.

drapel us
Toate procesele PHP-FPM sunt bifurcate de un singur părinte, iar cache-ul APCu ar trebui să fie partajat între ele. Vă rugăm să distribuiți configurația completă PHP și nginx în întrebarea dvs.
drapel cn
C C
@TeroKilkanen vă mulțumesc pentru această perspectivă - și acum, pe baza unor teste suplimentare pe care le-am făcut ieri, se pare că toate PID-urile php-fpm indică înapoi la un PID părinte comun. Folosesc o configurație în esență „vanilie simplă” pentru nginx și php. De asemenea, adevărata cauză a problemei mele a ajuns să fie că sunt implementat în OpenShift în trei poduri - așa că am trei PHP/cache-uri diferite. Utilizatorii lovesc podurile aleatoriu. Ceea ce înseamnă că trebuie să mut toate acestea într-un micro-serviciu separat special pentru stocarea în cache.
drapel us
Sau puteți direcționa cererile pe baza hash IP, astfel încât cererile să ajungă în mod constant pe același server.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.