您的性能问题可能是由于get_headers()
. 此函数向指定的 URL 发出 HTTP 请求。
您可以通过编写一个测试程序来证明这一点,该程序简单地对有get_headers()
问题的 URL 执行一系列操作,而无需循环。例如:
<?php
get_headers('http://example.com/image1.png');
get_headers('http://example.com/image2.png');
get_headers('http://example.com/image3.png');
get_headers('http://example.com/image4.png');
get_headers('http://example.com/image5.png');
?>
我的猜测是,这个简单程序的运行时间几乎与您现有的循环一样长,这将证明这是您的性能问题所在。
目前还不清楚你为什么要get_headers()
打电话。您没有包含任何使用$data
. 如果你可以完全避免这样做,我会推荐它,因为任何对外部 URL 的调用都会很慢;但是循环执行会非常慢。
请记住,PHP 不会像浏览器那样快速加载它们,因为 PHP 是连续加载它们的——一个接一个,而浏览器会同时加载它们。您的 PHP 程序必须等待服务器发送完整的响应,然后 PHP 才能继续运行您的代码的下一行。这意味着您的程序的性能完全取决于与远程服务器的连接速度。并且这种依赖性乘以图像的数量。不是很好; 难怪你的程序很慢。
此外,您不允许使用src
不是完整 URL 的图像属性。例如,它可能只是/image5.png
,没有域名。这会令人困惑get_headers()
,并且可能会使您的程序更慢。
简而言之,您应该尝试摆脱对get_headers()
. 如果您无法摆脱它,也许您可以将它包装在某种本地缓存中,以便您的程序可以先检查那里,看看它之前是否加载了该文件;这至少可以省去您通过网络重复重复呼叫的麻烦。
希望有帮助。
题外话,但我觉得我应该指出循环中的其他一些潜在问题:
你打$tag->getAttribute('src')
了两次电话。这个调用不会是一个大的性能问题,但是由于您将它保存到一个变量 ( $op7
),您不妨先这样做,然后$op7
在get_headers()
调用中使用。这将使您的程序不必进行重复的方法调用。确实是小豆子,但即使是小东西在循环中也会累加起来,修复它不会对您的功能产生任何影响。
.sql 注入问题$op7
。将其用作 SQL 字符串的一部分时,您需要对其进行转义。从代码中不清楚 HTML 是否来自受信任的来源。如果不是,那么计算出您正在做什么的人可能会编写他们的页面,以便他们的图像文件名包含可能入侵您的站点的 SQL 代码。即使您确实信任该页面,您的代码也不允许文件名包含引号。
这些mysql_xxx()
功能已弃用。建议改用 PDO 库。
请注意,在某些服务器上,该file_get_contents()
功能可能会被禁用以用于外部链接。