php

2011-04-06 5 views
11

मैं PHP स्क्रिप्ट जो MongoDB से डेटा लाने चला रहा हूँ में MongoCursorTimeoutException से बचने के अनंत को समय समाप्ति सेट करने के लिए कैसे। मैं एक बहुत ही बड़ा डेटाबेस है और मैं MongoDB संस्करण ..my यह अपवाद हो रही है 1.6.5php

PHP Fatal error: Uncaught exception 'MongoCursorTimeoutException' 
with message 'cursor timed out 
(timeout: 30000, time left: 0:0, status: 0) 

मेरे क्वेरी इस

private function executeRegex($start_date, $end_date, $source, $collection, $db) 
    { 
    $criteria = array(
     'date' => array(
      '$gte' => new MongoDate(strtotime($start_date)), 
      '$lt' => new MongoDate(strtotime($end_date)) 
     ), 
     'uid'=> array(
      '$ne' => '-', 
     ), 
     'source' => new MongoRegex($source) 
     ); 
    $value = $db->command(array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria)); 
    return count($value['values']); 
    } 

कैसे मैं समाप्ति सेट इतना है कि मुझे अपरिमित कर सकते हैं की तरह है NT timeout on a cursor स्थापित करने के लिए इस अपवाद

उत्तर

12

यहाँ प्रलेखन मिलता है।

$cursor = $collection->find()->timeout(n); 

command विधि कर्सर को वापस नहीं लौटाता है, यह एक सरणी देता है।

आप command method के लिए दस्तावेज़ पर एक नज़र डालें, तो आप देखेंगे कि यह वास्तव में निम्नलिखित के लिए सिर्फ एक आवरण है:

public function command($data) { 
    return $this->selectCollection('$cmd')->findOne($data); 
} 

आप सही दिशा में जा मिलता है चाहिए।

+9

या बस: MongoCursor :: $ timeout = -1; – user956584

2

मुझे लगता है कि आप की जाँच करनी चाहिए कैसे MongoDB, आपकी क्वेरी

db.collection.find(...).explain() 

साथ काम करता है और अगर जरूरत है द्वारा

db.collection.ensureIndex(...) 

निर्दिष्ट फ़ील्ड पर अनुक्रमित जोड़ने और पहला कदम से, केवल आपकी क्वेरी की तुलना इष्टतम है, सेट टाइमआउट: -1

20

MongoCursor :: $ timeout = -1;

अपने PHP कोड में उपरोक्त पंक्ति टाइप करें। सभी प्रश्नों के लिए यह सेट टाइमआउट। सबसे अच्छा संबंध,

+0

या आप क्वेरी से पहले इच्छित किसी भी टाइमआउट को सेट करने के लिए 'MongoCursor :: $ timeout = $ yourTimeInMS' कर सकते हैं। – Marcin

+5

नोट यह>> 1.5 – farzan

+0

में बहिष्कृत है यह दुर्भाग्य से नवीनतम php mongo ड्राइवर के साथ उपयोग नहीं किया जा सकता है, वास्तव में स्क्रिप्ट को बाहर निकलने के कारण (आपकी त्रुटि स्तर सेटिंग के आधार पर) – Dmitri

5

पीएचपी ड्राइवर टाइमआउट सेट करने के लिए आदेश विधि में एक दूसरा तर्क का समर्थन करता है।

इसका मतलब है आप निम्न करना चाहिए:

$value = $db->command(
    array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria), 
    array('timeout' => 10000000000) 
); 

यह आपकी समस्या का समाधान करना चाहिए!

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

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