PHP çatallaşma ve birden fazla çocuk sinyalleri

2 Cevap php

Ben pcntl_* işlevleri kullanarak çatallı çocuk süreçlerin bir dizi oluşturan bir senaryo yazmaya çalışıyorum.

Temel olarak, yaklaşık bir dakika, periyodik yoklama çalıştırmak için bir görev olup olmadığını görmek için bir veritabanı için bir döngü içinde çalışan tek bir komut dosyası vardır. Biri varsa, o çatal olmalı ve ebeveyn uzun soluklu bir görev tarafından düzenlenen değil, böylece ayrı bir işlemde görevi çalıştırın.

Muhtemelen çalıştırmak hazır görevleri bir sayıda olabilir beri, ben oluşturulan çocuk süreçlerin sayısını sınırlamak istiyorum. Bu nedenle, bir değişkene bir oluşturulduğunda her zaman arttırılmasıyla süreçlerin sayısını takip (ve daha sonra çok fazla varsa duraklatma), ve daha sonra bir sinyal işleyici Eksiltim duyuyorum. Tür böyle:

define(ticks = 1);

$openProcesses = 0; // how many we have open
$max = 3;           // the most we want open at a time

pcntl_signal(SIGCHLD, "childFinished");

while (!time_is_up()) {
    if (there_is_something_to_do()) {
        $pid = pcntl_fork();
        if (!$pid) {      // I am the child
            foo();        //   run the long-running task
            exit(0);      //   and exit
        } else {          // I am the parent
            ++$openProcesses;
            if ($openProcesses >= $max) {
                pcntl_wait($status);    // wait for any child to exit 
            }                           // before continuing
        }
    } else {
        sleep(3);
    }
}

function childFinished($signo) {
    global $openProcesses;
    --$openProcesses;
}

Sinyal işleyici işlevi yalnızca benim sayacını dışarı atar, bir kez denir - bu iki veya daha fazla işlemi aynı anda bitirmek için ne zaman dışında, hemen hemen Tamam çoğu zaman çalışır. Bunun nedeni de "Anonymous" ile açıklanabilir notes of the PHP manual:

Birden fazla çocuk, belirli bir an SIGCHLD sinyalleri çıkarken çocukların sayısından daha az dönmek Unix (POSIX) sistemler için normal bir davranıştır. SIGCHLD "- Çocuklarınıza incelemek gitmek ve durum değerleri hasat, bir veya daha fazla çocuk statü değişti" olarak okumak olabilir.

Benim sorum şudur: How do I examine the children and harvest their status? kaç çocuk süreçler herhangi bir zamanda açık denetlemek için herhangi güvenilir bir yolu var mı?

Using PHP 5.2.9

2 Cevap

Bu gördük emin, ama bu gerçekten ilginç bir fikir olduğunu ve bu yardımcı düşündüm değil

http://stackoverflow.com/questions/1160192/monitoring-children-forked-using-php

Sen başladıklarında çocuk, ebeveyn sonra bir SIGUSR2 bir SIGUSR1 göndermek olabilir onlar çıkmadan önce. Eğer ilkel sinyalleri kullanırken ile ilgileniyor başka şey RT sinyalleri ile yapmaz bunları birleştirerek çekirdeği,. Teoride, HERHANGİ olmayan rt sinyal birleştirilmiş olabilir.

Bir seferde sadece bir çocuk konuşma sopa olabilir sqlite kullanıyorum basit bir kilit çeşit, uygulamak olabilir. Sadece onlar kilit serbest hayatta kalması, böylece çocukların normalde ölümcül sinyallerini işlemek emin olun.