sql >> Database >  >> RDS >> Mysql

Real max_execution_time voor PHP op linux

Dit is nogal een lastig advies, maar het zal zeker doen wat je wilt, als je bereid bent PHP aan te passen en opnieuw te compileren.

Bekijk de PHP-broncode op https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c (het bestand is Zend/zend_execute_API.c ), bij functie zend_set_timeout . Dit is de functie die tijdslimiet implementeert. Zo werkt het op verschillende platforms:

  • op Windows, maak een nieuwe thread, start er een timer op en stel een globale variabele in met de naam timed_out wanneer deze klaar is naar 1, de PHP-uitvoeringskern controleert deze variabele voor elke instructie en sluit vervolgens af (zeer vereenvoudigd)

  • op Cygwin, gebruik itimer met ITIMER_REAL, die echt meet tijd, inclusief eventuele slaap, wacht, wat dan ook, en geef dan een signaal dat zal elke . onderbreken verwerken en stoppen met verwerken

  • op andere Unix-systemen, gebruik itimer met ITIMER_PROF, die alleen de CPU-tijd meet die wordt besteed aan het huidige proces (maar zowel in gebruikersmodus als in kernelmodus). Dit betekent dat wachten op andere processen (zoals MySQL) hierin niet meetelt.

Wat je nu wilt doen, is de itimer op je Linux wijzigen van ITIMER_PROF in ITIMER_REAL, wat je natuurlijk handmatig moet doen, opnieuw moet compileren, installeren enz. Het andere verschil tussen deze twee is dat ze ook een ander signaal gebruiken wanneer de timer loopt uit. Dus mijn suggestie is om de ifdef te veranderen:

#   ifdef __CYGWIN__

in

#   if 1

zodat je zowel ITIMER_REAL als het signaal waarop PHP wacht instelt op SIGALRM.

Hoe dan ook, dit hele idee is niet getest (ik gebruik het voor een heel specifiek systeem, waar ITIMER_PROF niet werkt, en het lijkt om te werken), niet ondersteund, enz. Gebruik het op eigen risico. Het kan werken met PHP zelf, maar het kan andere modules breken, in PHP en in Apache, als ze om welke reden dan ook, het SIGALRM-signaal of een andere timer gebruiken.



  1. sql om top 10 records te selecteren

  2. negatief getal opslaan in decimaal veld van mysql-tabel vanaf versie 5.0.3

  3. Hoe de datum van gisteren in SQLite te krijgen

  4. Bulksgewijs invoegen van velden met vaste breedte