Ne zaman bir PHP <5.3.0 cini komut sinyallerini alır?

1 Cevap php

Ben bir iş işçisi eserlerinde bir PHP komut dosyası var; onun temel görevi, yeni işler için bir veritabanı tablosunu kontrol etmek ve eğer varsa, onlara hareket. Ama işler arasında uzun boşluklar ile, patlamaları geliyor olacak, bu yüzden böyle bir uyku döngüsü tasarladı:

while(true) {
  if ($jobs = get_new_jobs()) {
    // Act upon the jobs
  } else {
    // No new jobs now
    sleep(30);
  }
}

İyi, ancak bazı durumlarda bu yeni bir iş etkinmekte önce 30 saniyelik bir gecikme olabilir demektir. Bu daemon script beri, ben gibi, uyanmak için komut itelemek için bir SIGUSR1 sinyali yakalamak için pcntl_signal kanca denemek düşündüm:

$_isAwake = true;
function user_sig($signo) {
  global $_isAwake;
  daemon_log("Caught SIGUSR1");
  $_isAwake = true;
}
pcntl_signal(SIGUSR1, 'user_sig');

while(true) {
  if ($jobs = get_new_jobs()) {
    // Act upon the jobs
  } else {
    // No new jobs now
    daemon_log("No new jobs, sleeping...");
    $_isAwake = false;
    $ts = time();
    while(time() < $ts+30) {
      sleep(1);
      if ($_isAwake) break; // Did a signal happen while we were sleeping? If so, stop sleeping
    }
    $_isAwake = true;
  }
}

Ben durumda bir sinyal bu en az bir saniyelik bir gecikmeye neden olacağını düşünerek, bir sleep() komutu kesmek, ama içinde değil, küçük uyku bit içine sleep(30) dağıldı log dosyasını, ben SIGUSR1 geçti (ve belki de dış while döngü sıfırlar) olan tam 30 saniye kadar sonra yakalandı olmadığını görüyorum.

Ben pcntl_signal_dispatch command, but that's only for PHP 5.3 and higher. If I were using that version, I could stick a call to that command before the if ($_isAwake) çağrıyı buldum, ama bu haliyle ben 5.2.13 gidiyorum.

Durumlarda ne tür üzerinde sinyaller kuyruk açıkça kuyruk ayrıştırma aramak için araç olmadan PHP sürümlerinde yorumlanır? Orada içinde bir sinyal kuyruk çözümlenmeye tetikleyecek o uyku döngü içinde diğer bazı gereksiz komuta koyabilirsiniz?

1 Cevap

Benim kendi sorunu Sabit: Cevap "ticks" beyandır. Ben declare(ticks=1); eylemi yapmış Daemon işlem başlatma parçası olarak vardı, ama bu işlev içinde bu yana böyle bir durumda include dosyasında, (ana komut üzerine taşımak için görünen değil mi?. Ekleme declare(ticks=1) satır while(true) döngü (uykudan uyandıktan sonra, sinyalleri işlenir yüzden yani sleep(1) komutu, bir kene neden olur) hemen üzerinden gelecek sinyalleri neden önce .