Veri proccess PHP ile çoklu süreçleri yumurtlama

1 Cevap php

Ben işlenmesi gereken bir veri kuyruğu (Amazon OKS) var, ve ben (PHP) çoklu süreçleri ile bunu yapmak istiyorum.

Ben çocuk işçiler böyle bir şey (pseduoish kodu) yapmak istiyorum:



while(true) {

    $array = $queue->fetchNItems(10); // get 10 items

    if(!count($array)) 
        killProcess();

    foreach($array as $item) {
         ... // process the item
         $queue->remove($item);
    }

    sleep(2);
}


Ben her zaman yayınlanmaya 1 çocuk süreç gerekiyor, ama daha hızlı kuyruğunu işleme yardımcı böylece yoklukta ben (çatal?) Bir çocuk süreç istiyor.

Birisi ne gerek kaba bir PHP iskelet ile bana yardım ya da bana doğru yönde işaret edebilir?

Ben http://php.net/manual/en/function.pcntl-fork.php bakmak gerektiğini düşünüyorum, ama ben çoklu süreçleri yönetmek için kullanabilirsiniz nasıl emin değilim.

Teşekkürler

1 Cevap

Eğer bir süreç çatal zaman. Eğer bu sürecin bir kopyasını yapmak. Diğer bir deyişle copy (çatal) özgün süreç (dosya kolları dahil) vardı her şeyi içerir

Eğer ebeveyn veya çatallı bir süreçtir olmadığını nasıl anlarsınız?

Bağlantılı sayfasından örnek güzel bunu açıkça göstermektedir

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
}

?>

Ne istediğinizi bu uzatmak için

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
     while(true) {

         $array = $queue->fetchNItems(10); // get 10 items

         if(!count($array)) {
            exit();
         }

         foreach($array as $item) {
              ... // process the item
              $queue->remove($item);
         }

         sleep(2);
     }
}

?>

Bu çoklu süreçleri oluşturmak için bir döngü kullanabilirsiniz çatallı sürecinde (bu durumda bir atık) hakkında yaratacaktır. Çocuk bittiğinde çıkış çocuk süreci öldürür. ve pcntl_wait () ana devam etmek için izin dönecektir. Ben php hakkında emin değilim ama ana süreç ölür ya da çıkar eğer çocuk bitmiş olsa bile o çocuk süreci öldürür. bu nedenle pcntl_wait. Eğer birden fazla çocuk spawn eğer daha ayrıntılı bir sistem gereklidir.

belki yerine forking daha Eğer exec fonksiyonları aralığında bakmak gerekir?

Bir uyarı.

Bir çocuk vb çıktığında bölmek işlem problemleri ile dövme olabilir, veritabanı şey yanlış giderse Ayrıca birçok süreçleri ile bir sunucu öldürebilir kapalı olan işler. zaman oynama ve test ve okuma çok fazla zaman harcamak.

DC