2017-10-11 105 views
0

我目前有一个脚本,它使用curl来检查每次用户访问页面时大约3000个图像的文件大小。这是因为每次内容可能会改变。PHP比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秒的加载时间每次用户访问该页面。

任何建议/帮助?谢谢

+3

将其作为后台进程运行,而不是作为Web请求的一部分 –

+1

您可以使用memcache或其他方式来存储图像URL重新路由的集合。定期后台服务(PHP脚本)可以定期运行以检查文件大小并将重新路由的URL添加到memcache。您可以获取在memcache中查找的函数的图像URL,如果找到则返回键,否则返回原始URL。 – jcorry

+0

谢谢Mark Ba​​ker和Jcorry。原来的url实际上存储在mysql中,但只有url,没有大小信息。这将消除对memcache的需求? –

回答

0

正如其他人在评论中提出的建议,我会创建一个后台进程来检查文件大小并更新与请求完全分开的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改编。)

然后当这一切都做,你可以做一个AJAX POST到你的Web应用程序更新的MySQL如果需要的话。同时请记住,这将尝试向托管映像的服务器发出多个并发请求,因此可能会对性能产生影响。

+0

谢谢Matt,我会尝试使用Javascript/Ajax,因为卷曲一切似乎都失速,这可能是最好的选择。会说点什么a.s.a.p. –