如何在Linux服务器上使用PHP CURL获得图像的有效响应代码?


How do I get a valid response code for an image using PHP CURL on a Linux server?

我正在尝试检测到一个图像的URL是否有效,在防火墙后面或在经过身份验证的区域后面。下面是我写的函数:

private function pingImg($img){
    $found = FALSE;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $img);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_NOBODY, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_TIMEOUT, 7); 
    $result = curl_exec($curl);
    if($result !== false){
        if(curl_getinfo($curl, CURLINFO_HTTP_CODE) == "401"){
            $found = TRUE;
            $this->_httpBasicAuthImages = TRUE;
        } 
        //now check for invalid cert
        if(stripos($img, "https") !== FALSE){
            curl_close($curl);
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $img);
            curl_setopt($curl, CURLOPT_HEADER, true);
            curl_setopt($curl, CURLOPT_NOBODY, true);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
            curl_setopt($curl, CURLOPT_TIMEOUT, 7); 
            $result = curl_exec($curl);
            if(!$result) {
                $found = TRUE;
                $this->_invalidSSL = TRUE;
            }
        }
    } else {
        //stalled ping, probably behind a firewall
        $found = TRUE;
        $this->_firewallImg = TRUE;
    }
    curl_close($curl);
    return $found;
}

该代码在我们的开发Windows服务器上工作得很好(返回所有正确的响应代码),但不幸的是它不能在我们的生产Linux服务器上工作。当映像位于经过身份验证的区域后面时,Linux服务器上基本上不会返回响应代码(即401状态码)。回答是空白的。

有人遇到同样的问题吗?如果是这样,我如何修复它,以便在我们的Linux服务器上返回正确的响应代码?

感谢您的宝贵时间。

好的,我找到了一个解决方案。我不确定它是最优雅的(我宁愿使用CURL),但它可以在Linux服务器上工作:

@file_get_contents($img, NULL, stream_context_create(array('http'=>array('method' => "HEAD",'follow_location' => 0,'timeout'=>7))));
    if (!empty($http_response_header)){
        $code = "";
        sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code);
        if($code == "401"){ 
            $found = TRUE;
            $this->_httpBasicAuthImages = TRUE;
        }}

我希望这对遇到同样问题的人有所帮助。

有关新功能的更多详细信息可在以下页面找到:http://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/