使用PHP获取图像

使用PHP获取图像,php,image,Php,Image,以这种方式检索图像是一种不好的做法吗?我有一个页面来调用这个脚本大约100次(有100个图像)。我会导致服务器过载或http请求过多吗?我的服务器有问题,我不知道这是否是原因:( 我从常规标记调用脚本,之所以通过PHP调用它们,是因为图像是用户私有的 非常感谢所有帮助!!有了这些,您将: 读取文件的内容 将该内容评估为内存中的图像 重新渲染该图像 如果您只想向用户发送一个映像(磁盘上的映像),为什么不直接使用,如下所示: header('Content-type: image/jpeg')

以这种方式检索图像是一种不好的做法吗?我有一个页面来调用这个脚本大约100次(有100个图像)。我会导致服务器过载或http请求过多吗?我的服务器有问题,我不知道这是否是原因:(

我从常规标记调用脚本,之所以通过PHP调用它们,是因为图像是用户私有的

非常感谢所有帮助!!

有了这些,您将:

  • 读取文件的内容
  • 将该内容评估为内存中的图像
  • 重新渲染该图像

如果您只想向用户发送一个映像(磁盘上的映像),为什么不直接使用,如下所示:

header('Content-type: image/jpeg');
readfile('../path/to/image/' . $_SESSION[ID] . '/thumbnail/' . $_GET[image]);
这样,您就可以:

  • 读文件
  • 并发送其内容
无需将其评估为图像,即可消除过程中的一些无用计算


作为旁注:您不应该在路径中这样使用
$\u GET[image]
:您必须确保没有恶意数据通过该参数注入

否则,任何人都有可能访问您服务器上的任何可能的文件…他们只需在
image
参数中指定一些相对路径…

通过此选项,您可以:

  • 读取文件的内容
  • 将该内容评估为内存中的图像
  • 重新渲染该图像

如果您只想向用户发送一个映像(磁盘上的映像),为什么不直接使用,如下所示:

header('Content-type: image/jpeg');
readfile('../path/to/image/' . $_SESSION[ID] . '/thumbnail/' . $_GET[image]);
这样,您就可以:

  • 读文件
  • 并发送其内容
无需将其评估为图像,即可消除过程中的一些无用计算


作为旁注:您不应该在路径中这样使用
$\u GET[image]
:您必须确保没有恶意数据通过该参数注入


否则,任何人都有可能访问您服务器上的任何可能的文件…他们只需在
image
参数中指定一些相对路径…

是的,这非常糟糕。您正在将.jpg解码为基于内存的位图(与原始二进制.jpg相比,该位图“巨大”),然后将位图重新压缩为jpeg

所以你在浪费大量的时间

a) 内存
b) CPU时间
c) 由于jpg是一种有损格式,因此会损失更多的图像质量

为什么不干脆做:

<?php
header('Content-type: text/jpeg');
readfile('/path/to/your/image.jpg');

是的,非常糟糕。您正在将.jpg解码为基于内存的位图(与原始二进制.jpg相比,该位图“巨大”),然后将位图重新压缩为jpeg

所以你在浪费大量的时间

a) 内存
b) CPU时间
c) 由于jpg是一种有损格式,因此会损失更多的图像质量

为什么不干脆做:

<?php
header('Content-type: text/jpeg');
readfile('/path/to/your/image.jpg');

回答问题中的两个特定问题

我会导致服务器过载或http请求过多吗

当然可以。
通过大量HTTP请求和图像处理。
您必须减少图像数量并实施一些分页,以便在较小的包中显示图像。
您还可以实现一些有条件的GET功能,以减少带宽和负载。
如果情况继续恶化,并且有一些资源要处理,请考虑安装一些内容分发代理。带有X-Accel-Redirect标头的nginx是一个常见的示例

我的服务器有问题,我不知道这是否是原因:(


那么你就不应该在黑暗中拍摄了。请先对你的网站进行简介。

回答你问题中的两个特定问题

我会导致服务器过载或http请求过多吗

当然可以。
通过大量HTTP请求和图像处理。
您必须减少图像数量并实施一些分页,以便在较小的包中显示图像。
您还可以实现一些有条件的GET功能,以减少带宽和负载。
如果情况继续恶化,您有一些资源要处理,请考虑安装一些内容分发代理。 我的服务器有问题,我不知道这是否是原因:(


那么你就不应该在黑暗中拍摄了。请先分析一下你的网站。

谢谢,我将用readfile替换我的代码:-)至于安全问题,我刚刚发布了一个简单版本的代码,但还是要感谢!!非常有帮助:)@Mathias:上面的例子并不比你的更安全。至少在$_GET参数上应用
basename()
。@mario它确实不太安全,因为我只是复制粘贴了他使用的路径,没有添加任何额外的检查——这就是为什么我在回答的末尾添加了与安全性相关的侧注(即使与问题无关,我也觉得不会有什么坏处);;看到Mathias的评论,我认为他的代码更安全,但他没有发布检查内容(至少,我希望如此)谢谢,我将用readfile替换我的代码:-)至于安全问题,我只是发布了一个简单版本的代码,但无论如何谢谢!!极大的帮助:)@Mathias:上面的例子并不比你的更安全。至少在$_GET参数上应用
basename()
。@mario它确实不太安全,因为我只是复制粘贴了他使用的路径,没有添加任何额外的检查——这就是为什么我在回答的末尾添加了与安全性相关的侧注(即使与问题无关,我也觉得不会有什么坏处);;看到Mathias的评论,我认为他的代码更安全,但他没有发布检查内容(至少,我希望如此),服务器防ddos攻击系统启动并阻止了我。但是readfile()也是一个重要的观点!服务器防ddos攻击系统启动并阻止了我。但是readfile()也是一个重要的观点!