Kommunikáció PHP scriptekkel futás közben
A probléma a következő:
Egy oldal, legyen mondjuk index.php tartalmaz egy jQuery scriptet, ami elindít egy XHTTP-REQUEST -et mondjuk a "longprocess.php" -t. Ez, mint a nevéből is látszik, egy baromi hosszú futásidejű script, a fájl elején beállítom a maximális futásidőt nullára, azaz korlátok nélkül futhat a script. Ezzel kellene kommunikálnia az index.php -nak, jQuery segítségével.
Erre azt a módszert találtam ki, hogy X másodpercenként ugyan ilyen jQuery scriptel lekérdez egy check.php -t, ugyanis a longprocess.php nak nincs addig feldolgozva a kimenete, amég HTTP 200 OK kóddal vissza nem jön. Az itt kapott eredményeket kiértékelem javascriptel, és válaszolok egy "answer.php" segítségével. Az említett php fájlok szerver oldali kommunikációját a szerveren elhelyezett munkamenetfájlban végzem.
Az elképzelés ott hibázik, hogy feltételeztem, hogy a PHP több kérést kezel egyszerre, de ez nem így van! Amég a longprocess.php futtatása le nem záródik, a check.php -t és az esetleges answer.php -t várakoztatja. Ezek Ilyenkor gyakran dobnak PHP hibaüzenetet, hogy a script elérte a 30 másodperces maximum futtatási időt.
Ekkor olvastam, hogy megoldás lehet ha a PHP -t nem modként futtatom az Apache-ban, hanem FastCGI modulon keresztül. Ám hiába a CGI, a legújabb PHP, a Non-Thread-safe verzió, továbbra is ugyan az a hibajelenség áll fent: Az Apache továbbítja a HTTP GET kérést a PHP felé, ott viszont a kéréseket nem külön szálon végzi el, egymással párhuzamosan, hanem bevárja az előző program lezárását.
A kérdésem az lenne, miképpen lehetne megoldani azt, hogy a PHP scriptel megszakítások nélkül tudjak kommunikálni, adatokat lekérni, illetve válaszolni a további program futását illetően, lehetőség szerint a rendelkezésre álló eszközökkel.
A másik kérdésem, hogy miképp lehet elérni, hogy a PHP több scriptet egymással párhuzamosan futtasson.
Válaszotokat előre is köszönöm!
ThomasKlein
(Néhány info a környezetről:
Windows 7 SP1 operációs rendszer
Apache/2.2.17 (Win32) mod_fcgid/2.3.6
PHP 5.3.7-VC9-NTS
jQuery JavaScript Library v1.6.2)
■ Egy oldal, legyen mondjuk index.php tartalmaz egy jQuery scriptet, ami elindít egy XHTTP-REQUEST -et mondjuk a "longprocess.php" -t. Ez, mint a nevéből is látszik, egy baromi hosszú futásidejű script, a fájl elején beállítom a maximális futásidőt nullára, azaz korlátok nélkül futhat a script. Ezzel kellene kommunikálnia az index.php -nak, jQuery segítségével.
Erre azt a módszert találtam ki, hogy X másodpercenként ugyan ilyen jQuery scriptel lekérdez egy check.php -t, ugyanis a longprocess.php nak nincs addig feldolgozva a kimenete, amég HTTP 200 OK kóddal vissza nem jön. Az itt kapott eredményeket kiértékelem javascriptel, és válaszolok egy "answer.php" segítségével. Az említett php fájlok szerver oldali kommunikációját a szerveren elhelyezett munkamenetfájlban végzem.
Az elképzelés ott hibázik, hogy feltételeztem, hogy a PHP több kérést kezel egyszerre, de ez nem így van! Amég a longprocess.php futtatása le nem záródik, a check.php -t és az esetleges answer.php -t várakoztatja. Ezek Ilyenkor gyakran dobnak PHP hibaüzenetet, hogy a script elérte a 30 másodperces maximum futtatási időt.
Ekkor olvastam, hogy megoldás lehet ha a PHP -t nem modként futtatom az Apache-ban, hanem FastCGI modulon keresztül. Ám hiába a CGI, a legújabb PHP, a Non-Thread-safe verzió, továbbra is ugyan az a hibajelenség áll fent: Az Apache továbbítja a HTTP GET kérést a PHP felé, ott viszont a kéréseket nem külön szálon végzi el, egymással párhuzamosan, hanem bevárja az előző program lezárását.
A kérdésem az lenne, miképpen lehetne megoldani azt, hogy a PHP scriptel megszakítások nélkül tudjak kommunikálni, adatokat lekérni, illetve válaszolni a további program futását illetően, lehetőség szerint a rendelkezésre álló eszközökkel.
A másik kérdésem, hogy miképp lehet elérni, hogy a PHP több scriptet egymással párhuzamosan futtasson.
Válaszotokat előre is köszönöm!
ThomasKlein
(Néhány info a környezetről:
Windows 7 SP1 operációs rendszer
Apache/2.2.17 (Win32) mod_fcgid/2.3.6
PHP 5.3.7-VC9-NTS
jQuery JavaScript Library v1.6.2)
A longprocess.php-t ne
Fajl alapu session
Mivel a session kezeles ugy mukodik, hogy session_start()-nal beolvassa a session-t, es a script futasanak vegen kiirja, ezert nem fogsz tudni azon keresztul kommunikalni a process-ek kozott. Ha mas modszerrel (memcache, adatbazis, socket, stb...) akarod megoldani, akkor is muszaj leszel atallni a fajl alapu session kezelesrol, vagy nem hasznalni sessiont a check es answer php-kban.
Köszönöm a gyors válaszokat
@szeber: Igen, igazad van, a PHP lezárja a session fájlokat, de kiskapu(nak tűnik :D ) a session_write_close() függvény. Még meg fogom próbálni ezt is, de több esélyét látom egy külön fájlban egy külön osztálynak, ami a MySQL egy ideiglenes táblájával kommunikál.
Ha valakinek van még hozzáfűzni valója, nyugodtan.
üdv., ThomasKlein