【问题标题】:check if image exist taking much time if image is not valid如果图像无效,检查图像是否存在需要很长时间
【发布时间】:2018-06-11 20:33:43
【问题描述】:

我有一个功能可以检查图像是否有效,以及是否在屏幕上打印图像。

<?php
function isImage($url){

$url_headers=get_headers($url, 1);

if($url_headers[0] == 'HTTP/1.1 404 Not Found') {
   $url_exists = false;
} 
else {
    $url_exists = true;
}

if($url_exists){
    if(isset($url_headers['Content-Type'])){
        $type=strtolower($url_headers['Content-Type']);

        $valid_image_type=array();
        $valid_image_type['image/png']='';
        $valid_image_type['image/jpg']='';
        $valid_image_type['image/jpeg']='';
        $valid_image_type['image/jpe']='';
        $valid_image_type['image/gif']='';

        if(isset($valid_image_type[$type])){
            return true;
        }
        else{
            return false;
        }
    }
}
}

if(isImage("http://curiosidadeslegais.org/wp-content/uploads/2016/08/zuera-pa-w5app.jpg")){
echo '<img src="http://curiosidadeslegais.org/wp-content/uploads/2016/08/zuera-pa-w5app.jpg" alt="">';
}

问题是我不知道为什么页面在上面的 url 中花了这么长时间。图像不再存在。和 html 打印:

<html>
<head>
<meta name="robots" content="noarchive" />
<meta name="googlebot" content="nosnippet" />
</head>
<body>
<div align=center>
<h3>Error. Page cannot be displayed. Please contact your service provider for more details.  (9)</h3>
</div>
</body>
</html>

我不知道为什么我的函数需要很长时间才能验证它不是图像并忽略它。任何想法为什么?

应该快速检查图像是否存在以打印或不打印。但在这种情况下,它需要很长时间。

【问题讨论】:

  • 换个图片试试吧...您提供的图片链接并没有直接链接到图片资源。
  • @JordanS 使用不同的图像。我要问的问题是,为什么在这种特殊情况下,要花费这么多时间才能使响应为假。此网址中没有图片,但 php 需要大约 30 秒才能回答错误。
  • 您似乎依赖于标题中的 404。如果某个站点正在为某个 url 提供自定义输出(例如那个)……由于某些原因,它实际上可能不包含正确的标题。它“慢”的一个可能原因是您正在点击的网址,正在等待以减慢机器人速度,或者它只是一个糟糕的服务器。
  • @IncredibleHat 有什么想法可以避免这种延迟吗?它正在破坏我的网站。
  • 你试过条件吗:if($url_headers[0] == 'HTTP/1.1 200 OK') { $url_exists = true; 然后... else $url_exists = false;

标签: php curl


【解决方案1】:

file_get_contents 可以返回标头并设置最大超时。

$options = stream_context_create(array('http'=>
array(
    "timeout" => 1, // one second
    "method" => "GET",
    "header" => "Accept-language: en\r\n" .
        "Cookie: foo=bar\r\n"
  )
));

$url_headers = file_get_contents($url, false, $options);

这是未经测试的,因为我正在手机上打字。

我在您的代码中注意到的另一件事是$url_exists = true; 为什么?为什么不将下面的代码向上移动并将上面的行替换为if($url_exists == true) 中的所有内容。
这不是代码慢的原因,但完全没有必要。

【讨论】:

    【解决方案2】:

    我添加这个是为了限制搜索图像的时间。我不知道这是否是最好的方法,但是...

    ini_set('default_socket_timeout', 5);
    

    【讨论】:

    • 你有没有尝试过我的建议?
    • @Andreas 我试过了!但我不知道为什么,超时不起作用。我不知道我是否将 $options 放在了正确的位置......或者什么。 ini_set 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多