Używam pakietu SDK AWS 2.3.2 dla PHP, aby spróbować ściągnąć duży plik (~ 4g) z S3 za pomocą ich stream streamu, co powinno pozwolić mi na użyj fopen/fwrite, aby zapisać plik na dysk, a nie buforować go w pamięci.Błąd pamięci Heroku z PHP i czytanie dużego pliku z S3
Oto referencyjny:
http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html#downloading-data
Oto mój kod:
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);
}
Te pliki do pobrania pliku, ale ja ciągle się komunikaty o błędach z Heroku:
2013- 08-22T19: 57: 59.537740 + 00: 00 heroku [uruchom.9336]: Proces uruchomiony mem = 515m (100,6%) 2013-08-22T19: 57: 59,537972 + 00: 00 Heroku [run.9336] błąd R14 (kwota pamięci przekroczone)
co prowadzi mi, że to wciąż buforowanie do pamięci jakoś. Próbowałem użyć https://github.com/arnaud-lb/php-memory-profiler, ale dostałem błąd Seg.
Próbowałem również pobrać plik przy pomocy cURL z opcją CURLOPT_FILE, aby napisać bezpośrednio na dysk i wciąż brakuje pamięci. Dziwna rzecz jest według top
moja instancja php używa 223m pamięci, więc nawet połowa dozwolonego 512.
Ktoś ma jakieś pomysły? Używam tego z php 5.4.17 cli do przetestowania.
Próbowałem także polecenia kopiowania php i używając fflush ($ fp), aby opróżnić bufor zapisu. To NIE powinno wyczerpywać pamięci – bonez
Czy można zmienić na 'rb' i' wb', aby odczytywać i zapisywać pliki w trybie binarnym? Co więcej, nie powinno to niczego zmieniać, ale tylko po to, aby upewnić się - czy otrzymasz takie same wyniki, jeśli używasz tymczasowej zmiennej do przechowywania danych między czytaniem a pisaniem? – culix
próbowałem, że nic nie zmienia ... także, aby było jasne: z wiersza poleceń - $ curl -O http://test.s3.amazonaws.com/file.zip również powoduje błąd pamięci, który moim zdaniem jest problem. Może to być fałszywy błąd, którego nie znam, mam prośbę o wsparcie w Heroku – bonez