Това е доста труден съвет, но определено ще направи това, което искате, ако сте готови да модифицирате и прекомпилирате PHP.
Разгледайте изходния код на PHP на адрес https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(файлът е Zend/zend_execute_API.c
), във функция zend_set_timeout
. Това е функцията, която прилага ограничение във времето. Ето как работи на различни платформи:
-
в Windows, създайте нова нишка, стартирайте таймер върху нея и когато приключи, задайте глобална променлива, наречена
timed_out
до 1, ядрото за изпълнение на PHP проверява тази променлива за всяка инструкция, след което излиза (много опростено) -
на Cygwin, използвайте таймер с ITIMER_REAL, който измерва реален време, включително сън, изчакайте, каквото и да е, след това подайте сигнал което ще прекъсне всяко обработка и спиране на обработка
-
на други unix системи, използвайте таймер с ITIMER_PROF, който измерва само времето на процесора, прекарано от текущия процес (но както в потребителски режим, така и в режим на ядрото). Това означава, че чакането за други процеси (като MySQL) не се зачита в това.
Сега това, което искате да направите, е да промените таймера на вашия Linux от ITIMER_PROF на ITIMER_REAL, което разбира се трябва да направите ръчно, да прекомпилирате, инсталирате и т.н. Другата разлика между тези две е, че те също използват различен сигнал, когато таймерът работи навън. Така че моето предложение е да промените ifdef:
# ifdef __CYGWIN__
в
# if 1
така че да зададете както ITIMER_REAL, така и сигнала, който PHP чака, на SIGALRM.
Така или иначе цялата тази идея е непроверена (използвам я за някаква много специфична система, където ITIMER_PROF е счупен и изглежда да работи), неподдържан и т.н. Използвайте го на свой собствен риск. Може да работи със самия PHP, но може да повреди други модули в PHP и в Apache, ако по някаква причина използват сигнала SIGALRM или друг таймер.