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 sub>