Dette er et ret vanskeligt råd, men det vil helt sikkert gøre, hvad du vil, hvis du er villig til at ændre og omkompilere PHP.
Tag et kig på PHP-kildekoden på https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(filen er Zend/zend_execute_API.c
), ved funktionen zend_set_timeout
. Dette er den funktion, der implementerer tidsbegrænsning. Sådan fungerer det på forskellige platforme:
-
i Windows, opret en ny tråd, start en timer på den, og når den er færdig, indstil en global variabel kaldet
timed_out
til 1 kontrollerer PHP-udførelseskernen denne variabel for hver instruktion og afslutter derefter (meget forenklet) -
på Cygwin, brug itimer med ITIMER_REAL, som måler rigtig tid, inklusive eventuel søvn, vent, hvad som helst, og løft derefter et signal der vil afbryde enhver behandling og stop behandlingen
-
på andre unix-systemer, brug itimer med ITIMER_PROF, som kun måler CPU-tid brugt af den aktuelle proces (men både i brugertilstand og kernetilstand). Dette betyder at vente på andre processer (såsom MySQL) ikke tæller med i dette.
Det du nu vil gøre er at ændre itimeren på din Linux fra ITIMER_PROF til ITIMER_REAL, hvilket du selvfølgelig skal gøre manuelt, rekompilere, installere osv. Den anden forskel mellem disse to er, at de også bruger forskelligt signal, når timeren kører ud. Så mit forslag er at ændre ifdef:
# ifdef __CYGWIN__
ind i
# if 1
så du indstiller både ITIMER_REAL og signalet, som PHP venter på, til SIGALRM.
Under alle omstændigheder er hele denne idé uafprøvet (jeg bruger den til et meget specifikt system, hvor ITIMER_PROF er ødelagt, og det synes at arbejde), ikke understøttet osv. Brug det på eget ansvar. Det kan fungere med PHP selv, men det kan ødelægge andre moduler i PHP og i Apache, hvis de af en eller anden grund, skal du bruge SIGALRM-signalet eller en anden timer.