2013-08-22 2 views
6

से बड़ी फ़ाइल पढ़ने के लिए मैं PHP के लिए एडब्ल्यूएस 2.3.2 एसडीके का उपयोग कर रहा हूं ताकि एस 3 से एक बड़ी फ़ाइल (~ 4 जी) को अपने स्ट्रीम रैपर का उपयोग करके खींच सकें, जो मुझे अनुमति देनी चाहिए फ़ाइल को डिस्क पर लिखने के लिए fopen/fwrite का उपयोग करें और स्मृति में बफर नहीं करें।PHP के साथ हेरोोकू मेमोरी त्रुटि और S3

http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html#downloading-data

यहाँ मेरी कोड है::

यहाँ संदर्भ है

public function download() 
    { 

     $client = S3Client::factory(array(
        'key' => getenv('S3_KEY'), 
        'secret' => getenv('S3_SECRET') 
        )); 

     $bucket = getenv('S3_BUCKET'); 
     $client->registerStreamWrapper(); 

     try { 
      error_log("calling download"); 
      // Open a stream in read-only mode 
      if ($stream = fopen('s3://'.$bucket.'/tmp/'.$this->getOwner()->filename, 'r')) { 
       // While the stream is still open 
       if (($fp = @fopen($this->getOwner()->path . '/' . $this->getOwner()->filename, 'w')) !== false){ 

        while (!feof($stream)) { 
         // Read 1024 bytes from the stream 
         fwrite($fp, fread($stream, 1024)); 
        } 
        fclose($fp); 
       } 
      // Be sure to close the stream resource when you're done with it 
      fclose($stream); 
     } 

फ़ाइल डाउनलोड लेकिन मैं लगातार Heroku से त्रुटि संदेश मिलता है:

2013- 08-22T19: 57: 59.537740 + 00: 00 heroku [run.9336]: चल रहा है मेम = 515m (100.6%) 2013-08-22T19: 57: ५९.५३७९७२ + 00: 00 Heroku [run.9336]: त्रुटि R14 (मेमोरी कोटा को पार कर)

कौन सा मुझे विश्वास को यह अब भी है किसी भी तरह स्मृति करने के लिए बफरिंग। मैंने https://github.com/arnaud-lb/php-memory-profiler का उपयोग करने की कोशिश की है, लेकिन एक सेग फाल्ट मिला है।

मैंने डिस्क पर सीधे लिखने के लिए CURLOPT_FILE विकल्प के साथ curl का उपयोग करके फ़ाइल डाउनलोड करने का भी प्रयास किया और मैं अभी भी स्मृति से बाहर हो रहा हूं। अजीब चीज top के अनुसार है, मेरा PHP उदाहरण 223 एम मेमोरी का उपयोग कर रहा है, इसलिए 512 की अनुमति भी नहीं है।

किसी के पास कोई विचार है? मैं इसे php 5.4.17 क्ली से परीक्षण करने के लिए चला रहा हूँ।

+0

ने भी PHP कॉपी कमांड की कोशिश की, और लिखने वाले बफर को फ्लश करने के लिए fflush ($ fp) का उपयोग किया। यह स्मृति – bonez

+0

को थकाऊ नहीं होना चाहिए क्या आप बाइनरी मोड में फ़ाइलों को पढ़ने और लिखने के लिए 'आरबी' और' wb' में बदल सकते हैं? साथ ही, यह कुछ भी नहीं बदला जाना चाहिए, लेकिन यह सुनिश्चित करने के लिए - क्या आप एक ही परिणाम प्राप्त करते हैं यदि आप अस्थायी चर का उपयोग पढ़ने और लिखने के बीच डेटा को पकड़ने के लिए करते हैं? – culix

+0

ने कोशिश की है कि कुछ भी नहीं बदले ... यह भी स्पष्ट होना चाहिए: कमांड लाइन से - $ curl -O http://test.s3.amazonaws.com/file.zip भी स्मृति त्रुटि का कारण बनता है, जो मुझे लगता है मुद्दा है यह एक नकली त्रुटि हो सकती है जो मुझे नहीं पता, मेरे पास हेरोकू – bonez

उत्तर

2

क्या आप पहले से ही 2x dyno के साथ प्रयास करते हैं, जिनके पास 1 जीबी मेमोरी है?

आप जो भी कोशिश कर सकते हैं वह PHP में कर्ल कमांड निष्पादित करके फ़ाइल डाउनलोड कर रहा है। यह सबसे साफ तरीका नहीं है लेकिन यह बहुत तेज/अधिक विश्वसनीय और मेमोरी अनुकूल होगा।

exec("curl -O http://test.s3.amazonaws.com/file.zip", $output); 

यह उदाहरण सार्वजनिक URL के लिए है। यदि आप अपनी एस 3 फाइलें सार्वजनिक नहीं करना चाहते हैं तो आप हमेशा एक हस्ताक्षरित यूआरएल बना सकते हैं और कर्ल कमांड के साथ संयोजन में इसका इस्तेमाल कर सकते हैं।

+0

हां, और फिर मुझे 2013-08-23T14: 30: 06.785538 + 00: 00 heroku [run.7646]: चल रहा है mem = 1024M (100।0%) 2013-08-23T14: 30: 06.785658 + 00: 00 heroku [run.7646]: त्रुटि R14 (मेमोरी कोटा पार हो गया) – bonez

+0

शायद आपको कर्ल कार्यान्वयन का प्रयास करना चाहिए जैसा कि मैंने ऊपर दिए गए मेरे संपादित पोस्ट में बताया है। –

+0

ने उस कार्यान्वयन और एक ही परिणाम की कोशिश की: 2013-08-23T19: 23: 29.446439 + 00: 00 heroku [run.2306]: चलने की प्रक्रिया mem = 1024M (100.0%) 2013-08-23T19: 23: 29.447246+ 00:00 heroku [run.2306]: त्रुटि R14 (मेमोरी कोटा पार हो गया) – bonez

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