php - 如何在 PHP 中对大文件进行 base64 解码

标签 php memory base64

我的 PHP 网络应用程序有一个 API,可以接收相当大的 base64 编码文件(最大 32 MB)。目标是将这些文件写入我的文件系统中的某处。当然解码了。执行此操作所需资源最少的方法是什么?

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

使用 PHP 自己的 base64_decode() 并没有削减它,因为它使用了很多内存,所以我一直遇到 PHP 的内存限制(我知道,我可以提高该限制,但我没有允许 PHP 每个进程使用 256MB 左右感觉很好。

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

最佳答案

尽管这个答案已经被接受,但我有一个不同的建议。

如果您从 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);

好处:

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

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

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

关于php - 如何在 PHP 中对大文件进行 base64 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888461/

相关文章:

php - 通过 JSON 将 PHP 数组传递到 Javascript 以更新 Google Chart

memory - CoreOS单容器高内存使用率

java - BASE64Encoder 结果从 Windows 到 Unix 不同

c# - 将图像转换为base64的方法的性能

php - Symfony Doctrine findBy 然后映射

php - ExtJS 4 网格 : display nested data models with associations

php - 区分大小写的查询

c - strcat_s() 是否需要使用 realloc()?

c - 我的 64 位机器每个内存位置只能存储 4 个字节

angular - 用于返回图像 URL Angular 6 的 Base64 版本的管道