2012-03-01 16 views
5

के कारण PHP क्रॉन नौकरी समयपूर्व समाप्ति मेरे पास एक PHP क्रॉन नौकरी है जो 2 9 मिनट के लिए चलने के बाद विफल हो रही है। लॉग में त्रुटि (/var/log/php_errors.log) है:अधिकतम निष्पादन समय घातक त्रुटि

[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079 

crontab प्रविष्टि क्रॉन से चलाता है:

00 00 * * * /usr/bin/php /path/file.php 

से अपना शोध मुझे नहीं लगता कि इस max_execution_time config सेटिंग क्योंकि से संबंधित है :

  1. मुझे पता है कि यह 2 9:18 मिनट (यानि त्रुटि संदेश की तरह 60 से अधिक) के लिए चला गया है। क्यों स्क्रिप्ट जल्दी समाप्त किया जाता है: -
  2. the PHP docs से जब कमांड लाइन से पीएचपी चल डिफ़ॉल्ट सेटिंग 0.

क्यू है?


नोट्स:

स्क्रिप्ट बहुत भारी है, और डीबी प्रश्नों के कई हजारों चलती है, लेकिन मैं top चल रहा था और सीपीयू लोड अधिक नहीं थी।

त्रुटि लॉग से लाइन एक mysql_query कॉल है:

$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'"; 
$res = mysql_query($sql); 

> php -v 
PHP 5.3.10 (cli) (built: Feb 2 2012 17:34:38) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies 
    with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH 

> cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 

अद्यतन - मुझे पता चला क्यों स्क्रिप्ट वास्तविक समय के 29 मिनट के लिए चला सकते हैं लेकिन पीएचपी निष्पादन समय बहुत कम उद्धरण से बाहर निकल सकता है।

स्क्रिप्ट के निष्पादन के बाहर होने वाली गतिविधि पर खर्च किए गए किसी भी समय सिस्टम(), स्ट्रीम ऑपरेशंस, डेटाबेस क्वेरी आदि का उपयोग करके सिस्टम कॉल जैसे स्क्रिप्ट को चलाने का अधिकतम समय निर्धारित करते समय शामिल नहीं किया जाता है ।

(the set_time_limit() docs से, लेकिन the max-execution-time docs में भी उल्लेख किया गया है)। यह मेरे लिए प्रासंगिक था क्योंकि अधिकांश स्क्रिप्ट लंबे समय से डीबी क्वेरी और भुगतान एपीआई कॉल चल रही थी जो निष्पादन समय को घड़ी नहीं दे रही थी।

+1

क्रॉन नौकरी के पास आपकी त्रुटि से कोई लेना देना नहीं है, यह एक शुद्ध PHP मुद्दा है। मेमोरी लीक की जांच करें, लूप निष्पादित करने के बाद कुछ बग एरे को अनसेट करने का प्रयास करें। प्रश्नों के बीच मुफ्त अन्य बड़े चर सेट करें। –

+0

आप दस्तावेज़ में भी नोटिस करेंगे जो यह कहता है: _ अधिकतम निष्पादन समय सिस्टम कॉल, स्ट्रीम ऑपरेशंस इत्यादि से प्रभावित नहीं होता है। क्या आप यह सुनिश्चित कर सकते हैं कि यह वास्तव में PHP _CLI_ है जिसे क्रॉन द्वारा निकाल दिया गया है? –

+0

मैं यह भी जांचूंगा कि आपके पास चयन को तेज़ करने के लिए उपयुक्त अनुक्रमणिका हैं। क्या आपको *** mem *** और *** validto *** पर एक अनुक्रमणिका मिली है? –

उत्तर

1

क्या आप वाकई के लिए तो PHP Fatal error: Maximum execution time of 60 seconds exceeded मिलता है PHP कोड चलाने के कुछ टुकड़ा कहीं बयान set_time_limit(60) चलाता है। PHP सीएलआई मोड किसी भी समय सीमा के लिए डिफ़ॉल्ट हो सकता है लेकिन अगर कोई कोड पथ कभी भी समय सीमा निर्धारित करता है, तो इसे सम्मानित किया जाएगा। कारण है कि PHP आधे घंटे के लिए चलाया गया है क्योंकि set_time_limit सीपीयू समय के लिए सीमा निर्धारित करता है और यदि प्रक्रिया I/O सीमित है या अन्य प्रक्रियाओं के लिए प्रतीक्षा कर रही है, तो कुल CPU उपयोग वास्तविक समय घड़ी में बाद में 60 सेकंड अंक पर पहुंच जाएगा ।

set_time_limit के लिए अपने सभी स्रोत कोड को खोजने का प्रयास करें। यदि आपको कुछ भी नहीं मिला है तो स्क्रिप्ट की शुरुआत में set_time_limit(0) जोड़ें ताकि यह सुनिश्चित किया जा सके कि 60 सेकंड सीमा स्थानीय रूप से संशोधित कॉन्फ़िगरेशन फ़ाइल से नहीं आती है। उदाहरण के लिए, उबंटू एलटीएस पर PHP सीएलआई कॉन्फ़िगरेशन /etc/php5/cli/php.ini में परिभाषित किया गया है।

+0

धन्यवाद। उपयोगी जानकारी। 'set_time_limit' के लिए grepping ने समस्या का खुलासा किया। – Tom

2

ठीक है, आप समय सीमा के लिए एक बड़ा मूल्य निर्धारित कर सकते हैं, या आप इसे असीमित सेट कर सकते हैं set-time-limit() का उपयोग कर:

<?php set_time_limit(0); ?> 

लेकिन acctually मैं भी स्क्रिप्ट के शुरू में इस का उपयोग

ignore_user_abort(1); 
1

दुर्भाग्य से मैं एक टिप्पणी नहीं लिख सकते हैं, तो मेरे सवाल का यहाँ हो सकता है, क्या आप इस मैन्युअल रूप से चलाना होता तो क्या होगा? क्या यह भी समय समाप्त होगा?

यदि मैन्युअल रूप से इसे चलाने पर समय समाप्त नहीं होता है, तो मैं सुझाव दूंगा कि आप एक छोटी शेल स्क्रिप्ट को कॉल करें, जो वास्तव में एक खोल चलाता है और "/ usr/bin/php /path/file.php" चलाता है खोल।

00 00 * * * /usr/local/scripts/start_php_job.sh

File: /usr/local/scripts/start_php_job.sh 
#!/usr/bin/bash 
date 

/usr/local/bin/php /path/to/script 

date 
+0

धन्यवाद। मैंने इसे कमांड लाइन से मैन्युअल रूप से चलाने का प्रयास किया और उसी त्रुटि को मिला जब इसे क्रॉन के माध्यम से स्वचालित रूप से ट्रिगर किया गया था। – Tom

+1

क्या आप दौड़ के दौरान मेमोरी खपत रिकॉर्ड कर सकते हैं? आपकी "संसाधन सीमाएं (ulimit -a) क्या हैं? मुझे लगता है कि यह इस तरह बंद हो जाता है, बफर कैश उपयोगकर्ता अधिकतम मेम उपयोग के लिए पूर्ण है, एसक्यूएल-सर्वर अधिकतम मेम उपयोग या केवल सिस्टम रैम अधिकतम तक पहुंचता है। मैं सुझाव दूंगा कि आप एक ps -uef (मुझे लगता है कि यह वह है जो स्मृति भी दिखाता है) और अपनी प्रक्रिया को grep करें, यह हर 5 सेकंड में करें। यह भी अच्छा होगा कि * रिटर्न * कोड वास्तव में क्या है। अगर आप इसे चलाते हैं ऊपर वर्णित एक शेलस्क्रिप्ट में आप त्रुटि को $ echo द्वारा प्राप्त कर सकते हैं? और यह दिखाएगा, शायद यह आपको अधिक संकेत देता है। –

संबंधित मुद्दे