我正在尝试检测到一个图像的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/