यह काफी मुश्किल सलाह है, लेकिन अगर आप PHP को संशोधित और पुन:संकलित करने के इच्छुक हैं तो यह निश्चित रूप से वही करेगा जो आप चाहते हैं।
PHP स्रोत कोड पर एक नज़र डालें https:// github.com/php/php-src/blob/master/Zend/zend_execute_API.c
(फाइल है Zend/zend_execute_API.c
), समारोह में zend_set_timeout
. यह वह कार्य है जो समय सीमा को लागू करता है। यहां बताया गया है कि यह विभिन्न प्लेटफॉर्म पर कैसे काम करता है:
-
विंडोज़ पर, एक नया थ्रेड बनाएं, उस पर टाइमर प्रारंभ करें, और जब यह समाप्त हो जाए, तो
timed_out
नामक एक वैश्विक चर सेट करें 1 तक, PHP निष्पादन कोर प्रत्येक निर्देश के लिए इस चर की जांच करता है, फिर बाहर निकलता है (बहुत सरलीकृत) -
सिगविन पर, ITIMER_REAL के साथ आईटाइमर का उपयोग करें, जो वास्तविक . को मापता है समय, किसी भी नींद सहित, प्रतीक्षा करें, जो भी हो, फिर एक संकेत उठाएं जो किसी भी को बाधित करेगा प्रसंस्करण और प्रसंस्करण बंद करो
-
अन्य यूनिक्स प्रणालियों पर, ITIMER_PROF के साथ आईटाइमर का उपयोग करें, जो केवल वर्तमान प्रक्रिया द्वारा खर्च किए गए CPU समय को मापता है (लेकिन उपयोगकर्ता-मोड और कर्नेल-मोड दोनों में)। इसका मतलब है कि अन्य प्रक्रियाओं (जैसे MySQL) की प्रतीक्षा करना इसमें शामिल नहीं है।
अब आप अपने लिनक्स पर आईटाइमर को ITIMER_PROF से ITIMER_REAL में बदलना चाहते हैं, जो निश्चित रूप से आपको मैन्युअल रूप से करने, पुन:संकलित करने, स्थापित करने आदि की आवश्यकता है। इन दोनों के बीच दूसरा अंतर यह है कि टाइमर चलने पर वे अलग-अलग सिग्नल का भी उपयोग करते हैं। बाहर। तो मेरा सुझाव है कि ifdef को बदलें:
# ifdef __CYGWIN__
में
# if 1
ताकि आप ITIMER_REAL और वह संकेत दोनों सेट कर सकें जिसका PHP SIGALRM के लिए इंतजार कर रहा है।
वैसे भी इस पूरे विचार का परीक्षण नहीं किया गया है (मैं इसे कुछ बहुत विशिष्ट प्रणाली के लिए उपयोग करता हूं, जहां ITIMER_PROF टूटा हुआ है, और यह लगता है काम करने के लिए), असमर्थित, आदि। इसे अपने जोखिम पर उपयोग करें। यह PHP के साथ ही काम कर सकता है, लेकिन यह PHP और . में अन्य मॉड्यूल को तोड़ सकता है Apache में, यदि वे किसी भी कारण से, SIGALRM सिग्नल या अन्य टाइमर का उपयोग करते हैं।