Возникла проблема с чтением кода ответа HTTP для потока (работает с обычным URL-адресом)

Я пытаюсь определить, существует ли поток (файл 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, даже если файл существует, и получить код ответа очень медленно.


person Sébastien Gicquel    schedule 12.03.2013    source источник


Ответы (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';
?> 

Я тестировал с URL-адресом rim952, потому что другой здесь даже больше не загружается в Firefox. Я проверил, изменив запрос на stream.mp3xx, чтобы сгенерировать 404, который приходит почти мгновенно.

person Hugo Delsing    schedule 12.03.2013
comment
Спасибо, ваш ответ мне помогает. Итак, чтобы использовать ваше решение, мне пришлось активировать allow_url_fopen. После этого у меня ошибка не удалось открыть поток: Время ожидания подключения истекло. Итак, я думаю, теперь проблема связана со временем, которое требуется для получения кода ответа. Чего я не понимаю, если я пытаюсь открыть URL-адрес потока, соединение работает и оно быстрое, но если я пытаюсь получить код ответа, оно очень медленное и есть тайм-аут. - person Sébastien Gicquel; 12.03.2013