ugrás a tartalomhoz

Kommunikáció PHP scriptekkel futás közben

ThomasKlein · 2011. Aug. 19. (P), 19.53
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)
 
1

A longprocess.php-t ne

Hidvégi Gábor · 2011. Aug. 19. (P), 20.32
A longprocess.php-t ne közvetlenül hívd meg, hanem egy másik scriptből a háttérben, pl. a php exec parancsával (windows alatt: "start /path/php.exe /path/longprocess.php", linux alatt: "/path/php /path/longprocess.php &").
2

Fajl alapu session

szeber · 2011. Aug. 19. (P), 20.39
A php a session_start()-nal (elo session eseten) megnyitja a session-t, ami alapertelmezesben altalaban fajl alapon szokott menni. Gyanitom, nalad is ez a helyzet. Ilyenkor betolti az adatokat es lock-olja is a fajlt, nehogy az tortenjen, hogy egy parhuzamos script is dolgozik a session-ben, modositja a fajlt, majd amikor ez a script vegzett szepen felulirja annak a modositasait. Ezert szall el a masodik keres.

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.
3

Köszönöm a gyors válaszokat

ThomasKlein · 2011. Aug. 19. (P), 21.10
Köszönöm az eddigi gyors segítségeteket, ma már sajnos nem érek rá folytatni a kódolást, de a jövőhéten kipróbálom a javasoltakat.
@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