【问题标题】:How to output a large image to the browser using PHP?如何使用 PHP 将大图像输出到浏览器?
【发布时间】:2011-07-25 02:57:37
【问题描述】:

我使用 PHP 动态生成了一个非常大的图像并输出到浏览器。 (它宽 5000 像素,高 1000-2000 像素。这是我网站上的每日用户活动图)。

问题是现在情节太大了,PHP脚本出现内存耗尽错误(生成的PNG本身非常小),因此我无法获取图像。

有没有办法使用 GD 以 PNG 格式将这个大图像分成多个部分输出?

(ps:我运行站点的主机使用安全模式,所以我无法修改配置,我认为他们使用的是默认的PHP安装。)

EDIT1:这是一个管理脚本。除了我,没有用户看到它。

EDIT2:示例图片可以在这里看到:http://users.atw.hu/calmarius/trash/wtfb2/x.png (我还可以选择按 IP 地址对曲目进行分组。)

每个用户+IP 对都有自己的 24 小时轨迹。每个绿色标记都表示一个用户活动。如您所见,此图像可以逐轨输出。并且不需要一次输出和生成整个东西。

这个网站将是一个在线策略游戏,我想在未来使用这个图表来简化多账户的检测。 (试图通过注册多个帐户而不是只有 1 个帐户来获得优势的用户。)但这是一个不同的问题。

我正在使用 PHP 脚本,因为我懒得从数据库中导出请求日志,下载它并将数据提供给可以为我绘制绘图的程序。 ;)

【问题讨论】:

  • 指定你得到什么样的错误???...
  • “致命错误:第67行的getactivityplot.php中允许的内存大小为25165824字节耗尽(试图分配40840字节)”(故意增加图像大小以引发它。)
  • 为什么要生成比您的任何用户可能正在运行的最高屏幕分辨率大很多倍的图像?
  • 没有用户看到它。这是一个管理脚本。我每天都下载它并在图像查看器中打开它,然后滚动它。
  • 您是否 (a) 想解决内存耗尽错误或 (b) 生成内存受限的图像?

标签: php image plot gd large-data


【解决方案1】:

在处理图像之前将内存限制设置为无限制。

ini_set('memory_limit', '-1');

【讨论】:

  • 这将是一个短期解决方案。但也许将来整个系统内存可能太小而无法制作图像......
【解决方案2】:

说明您如何生成图像(GD 库、ImageMagick)以及如何输出它会有所帮助。您是否将文件保存到目录,然后使用 readfile() 输出它?如果是,fopen / fread / echo 组合比使用 readfile() 将文件输出到浏览器快大约 50%-60%。你使用gzip压缩吗? php执行的时间限制是多少?您收到的确切错误消息是什么?

【讨论】:

  • 添加了一个示例图像。我正在使用 GD 库。我使用 imagecreatetruecolor 创建图像并使用 imagepng 将其直接输出到浏览器。我问这个问题是因为似乎没有(或者我忽略了 sg)gd fn 可以输出多个部分的图像,只能输出一次。
  • PHP 时间限制是 10 秒,这还不是问题。
  • 如果您还没有这样做,那么如何将整个内容输出到文件而不是浏览器,然后直接访问图像?可能发生的另一件事是您的服务器负载不足,并且确实没有足够的内存来分配以输出该死的东西:)
  • 生成图片时出现错误。连imagecreatetruecolor都无法执行,因为图片太大了。
  • 表示您使用的服务器负载过重,无法分配您需要的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多