7

私のPHPWebアプリケーションには、base64でエンコードされた適度に大きなファイル(最大32 MB)を受信できるAPIがあります。目標は、これらのファイルをファイルシステムのどこかに書き込むことです。もちろんデコードされます。これを行うための最もリソースを消費しない方法は何でしょうか?

編集: APIを介してファイルを受信するということは、PHPアプリに32 MBの文字列があり、ディスク上のどこかに32MBのソースファイルがないことを意味します。その文字列をファイルシステムにデコードする必要があります。

PHP独自のbase64_decode()を使用しても、大量のメモリを使用するため、それを削減できません。そのため、PHPのメモリ制限にぶつかり続けます(この制限を引き上げることはできますが、PHPで256MB程度を使用できるようにするのは気が進まないです。プロセスごと)。

他のオプションはありますか?手動でできますか?または、エンコードされたディスクにファイルを書き込み、外部コマンドを呼び出しますか?何か考えはありますか?

4

3 に答える 3

23

これには受け入れられた答えがありますが、別の提案があります。

API からデータを取得する場合、ペイロード全体を変数に格納しないでください。curl またはその他の HTTP fetcher を使用すると、データを自動的にファイルに保存できます。

単純な GET URL を介してデータを取得していると仮定します。

$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);

利点:

  • より高速にする必要があります(巨大な変数のコピーが少なくなります)
  • メモリーのオーバーヘッドが非常に少ない

一時変数からデータを取得する必要がある場合は、次のアプローチをお勧めします。

$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);
于 2009-05-21T20:51:00.707 に答える
11

より小さなチャンクでデータをデコードします。Base64 データの 4 文字は、「Base256」データの 3 バイトに相当します。

したがって、各 1024 文字をグループ化し、768 オクテットのバイナリ データにデコードできます。

$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);
于 2009-05-20T15:05:16.637 に答える