2014-12-23 6 views
2

Я разработал платформу контента для веб-приложений, которая позволяет пользователям искать и загружать (большие) видеофайлы. Они также могут смотреть файл непосредственно в браузере. Чтобы сделать некоторое управление доступом, я не указываю их непосредственно на файлы mp4/webm, вместо этого используя PHP-скрипт для обработки этого. Мой код в основном на основе примера, приведенного на http://www.media-division.com/php-download-script-with-resume-option/Прерывает ли PHP-скрипт, когда клиент отключается?

Snippet:

set_time_limit(0); 
    fseek($file, $seek_start); 

    while(!feof($file)) 
    { 
     print(@fread($file, 1024*8)); 
     ob_flush(); 
     flush(); 
     if (connection_status()!=0) 
     { 
      @fclose($file); 
      exit; 
     }   
    } 

Это в основном определяет время выполнения для неограниченного (больших файлов), читает файл последовательно и толкает его к клиенту. Мой вопрос: отменяет ли сценарий, когда клиент прерывает загрузку? Например, при потоковой передаче видео с помощью видеопроигрывателя HTML5 и прекращения просмотра.

ignore_user_abort отключен по умолчанию, и я не включил его в свою конфигурацию. Но функция line connection_status() проверяет, жива ли соединение, и прерывает сценарий, если это не так (я думаю).

+2

Прочитайте это: http://php.net/manual/en/function.ignore -user-abort.php – vaso123

+0

Это не связано с PHP, а скорее с тем, как вызывается PHP (то есть, вероятно, веб-сервер в вашем случае). Сам PHP может работать в течение нескольких часов без каких-либо проблем. –

+0

RTFM: http://php.net/manual/en/function.ignore-user-abort.php –

ответ

0

От documentation:

PHP не обнаружит, что пользователь прервал соединение, пока Попыток для передачи информации клиенту. Простое использование инструкции echo не гарантирует отправку этой информации, см. flush().

Так что я бы сказал, как только пользователь прерывается, и вы называете это две линии:

ob_flush(); 
flush(); 

скрипт будет остановлен. Я не думаю, что эта часть будет выполнена:

if (connection_status()!=0) 
{ 
    @fclose($file); 
    exit; 
} 

Вы проверили его? Есть ли причина, почему вы могли предположить, что это не так?

Вы можете просто написать файл журнала, чтобы подтвердить, если вы не в состоянии видеть текущие процессы (Shared Hosting)