我不知道如何解决您的问题ob_start()
,但是对于您正在做的事情,我有一个不涉及输出缓冲区的替代方案。
imagepng($imgSignature, 'php://memory/file.png');
$base64Signature = base64_encode(file_get_contents('php://memory/file.png'));
这基本上是将 png 图像保存到仅存在于内存中的虚拟临时文件中,然后将其读回并得到相同的结果。
我关于你的错误的理论:
在您的代码中的某个时刻,您将在内存中多次存储此图像。在 中$imgSignature
,您创建的内部缓冲区ob_start()
、您读取的缓冲区ob_get_contents()
以及 的结果值base64_encode()
。几乎都在一条线上。上帝只知道它使用了多少内存,更不用说您在安装此图像之前可能分配了更多资源。
重要的是不要同时分配太多的东西,特别是在处理像图像这样的内存消耗资源时。如果您unset()
或覆盖不再需要的变量,您将允许垃圾收集器完成其从内存中处理那些未引用资源的工作。
例如,您可以更改这段代码的编写方式:
ob_start();
imagepng($imgSignature);
imagedestroy($imgSignature);
$data = ob_get_contents();
ob_end_clean();
$data = base64_encode($data);
我越早放弃$imgSignature
我不再需要它,越早结束并清理我的缓冲区,我就越早完成从它那里得到我想要的东西,然后在我用我真正想要$data
的 base64 编码覆盖它时丢弃它。$data
现在这将使用更少的内存。如果您将其扩展到代码的其余部分,或者至少对使用大量内存的部分(例如您使用 GD2 库加载或创建的图像)执行此操作,您将优化脚本的内存使用,从而为您提供额外的你需要的空间。