2009-02-23 18 views
6

मुझे PHP डेटा ऑब्जेक्ट फ़ंक्शंस के साथ कुछ गंभीर समस्याएं आ रही हैं। मैं पूरे सेट को लाने से बचने के लिए एक buffered क्वेरी का उपयोग कर एक बड़े परिणाम सेट (~ 60k पंक्तियों, ~ 1gig) के माध्यम से लूप करने की कोशिश कर रहा हूं।PHP पीडीओ बुफर्ड क्वेरी समस्या

कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, स्क्रिप्ट सिर्फ पीडीओ :: क्वेरी() पर लटकती है - ऐसा लगता है कि क्वेरी unbuffered चल रही है (परिणाम सेट आकार में परिवर्तन क्यों समस्या को ठीक करेगा?)। यहाँ समस्या को पुन: करने के लिए अपने कोड है: अगर मैं कुछ उचित संख्या के साथ क्वेरी को सीमित

, यह ठीक काम करता है:

$rQuery = $Database->query('SELECT id FROM mytable LIMIT 10'); 

मैं पीडीओ :: MYSQL_ATTR_MAX_BUFFER_SIZE साथ खेल रहे हैं और पीडीओ का उपयोग कर की कोशिश की है :: तैयार() और पीडीओ :: execute() साथ ही (हालांकि उपरोक्त क्वेरी में कोई पैरामीटर नहीं हैं), दोनों का कोई फायदा नहीं हुआ। किसी भी सहायता की सराहना की जाएगी।

उत्तर

8

अगर मैं यह अधिकार समझता हूं, तो बफर्ड प्रश्नों में PHP को यह बताते हुए शामिल है कि आप प्रसंस्करण शुरू करने से पहले पूरे परिणाम सेट के लिए प्रतीक्षा करना चाहते हैं। पीडीओ से पहले, यह डिफ़ॉल्ट था और यदि आप तुरंत परिणामों से निपटना चाहते थे तो आपको mysql_unbuffered_query पर कॉल करना पड़ा।

यह पीडीओ MySQL ड्राइवर पृष्ठ पर क्यों समझाया नहीं गया है, मुझे नहीं पता।

+0

वाह ठीक है मैं एक बेवकूफ हूँ बजाय fetchAll() उपयोग करने के लिए fetch() एक धारणा बना देता है । मुझे नहीं पता कि मुझे विपरीत प्रभाव क्या मिला। – Stewart

+0

तकनीकी रूप से, एक "buffered" क्वेरी का अर्थ है MySQL क्लाइंट लाइब्रेरी आपको वापस सौंपने से पहले टीसीपी स्ट्रीम से पूरे परिणाम को खींचती है। – staticsan

+0

हम्म, मैंने सोचा कि मैनुअल ने buffered/unbuffered (mysql शैली) और fetch/fetchAll (पीडीओ शैली) के बीच अंतर को कवर किया है, लेकिन फिर से देख रहा है। यदि आप कुछ और पृष्ठभूमि जानकारी चाहते हैं, तो आपको निम्न उपयोगी मिल सकता है: http://netevil.org/blog/2008/06/slides-pdo –

1

आप इसे विभाजित करने के लिए हिस्सा है कि काफी बड़ा समस्याएं पैदा करने के लिए नहीं कर रहे हैं में की कोशिश कर सकते:

<?php  
$id = 0; 
$rQuery = $Database->query('SELECT id FROM mytable ORDER BY id ASC LIMIT 100'); 

do { 
    stuff($rQuery); 
    $id += 100; 
} while ($rQuery = $Database->query(
      'SELECT id FROM mytable ORDER BY id ASC LIMIT 100 OFFSET '.$id 
     ) 
     ); 
?> 

... आप विचार, वैसे भी मिलता है।

-1

या शायद आप mysql कार्यों के बजाय की कोशिश कर सकते:

while ($row = mysql_fetch_row($query)) { 
... 
} 

कौन सा निश्चित रूप से, तेजी से हो जाएगा के बाद से है कि foreach बयान प्रत्येक पंक्ति

+1

mysql_ फ़ंक्शन बहिष्कृत हैं और इनका उपयोग नहीं किया जाना चाहिए – vvondra

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