gpt4 book ai didi

PHP:如何解决 ob_start() 结合 imagepng() 问题?

转载 作者:行者123 更新时间:2023-12-04 04:37:19 28 4
gpt4 key购买 nike

我使用以下代码创建图像并将其编码为 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 吗?

非常感谢任何帮助。

最佳答案

我不确定如何使用 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 加载或创建的图像,它应该优化脚本的内存使用,为您提供额外的您需要的空间。

关于PHP:如何解决 ob_start() 结合 imagepng() 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com