से बड़ी फ़ाइल पढ़ने के लिए मैं 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 क्ली से परीक्षण करने के लिए चला रहा हूँ।
ने भी PHP कॉपी कमांड की कोशिश की, और लिखने वाले बफर को फ्लश करने के लिए fflush ($ fp) का उपयोग किया। यह स्मृति – bonez
को थकाऊ नहीं होना चाहिए क्या आप बाइनरी मोड में फ़ाइलों को पढ़ने और लिखने के लिए 'आरबी' और' wb' में बदल सकते हैं? साथ ही, यह कुछ भी नहीं बदला जाना चाहिए, लेकिन यह सुनिश्चित करने के लिए - क्या आप एक ही परिणाम प्राप्त करते हैं यदि आप अस्थायी चर का उपयोग पढ़ने और लिखने के बीच डेटा को पकड़ने के लिए करते हैं? – culix
ने कोशिश की है कि कुछ भी नहीं बदले ... यह भी स्पष्ट होना चाहिए: कमांड लाइन से - $ curl -O http://test.s3.amazonaws.com/file.zip भी स्मृति त्रुटि का कारण बनता है, जो मुझे लगता है मुद्दा है यह एक नकली त्रुटि हो सकती है जो मुझे नहीं पता, मेरे पास हेरोकू – bonez