如何在PHP中对64位大型文件进行解码

San*_*hal 5 php memory base64

我的PHP Web应用程序有一个API,可以接收base64编码的合理大文件(最大32 MB).目标是在我的文件系统上的某处写入这些文件.当然是解码的.这样做资源最少的方法是什么?

编辑:通过API接收文件意味着我的PHP应用程序中有32MB字符串,而不是磁盘上某处的32 MB源文件.我需要将该字符串解码为文件系统.

使用PHP自己的base64_decode()并没有削减它,因为它使用了大量的内存,所以我一直在运行PHP的内存限制(我知道,我可以提高这个限制,但我不觉得允许PHP使用256MB左右每个过程).

还有其他选择吗?我可以手动完成吗?或者将文件写入磁盘编码并调用一些外部命令?任何想法?

Eve*_*ert 20

即使这有一个公认的答案,我也有不同的建议.

如果要从API中提取数据,则不应将整个有效内容存储在变量中.使用curl或其他HTTP提取程序,您可以自动将数据存储在文件中.

假设您通过简单的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);
Run Code Online (Sandbox Code Playgroud)

优点:

  • 应该更快(少复制巨大的变量)
  • 内存开销很小

如果你必须从临时变量中获取数据,我可以建议这种方法:

$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);
Run Code Online (Sandbox Code Playgroud)


Gum*_*mbo 11

以较小的块解码数据.Base64数据的四个字符等于"Base256"数据的三个字节.

因此,您可以将每个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);
Run Code Online (Sandbox Code Playgroud)