Ini adalah saran yang cukup rumit, tetapi pasti akan melakukan apa yang Anda inginkan, jika Anda bersedia untuk memodifikasi dan mengkompilasi ulang PHP.
Lihat kode sumber PHP di https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(filenya adalah Zend/zend_execute_API.c
), pada fungsi zend_set_timeout
. Ini adalah fungsi yang menerapkan batas waktu. Berikut cara kerjanya di berbagai platform:
-
di Windows, buat utas baru, mulai penghitung waktu, dan ketika selesai, atur variabel global yang disebut
timed_out
ke 1, inti eksekusi PHP memeriksa variabel ini untuk setiap instruksi, lalu keluar (sangat disederhanakan) -
di Cygwin, gunakan pengatur waktu dengan ITIMER_REAL, yang mengukur nyata waktu, termasuk tidur, tunggu, apa pun, lalu naikkan sinyal yang akan mengganggu apa saja memproses dan menghentikan pemrosesan
-
pada sistem unix lain, gunakan timer dengan ITIMER_PROF, yang hanya mengukur waktu CPU yang dihabiskan oleh proses saat ini (tetapi keduanya dalam mode pengguna dan mode kernel). Ini berarti menunggu proses lain (seperti MySQL) tidak diperhitungkan.
Sekarang yang ingin Anda lakukan adalah mengubah timer di Linux Anda dari ITIMER_PROF menjadi ITIMER_REAL, yang tentu saja perlu Anda lakukan secara manual, kompilasi ulang, instal dll. Perbedaan lain antara keduanya adalah mereka juga menggunakan sinyal yang berbeda ketika timer berjalan keluar. Jadi saran saya adalah mengubah ifdef:
# ifdef __CYGWIN__
ke dalam
# if 1
sehingga Anda menyetel ITIMER_REAL dan sinyal yang ditunggu PHP ke SIGALRM.
Pokoknya seluruh ide ini belum diuji (saya menggunakannya untuk beberapa sistem yang sangat spesifik, di mana ITIMER_PROF rusak, dan sepertinya untuk bekerja), tidak didukung, dll. Gunakan dengan risiko Anda sendiri. Ini dapat bekerja dengan PHP itu sendiri, tetapi dapat merusak modul lain, di PHP dan di Apache, jika karena alasan apa pun, gunakan sinyal SIGALRM atau pengatur waktu lainnya.