PHP nasıl base64-decode büyük dosyaları

2 Cevap php

Benim PHP web uygulaması base64 şifreli olarak oldukça büyük dosyaları (32 MB) alıcaksınız bir API var. Amacım benim dosya sistemi üzerinde bir yerde bu dosyaları yazmak için. Tabii çözdü. Ne Bunu yapmanın en az kaynak yoğun şekilde olacaktır?

Edit: API ile dosyaları Recieving benim PHP uygulaması, olmayan bir yerde diskte 32 MB kaynak dosya bir 32MB dize var demektir. Ben bu dize dosya sistemi üzerine bir deşifre almak gerekiyor.

Kullandığı için PHP'nin kendi base64_decode Kullanma () kesim değil, bir lot bellek yüzden ben bu limiti yükseltmek olabilir, biliyorum (PHP'nin bellek sınırı içine çalıştırmaya devam ama ben izin hakkında iyi hissetmiyorum işlem başına 256MB ya da öylesine kullanmak için PHP).

Başka seçenekleri? Ben elle yapabilir miyiz? Veya kodlanmış diske dosya yazma ve bazı dış komut diyorsun? Herhangi bir düşünce?

2 Cevap

Bu kabul edilen bir yanıt olsa bile, ben farklı bir öneriniz var.

Eğer bir API verileri çekerek, bir değişkende tüm yükü depolamak gerekir. Eğilmiş veya başka bir HTTP fetchers kullanarak otomatik olarak bir dosyada saklayabilirsiniz.

Basit bir GET url yoluyla veri getiriliyor varsayarsak:

$url = 'http://www.example.com/myfile.base64';
$target = 'localfile.data';

$rhandle = fopen($url,'r');
stream_filter_append($rhandle, 'convert.base64-decode');

$whandle = fopen($target,'w');

stream_copy_to_stream($rhandle,$whandle);
fclose($rhandle);
fclose($whandle);

Yararları:

  • Hızlı olmalıdır (büyük değişkenlerin az kopyalama)
  • Çok az bellek yükü

Eğer geçici bir değişken gelen veri kapmak gerekir, ben bu yaklaşımı önerebilirsiniz:

$data = 'your base64 data';
$target = 'localfile.data';

$whandle = fopen($target,'w');
stream_filter_append($whandle, 'convert.base64-decode',STREAM_FILTER_WRITE);

fwrite($whandle,$data);

fclose($whandle);

Küçük parçalar halinde verilerin kodunu. Base64 veri dört karakter "Base256" üç bayt veri eşit.

Böylece grup her 1024 karakteri olabilir ve ikili veri 768 sekizli onları çözmek:

$chunkSize = 1024;
$src = fopen('base64.data', 'rb');
$dst = fopen('binary.data', 'wb');
while (!feof($src)) {
    fwrite($dst, base64_decode(fread($src, $chunkSize)));
}
fclose($dst);
fclose($src);