我使用以下代码创建图像并将其编码为base64。图像没有直接输出。
ob_start(); // catching the output buffer
imagepng($imgSignature);
$base64Signature=base64_encode(ob_get_contents());
ob_end_clean();
ob_start
最近开始抛出错误500,我无法搞清楚问题。服务器使用PHP 5.4.11。我真的不知道它是否运行与我安装脚本相同的版本,如果内存运行完全。我知道在整个php版本中ob_start已经改变了。我真的很难绕过这个。该脚本是否适用于PHP 5.4.11?
我非常感谢任何帮助。
答案 0 :(得分:2)
我不确定如何使用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 lib加载或创建的图像)进行扩展,则会优化脚本的内存使用量,从而为您提供额外的代码。你需要的空间。