2

我使用以下代码创建图像并将其编码为 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。我真的不知道它是否运行与我安装脚本相同的版本,内存是否已满。我知道 ob_start 在整个 php 版本中都发生了变化。我真的很难理解这一点。该脚本是否适用于 php 5.4.11?

我真的很感激任何帮助。

4

1 回答 1

4

我不知道如何解决您的问题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 库加载或创建的图像)执行此操作,您将优化脚本的内存使用,从而为您提供额外的你需要的空间。

于 2013-10-22T21:43:52.693 回答