PHP 4 ve 5, Ctrl-C, system (), ve çocuk süreçler

2 Cevap php

Ben system() (: NCBI BLAST, phrap, Primer3 ve DNA dizi analizi ve montajını yapmak için diğer programlar ilgi için) başka (potansiyel olarak uzun süren) programları yürütmek için çağrı kullanan bir PHP komut dosyası var.

Ben bir komut isteminden PHP CLI sürümünü kullanarak, Windows XP altında çalışan, ya da bir hizmet olarak yaşıyorum. (Her iki durumda da bir veritabanı tablosundaki bir görev kuyruğuna aracılığı ile iletişim).

Under PHP4: when I hit Ctrl+C the script is stopped and any child process running at the time is also stopped. Under PHP5: when I hit Ctrl+C the script stops, but the child is left running.

Benzer şekilde, PHP4 ile çalışırken hizmetini durdurma, bir hizmet olarak komut çalıştırırken çocuk çalışmaya devam PHP5 ile, çocuk durur.

Ben bir minimum test uygulaması yazmaya çalıştım, ve aynı davranışı bulduk. Test PHP komut dosyası sadece sistemi () bir C programı (sadece 30 saniye boyunca uyur) yürütmek için kullandığı ve daha sonra basılacak bir tuşu bekler.

PHP 4.4.9 ve 5.2.6 için kaynağını bir göz vardı ama sistemin (bu neden olacak gibi görünüyordu) kod hiçbir farkları görebiliyordu. Ben de CLI uygulama için başlangıç ​​kodu hızlı bir göz vardı ve sinyal işlemede herhangi bir farklılık görmedim.

Bu neden olmuş olabilir ne Herhangi bir ipucu, ya da geçici bir çözüm, mutluluk duyacağız.

Teşekkürler.

2 Cevap

Bu sorunu en az PHP 5.1.2 oluşur.

SIGINT CTRL + C veya CTRL + BREAK üzerinden gönderildiğinde, işleyici denir. Bu işleyici, diğer çocuklara bir SIGTERM gönderirse, sinyaller alındığı değildir.

SIGINT posix_kill yoluyla gönderilebilir () ve beklendiği gibi tam olarak çalışmak - sert bir mola ile başlatılan bu geçerlidir.

Gönderen: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

The document has sample code for trapping CTRL+C and sending posix_kill to children. It has lots of other code and info on child precesses and signals.

Bunun yerine sistemi () kullanarak, proc_open(), proc_close() ve proc_terminate() bakabilirsiniz.