【问题标题】:PHP anything faster than curl to check remote image file size about 3000 times?PHP 比 curl 更快地检查远程图像文件大小约 3000 次?
【发布时间】:2018-03-23 02:24:11
【问题描述】:

我目前有一个脚本,每次用户访问该页面时,该脚本使用 curl 检查大约 3000 张图像的文件大小。这是因为每次内容都可能发生变化。

如果它匹配 7442 字节的大小,它会更改图像的路径,如果不匹配,则保持它的源。

图像 URL 存储在 $variable、mysql 以及远程和本地 xml 文件中。但是图像本身总是远程存储的。

$image = 'http://remoteserver.com/user22.jpg';
//Check if all thumbs are ok real and available
$ch = curl_init($image);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);

$data = curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
curl_close($ch);
if($size == 7442){
    echo '<img src="https://www.newdomain.com/tmp.jpg" height="190.11"/></a>';
} else {
    echo '<img src="' . $image . '" alt="' . $user . '" /></a>';
}

当它被激活时,页面加载大约需要 40 秒,当它被注释掉时,它需要 3 秒。但是每次任何用户访问网页时都会执行它,或者如果我在将数据添加到 mysql 并更改 mysql 中的地址之前执行 curl,它会导致将该信息加载到该 mysql 时出现巨大延迟,因此不会显示所有图像。

我知道有很多取决于此检查,包括服务器响应时间、php 配置等等。但我真的需要此图像文件检查才能工作,并且无法承受每次 40 秒的加载时间用户访问页面的时间。

有什么建议/帮助吗?谢谢

【问题讨论】:

  • 将其作为后台进程运行,而不是作为 Web 请求的一部分
  • 您可以使用 memcache 或其他东西来存储图像 URL 重新路由的集合。计划的后台服务(PHP 脚本)可以定期运行以检查文件大小并将重新路由的 URL 添加到内存缓存。您将获得一个函数的图像 URL,该函数在 memcache 中查找,如果找到则返回密钥,否则返回原始 URL。
  • 谢谢 Mark Ba​​ker 和 Jcorry。原来的 urls 实际上是存储在 mysql 中的,但只有 url,没有大小信息。那将消除对 memcache 的需求?

标签: php mysql curl http-headers filesize


【解决方案1】:

正如其他人在 cmets 中所建议的那样,我将创建一个后台进程来检查文件大小并完全独立于页面请求来更新 mysql。如果多个用户请求相同的图像,这会更有效。

但是,如果确实需要在页面加载时完成,另一个更好的用户体验选择是从浏览器进行检查。使用存储的图像路径加载页面,然后使用 JS 请求文件大小并根据需要更改图像路径。例如

var images = document.getElementsByTagName('img'); 
for(var i = 0; i < images.length; i++) {
    var xhr = new XMLHttpRequest();
    xhr.open("HEAD", images[i].src, true);
    xhr.onreadystatechange = function() {
        if (this.readyState == this.DONE) {
            if (parseInt(xhr.getResponseHeader("Content-Length"))) === 7442) {
                images[i].src = 'https://www...'; // New path
            }
        }
    };
    xhr.send();
}

(未经测试,但你明白了。改编自another SO answer。)

然后,当这一切都完成后,您可以向您的 Web 应用程序发送一个 AJAX POST 以在需要时更新 MySQL。另请注意,这会尝试向托管图像的服务器发出许多并发请求,因此可能会对性能产生影响。

【讨论】:

  • 谢谢你,Matt,我会尝试使用 Javascript/Ajax,因为 curl 似乎一切都停止了,这可能是最好的选择。会马上说些什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多