Probleme cu scripturile "long" php

Probleme cu scripturile
Uneori devine necesar să scrii scripturi, a căror activitate durează mult. De exemplu, scripturile pentru crearea / implementarea de copii de siguranță, instalarea unei versiuni demo a unei aplicații, agregarea unor cantități mari de date, importul / exportul de date și așa mai departe. Pentru a vă asigura că astfel de scripturi nu se opresc la munca lor într-un moment neașteptat, trebuie să știți și să vă amintiți despre unele lucruri.






Timp de expirare extern

Mai întâi, trebuie să setați valoarea corespunzătoare a parametrului max_execution_time în configurația PHP.

Dacă scriptul este pornit de serverul web (adică, ca răspuns la cererea HTTP de la utilizator), trebuie să configurați corect parametrii timeout din configurația serverului web. Pentru apache, acestea sunt parametrii TimeOut și FastCgiServer ... -idle-timeout. (dacă PHP funcționează prin FastCGI), pentru nginx send_timeout și fastcgi_read_timeout (dacă PHP rulează prin FastCGI).

Un server web poate solicita, de asemenea, proxy către un alt server web, care va lansa un script PHP (nu este un exemplu rar, nginx este un frontend, apache este un backend). În acest caz, trebuie să configurați și timpul de expirare a serverului proxy pe serverul proxy. Pentru apache proxyTimeout. pentru nginx proxy_read_timeout.

Întreruperea utilizatorului

Dacă scriptul este lansat ca răspuns la o solicitare HTTP, utilizatorul poate opri interogarea în browserul său, caz în care scriptul PHP va înceta să funcționeze. Dacă doriți ca scriptul să continue să funcționeze chiar după oprirea interogării, setați parametrul ignore_user_abort la TRUE în config-ul PHP.

Pierderea conexiunilor deschise

În cazul în care script-ul se deschide o conexiune la orice serviciu / serviciu (cu baza de date, serverul de e-mail cu FTP-server.), Și în timpul executării de script-ul în timp ce conexiunea nu este utilizat, acesta poate fi acoperit de acest serviciu. De exemplu, în cazul în care în timpul executării script-ul pentru un timp nu se execută interogări la MySQL, MySQL va închide conexiunea după timpul setat în parametrul wait_timeout. Ca urmare, apare o eroare când încercați să executați altă solicitare.







În astfel de cazuri, trebuie să verificați activitatea de conectare, în acele locuri de cod unde este posibilă oprirea și să vă reconectați, dacă este necesar. De exemplu, în modulul MySQLi există o funcție utilă mysqli :: ping pentru a verifica activitatea de conectare, precum și parametrul de configurare mysqli.reconnect pentru reconectarea automată, atunci când conexiunea este întreruptă. Dacă nu există funcții similare pentru alte tipuri de conexiuni, puteți încerca să-l scrieți singur. În acesta, trebuie să accesați trivial serviciul (de exemplu, executați o interogare duală SELECT 1 FROM), iar în caz de eroare (prindeți cu încercați ... prindeți.) Reconectați.

Parallel Start

Adesea, scripturile lungi rulează pe un program (cron), și se așteaptă ca numai o singură copie a scriptului să funcționeze la un moment dat. Dar se poate întâmpla ca următoarea derulare a scriptului să se întâmple mai devreme decât cea anterioară se va termina și, de regulă, este nedorită (aceleași date sunt importate de două ori, datele folosite de primul script vor fi modificate).

În astfel de cazuri, puteți utiliza blocarea resurselor utilizate, dar această sarcină este întotdeauna rezolvată individual. Sau puteți verifica pur și simplu dacă o altă copie a acestui script se execută și fie așteptați finalizarea lucrărilor sale, fie finalizați lansarea curentă. Pentru a face acest lucru, puteți vizualiza lista proceselor în execuție sau utilizați o cheie de blocare pentru a rula scriptul în sine, cum ar fi:

Încărcați pe serverul web

În cazurile în care script-urile lungi sunt rulate printr-un server web, conexiunea clientului către același server web rămâne deschisă până când scriptul se termină. Acest lucru nu este bun, pentru că sarcina serverului web, cât mai repede posibil, de a procesa cererea și de a returna rezultatul. Dacă conexiunea rămâne activată, unul dintre procesanții serverului Web va fi ocupat pentru o perioadă lungă de timp. Și dacă multe astfel de scripturi sunt lansate în același timp, aceștia pot lua toate (sau aproape toate) servere gratuite (pentru apache, vezi MaxClients), iar serverul web pur și simplu nu va putea să facă față altor cereri.

Prin urmare, atunci când procesați solicitarea utilizatorului, rulați scriptul în fundal folosind php-cli, astfel încât serverul web să nu fie încărcat și utilizatorul este informat că cererea sa este procesată. Dacă este necesar, puteți verifica periodic starea procesării utilizând solicitările AJAX.

Aici, poate și tot ce pot spune despre acest subiect. Sper că cineva va fi util.







Articole similare

Trimiteți-le prietenilor: