A probléma a „hosszú” php script

A probléma a „hosszú” php script
Néha meg kell írni szkripteket, akinek a munkája hosszú időt vesz igénybe. Például egy szkript / telepíteni mentéseket, telepítse a demo verziója az adott alkalmazásnak, összesítésével nagy mennyiségű adatot, import / export, stb Ahhoz, hogy ezek a scriptek nem állt meg a munkáját egy váratlan pillanatban, meg kell tudni, és emlékszem, néhány dolgot.

külső timeout

Először is be kell állítani a megfelelő paraméter értékét max_execution_time PHP config.

Ha a szkript fut a webszerver (pl válaszul a HTTP-kérést a felhasználó), azt is meg kell állítaniuk az időkorlát a konfigurációs web szerver. Apache-hoz paraméterek TimeOut és FastCgiServer ... -idle-timeout. (Ha a PHP fut keresztül FastCGI), az nginx send_timeout és fastcgi_read_timeout (ha a PHP fut keresztül FastCGI).

A web szerver is lehet, hogy proxy kéréseket egy másik webszerver, ami elindít egy PHP script (nem ritka például nginx - frontend, apache - backend). Ebben az esetben a proxyzott webszerver is be kell állítani a proxy timeout. Az apache ProxyTimeout. A nginx proxy_read_timeout.

felhasználói megszakítás

Ha a szkript fut válaszul egy HTTP-kérést, a felhasználó meg tudja állítani a megkeresés teljesítését a böngészőben, ebben az esetben hagyja abba a munkát, és a PHP script. Ha szükséges, a script folytatta munkáját, még a leállítás után kérésére állítsa a paraméter TRUE ignore_user_abort PHP config.

Elvesztése nyitott kapcsolatok

Ha a script megnyit egy kapcsolatot valamely szolgáltatás / szolgáltatás (az adatbázis, az e-mail szerver FTP-szerverre.), És közben a program futása közben a kapcsolat nem használják, akkor fedezi ezt a szolgáltatást. Például, ha a végrehajtása során a forgatókönyvet egy ideig nem hajt végre lekérdezéseket MySQL, MySQL lezárja a kapcsolatot, miután a paraméterben beállított ideig wait_timeout. Ennek következtében, amikor megpróbálja végrehajtani egy másik kérés sikertelen.

Ilyen esetekben szükség van, hogy ellenőrizze a vegyületek aktivitását, azokon a területeken, ahol lehetséges kód leállás a használatát, és dugja vissza, ha szükséges. Mint például MySQLi modul egy hasznos funkciója mysqli :: ping, hogy teszteljék a vegyület aktivitását, valamint a mysqli.reconnect konfigurációs lehetőség, hogy automatikusan újra, amikor a kapcsolat megszakad. Ennek hiányában a hasonló funkciókat más típusú kapcsolat, akkor próbálja írni magad. Meg kell alkalmazni a triviális módon a szolgáltatást (például, hogy végre a lekérdezést SELECT 1 FROM dual), és hiba esetén (fogás segítségével try ... catch.) Ahhoz, hogy csatlakozni.

párhuzamos Start

Gyakran előfordul, hogy sok szkript futnak ütemtervet (a cron), és várható, hogy egy ideig fog futni csak egy példányát a forgatókönyvet. De előfordulhat, hogy a szkript fut egyszerre a vége előtt a korábbi munkát, és mint általában, nem kívánatos (kétszer importált azonos adatokat zatrutsya által használt adatok az első forgatókönyvet.).

lock felhasznált erőforrások lehet használni ilyen esetekben, de a probléma mindig egyénileg megoldható. Azt is megteheti, egyszerűen ellenőrizheti, hogy ha egy másik futó példányát a forgatókönyvet, és vagy várjon, amíg befejezi, vagy töltse ki az aktuális futás. Ehhez, akkor megtekintheti a listát a futó folyamatok között, vagy használja a zár futtatni a scriptet, valami ilyesmit:

A terhelést a webszerveren

Azokban az esetekben, ahol sok szkriptek futnak a web szerver, a kliens kapcsolatban ugyanezen webszerver nyitva marad mindaddig, amíg a script nem fog működni. Ez nem jó, mert a feladat a webszerver, mint a kérést, és így az eredmény a lehető leghamarabb kezelni. Ha a kapcsolat marad lóg, az egyik workers` (folyamatok) webszerver sokáig lesz elfoglalva. És ha ugyanabban az időben fog futni egy csomó script, akkor tegyen meg minden (vagy majdnem minden) a munkavállaló áll rendelkezésre (lásd az apache. MaxClients) és a web szerver egyszerűen nem tudja kezelni más kéréseket.

Ezért ezt kell a felhasználó kérésére feldolgozás fut a script a háttérben egy php-cli, hogy ne töltse be a web szerver és a felhasználó úgy válaszol, hogy ő kérés feldolgozása folyamatban van. Ha szükséges, hogy rendszeresen ellenőrizze a feldolgozási állapot AJAX kérések.

Itt talán, és csak azt tudom mondani, hogy ebben a témában. Remélem, hogy valaki előnyös.

Kapcsolódó cikkek