2

我尝试检测是否存在流(ogg 或 mp3 文件)。

我想使用 get_headers 但我注意到我的主机已禁用此功能。

我可以在 htaccess 中激活它,但由于某些原因它不能正常工作。

无论如何,我决定使用 cURL,如果我尝试检测 url 是否存在,它就会起作用:

$curl = curl_init();
        curl_setopt_array( $curl, array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL => 'http://stackoverflow.com' ) );
        curl_exec( $curl );
        $response_code = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
        curl_close( $curl );
        echo 'http://stackoverflow.com : response code '.$response_code.'<br />';
        if ($response_code == 200)
        { 
            echo 'url exists';
        } else {
            echo "url doesn't exist";
        }

它工作正常。我尝试使用错误的 url,响应代码为 0。

我不知道为什么它不适用于我的流,比如这个:

http://locus.creacast.com:9001/StBaume_grotte.ogg

我考虑过服务器问题,但我尝试过使用网上找到的其他流(例如:http ://radio.rim952.fr:8000/stream.mp3 ),但我仍然无法获得响应代码。

$curl_2 = curl_init();
        curl_setopt_array( $curl_2, array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL => 'http://locus.creacast.com:9001/StBaume_grotte.ogg' ) );
        curl_exec( $curl_2 );
        $response_code_2 = curl_getinfo( $curl_2, CURLINFO_HTTP_CODE );
        curl_close( $curl_2 );
        echo '<br /><br />http://locus.creacast.com:9001/StBaume_grotte.ogg : '.$response_code_2.'<br />';
        if ($response_code_2 == 200)
        { 
            echo 'url existe';
        } else {
            echo "url n'existe pas";
        }

所以我想这不是服务器问题,而是与 url / 文件的类型有关。

你知道我可以检查什么吗?即使文件存在,我的响应代码也始终为 0,并且获取响应代码的速度非常慢。

4

1 回答 1

1

您可以尝试使用以下代码来获取响应标头。您可以增加较慢 URL 的超时时间,但请记住,它也会影响您自己的页面加载。

$options['http'] = array(
  'method' => "HEAD", 
  'follow_location' => 0,
  'ignore_errors' => 1,
  'timeout' => 0.2
);

$context = stream_context_create($options);

$body = file_get_contents($url, NULL, $context);
if (!empty($http_response_header))
{
  //var_dump($http_response_header); 
  //to see what tou get back for usefull help

  if (substr_count($http_response_header[0], ' 404')>0)
    echo 'not found'
}

更新:

我注意到问题出在身体上。看起来即使有 HEAD 请求,它也会尝试下载所有内容。因此,我将请求更改为简单的fopen并且可以正常工作。

<?php
$url = 'http://radio.rim952.fr:8000/stream.mp3';

// Try and open the remote stream
if (!$stream = @fopen($url, 'r')) {
  // If opening failed, inform the client we have no content

  if (!empty($http_response_header))
  {
    var_dump($http_response_header); 
  }

  exit('Unable to open remote stream');
}

echo 'file exists';
?> 

我使用 rim952 url 进行了测试,因为另一个甚至不再在 Firefox 中加载。我通过将请求更改为 stream.mp3xx 以生成几乎立即出现的 404 来进行测试。

于 2013-03-12T13:12:10.183 回答