PHP – több parancs futtatása egy scriptből – egyidőben


Ha Linuxon php-CLI-ben egy scripten belül egyidőben szeretnénk több kódrészletet futtatni, akkor a

pcntl_fork();

funkcióra van szükségünk.

Egy nagyon egyszerű példa, ahol a ‘szülő folyamat’ 5, a ‘gyermek folyamat’ pedig 2 másodpercenként írja ki a nevét [ennek semmi értelme nincs, de a demonstrálás érdekében valamit ki kellett találni. Maga a fork tökéletes például Socket-ek használatakor]:

<?php
$pid = pcntl_fork();
 
if ($pid == -1) {
 die("Fork hiba\n"); // ha a PID -1, akkor a fork közben hiba történt, nem tudunk gyermekfolyamatot létrehozni
} else if ($pid) {
// Szülő folyamat
 
while (true)
{
echo "[Szülő] "; sleep(5);
}
 
} else {
// Gyermek folyamat
 
while (true)
{
echo "[Gyermek]"; sleep(2);
}
 
}
?>

Figyelem: csak UNIX rendszereken működik!

Kapcsolódó bejegyzések:

A cikket beküldte: balintx (http://www.phoenixchat.hu/)

4 hozzászólás

  1. Festő says:

    hy.
    Valaki tud mondani egy kicsit reálisabb felhasználási lehetőséget erre?
    Mert nem túl tiszta, hogy mikor szükséges ez.

  2. balintx says:

    http://hu.php.net/manual/en/function.pcntl-fork.php#79439
    Esetleg.
    Vagy egy socketes scriptnél, ahol az usertől várunk adatot, de közben a serverről jövő adatokat is fel kell dolgoznunk. Ez esetben a gyermekfolyamat lehet az input (http://www.tutorial.hu/php-cli-felhasznaloi-adatbevitel/), a szülő pedig a processer :)

    Amúgy én kérek elnézést a példáért.

  3. Festő says:

    Köszi :)

  4. Borni74 says:

    Sziasztok!

    Lehet egy kérésem?
    Engem annyiban érdekelne a téma, hogy egy online játékomhoz kellene olyan, hogy ha a felhasználó kilép, akkor a háttérben még az elkezdett folyamatok, építés idejének számolása, itd. tovább fussanak. Belépéskor pedig a változásokat vissza is kapja.

Szólj hozzá
a PHP – több parancs futtatása egy scriptből – egyidőben c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>