Chrome issue - video stream & session conflict












11















I have a problem with the implementation of videos in javascript and php.



index.php



session_start()

// do other stuff
include ‘video.php’


video.php



<?php
If(!$_REQUEST[‘play’]){
// displaying video.html
}
else
{
// play video
$fp = @fopen($file, 'rb');

$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte

// Now that we've gotten so far without errors we send the accept range header

/* At the moment we only support single ranges.
* Multiple ranges requires some more work to ensure it works correctly
* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
*
* Multirange support annouces itself with:
* header('Accept-Ranges: bytes');
*
* Multirange content must be sent with multipart/byteranges mediatype,
* (mediatype = mimetype)
* as well as a boundry header to indicate the various chunks of data.
*/

header('Content-type: video/mp4');
header('Accept-Ranges: bytes');
// multipart/byteranges
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
if (isset($_SERVER['HTTP_RANGE'])){
$c_start = $start;
$c_end = $end;
// Extract the range string
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
// Make sure the client hasn't sent us a multibyte range
if (strpos($range, ',') !== false){
// (?) Shoud this be issued here, or should the first
// range be used? Or should the header be ignored and
// we output the whole content?
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
if ($range{0} == '-'){
// The n-number of the last bytes is requested
$c_start = $size - substr($range, 1);
} else {
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
} // fim do if
/* Check the range and make sure it's treated according to the specs.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*/
// End bytes can not be larger than $end.
$c_end = ($c_end > $end) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size){
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
} // fim do if

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");
// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end){
if ($p + $buffer > $end){
// In case we're only outputtin a chunk, make sure we don't
// read past the length
$buffer = $end - $p + 1;
} // fim do if
set_time_limit(0); // Reset time limit for big files
echo fread($fp, $buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
} // fim do while
fclose($fp);
exit();
}


video.html



<!doctype html>
<html lang="fr-FR">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<video controls>
<source src="index.php?format=mp4&play=1&id=someid type="video/mp4" />
</video>
</body>
</html>


Everything works fine but for some reason I don't know, when I start playing a video and then click on a link on my page or use the browser's back button, the browser freezes and waits a while ( variable ) before following the link.



The profiler indicates that the requested page change is in pending status.



If I position the video cursor further away, the browser unlocks instantly and follows the link I clicked.



And finally if I reload that page, the issue doesn't appears anymore. Seems that chrome wait something but it's not cache since my cache is disabled.



This occurs only with chrome desktop, all others browsers do the job correctly.



** EDIT **



I found the problem's origin.



To play my video I go through my main file index.php which serves as my router in which I initialize the session with session_start().



When the video is playing and I click on a link or the back button of my browser, I go back to index.php. This is when chrome gets stuck during the session_start()



It looks like there's a conflict with the sessions as long as the video is playing.










share|improve this question




















  • 3





    Have a look at ma.ttias.be/…

    – Nico Haase
    Nov 14 '18 at 16:00











  • Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

    – akio
    Nov 14 '18 at 16:40






  • 1





    Unlock it at soon as possible - put heavy loaded stuff behind closing it

    – Nico Haase
    Nov 14 '18 at 16:43











  • Do you have any ideas why this occurs only with chrome ?

    – akio
    Nov 14 '18 at 18:08
















11















I have a problem with the implementation of videos in javascript and php.



index.php



session_start()

// do other stuff
include ‘video.php’


video.php



<?php
If(!$_REQUEST[‘play’]){
// displaying video.html
}
else
{
// play video
$fp = @fopen($file, 'rb');

$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte

// Now that we've gotten so far without errors we send the accept range header

/* At the moment we only support single ranges.
* Multiple ranges requires some more work to ensure it works correctly
* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
*
* Multirange support annouces itself with:
* header('Accept-Ranges: bytes');
*
* Multirange content must be sent with multipart/byteranges mediatype,
* (mediatype = mimetype)
* as well as a boundry header to indicate the various chunks of data.
*/

header('Content-type: video/mp4');
header('Accept-Ranges: bytes');
// multipart/byteranges
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
if (isset($_SERVER['HTTP_RANGE'])){
$c_start = $start;
$c_end = $end;
// Extract the range string
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
// Make sure the client hasn't sent us a multibyte range
if (strpos($range, ',') !== false){
// (?) Shoud this be issued here, or should the first
// range be used? Or should the header be ignored and
// we output the whole content?
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
if ($range{0} == '-'){
// The n-number of the last bytes is requested
$c_start = $size - substr($range, 1);
} else {
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
} // fim do if
/* Check the range and make sure it's treated according to the specs.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*/
// End bytes can not be larger than $end.
$c_end = ($c_end > $end) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size){
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
} // fim do if

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");
// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end){
if ($p + $buffer > $end){
// In case we're only outputtin a chunk, make sure we don't
// read past the length
$buffer = $end - $p + 1;
} // fim do if
set_time_limit(0); // Reset time limit for big files
echo fread($fp, $buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
} // fim do while
fclose($fp);
exit();
}


video.html



<!doctype html>
<html lang="fr-FR">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<video controls>
<source src="index.php?format=mp4&play=1&id=someid type="video/mp4" />
</video>
</body>
</html>


Everything works fine but for some reason I don't know, when I start playing a video and then click on a link on my page or use the browser's back button, the browser freezes and waits a while ( variable ) before following the link.



The profiler indicates that the requested page change is in pending status.



If I position the video cursor further away, the browser unlocks instantly and follows the link I clicked.



And finally if I reload that page, the issue doesn't appears anymore. Seems that chrome wait something but it's not cache since my cache is disabled.



This occurs only with chrome desktop, all others browsers do the job correctly.



** EDIT **



I found the problem's origin.



To play my video I go through my main file index.php which serves as my router in which I initialize the session with session_start().



When the video is playing and I click on a link or the back button of my browser, I go back to index.php. This is when chrome gets stuck during the session_start()



It looks like there's a conflict with the sessions as long as the video is playing.










share|improve this question




















  • 3





    Have a look at ma.ttias.be/…

    – Nico Haase
    Nov 14 '18 at 16:00











  • Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

    – akio
    Nov 14 '18 at 16:40






  • 1





    Unlock it at soon as possible - put heavy loaded stuff behind closing it

    – Nico Haase
    Nov 14 '18 at 16:43











  • Do you have any ideas why this occurs only with chrome ?

    – akio
    Nov 14 '18 at 18:08














11












11








11








I have a problem with the implementation of videos in javascript and php.



index.php



session_start()

// do other stuff
include ‘video.php’


video.php



<?php
If(!$_REQUEST[‘play’]){
// displaying video.html
}
else
{
// play video
$fp = @fopen($file, 'rb');

$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte

// Now that we've gotten so far without errors we send the accept range header

/* At the moment we only support single ranges.
* Multiple ranges requires some more work to ensure it works correctly
* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
*
* Multirange support annouces itself with:
* header('Accept-Ranges: bytes');
*
* Multirange content must be sent with multipart/byteranges mediatype,
* (mediatype = mimetype)
* as well as a boundry header to indicate the various chunks of data.
*/

header('Content-type: video/mp4');
header('Accept-Ranges: bytes');
// multipart/byteranges
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
if (isset($_SERVER['HTTP_RANGE'])){
$c_start = $start;
$c_end = $end;
// Extract the range string
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
// Make sure the client hasn't sent us a multibyte range
if (strpos($range, ',') !== false){
// (?) Shoud this be issued here, or should the first
// range be used? Or should the header be ignored and
// we output the whole content?
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
if ($range{0} == '-'){
// The n-number of the last bytes is requested
$c_start = $size - substr($range, 1);
} else {
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
} // fim do if
/* Check the range and make sure it's treated according to the specs.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*/
// End bytes can not be larger than $end.
$c_end = ($c_end > $end) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size){
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
} // fim do if

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");
// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end){
if ($p + $buffer > $end){
// In case we're only outputtin a chunk, make sure we don't
// read past the length
$buffer = $end - $p + 1;
} // fim do if
set_time_limit(0); // Reset time limit for big files
echo fread($fp, $buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
} // fim do while
fclose($fp);
exit();
}


video.html



<!doctype html>
<html lang="fr-FR">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<video controls>
<source src="index.php?format=mp4&play=1&id=someid type="video/mp4" />
</video>
</body>
</html>


Everything works fine but for some reason I don't know, when I start playing a video and then click on a link on my page or use the browser's back button, the browser freezes and waits a while ( variable ) before following the link.



The profiler indicates that the requested page change is in pending status.



If I position the video cursor further away, the browser unlocks instantly and follows the link I clicked.



And finally if I reload that page, the issue doesn't appears anymore. Seems that chrome wait something but it's not cache since my cache is disabled.



This occurs only with chrome desktop, all others browsers do the job correctly.



** EDIT **



I found the problem's origin.



To play my video I go through my main file index.php which serves as my router in which I initialize the session with session_start().



When the video is playing and I click on a link or the back button of my browser, I go back to index.php. This is when chrome gets stuck during the session_start()



It looks like there's a conflict with the sessions as long as the video is playing.










share|improve this question
















I have a problem with the implementation of videos in javascript and php.



index.php



session_start()

// do other stuff
include ‘video.php’


video.php



<?php
If(!$_REQUEST[‘play’]){
// displaying video.html
}
else
{
// play video
$fp = @fopen($file, 'rb');

$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte

// Now that we've gotten so far without errors we send the accept range header

/* At the moment we only support single ranges.
* Multiple ranges requires some more work to ensure it works correctly
* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
*
* Multirange support annouces itself with:
* header('Accept-Ranges: bytes');
*
* Multirange content must be sent with multipart/byteranges mediatype,
* (mediatype = mimetype)
* as well as a boundry header to indicate the various chunks of data.
*/

header('Content-type: video/mp4');
header('Accept-Ranges: bytes');
// multipart/byteranges
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
if (isset($_SERVER['HTTP_RANGE'])){
$c_start = $start;
$c_end = $end;
// Extract the range string
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
// Make sure the client hasn't sent us a multibyte range
if (strpos($range, ',') !== false){
// (?) Shoud this be issued here, or should the first
// range be used? Or should the header be ignored and
// we output the whole content?
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
if ($range{0} == '-'){
// The n-number of the last bytes is requested
$c_start = $size - substr($range, 1);
} else {
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
} // fim do if
/* Check the range and make sure it's treated according to the specs.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
*/
// End bytes can not be larger than $end.
$c_end = ($c_end > $end) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size){
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
// (?) Echo some info to the client?
exit;
} // fim do if

$start = $c_start;
$end = $c_end;
$length = $end - $start + 1; // Calculate new content length
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
} // fim do if

// Notify the client the byte range we'll be outputting
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: $length");
// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end){
if ($p + $buffer > $end){
// In case we're only outputtin a chunk, make sure we don't
// read past the length
$buffer = $end - $p + 1;
} // fim do if
set_time_limit(0); // Reset time limit for big files
echo fread($fp, $buffer);
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
} // fim do while
fclose($fp);
exit();
}


video.html



<!doctype html>
<html lang="fr-FR">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<video controls>
<source src="index.php?format=mp4&play=1&id=someid type="video/mp4" />
</video>
</body>
</html>


Everything works fine but for some reason I don't know, when I start playing a video and then click on a link on my page or use the browser's back button, the browser freezes and waits a while ( variable ) before following the link.



The profiler indicates that the requested page change is in pending status.



If I position the video cursor further away, the browser unlocks instantly and follows the link I clicked.



And finally if I reload that page, the issue doesn't appears anymore. Seems that chrome wait something but it's not cache since my cache is disabled.



This occurs only with chrome desktop, all others browsers do the job correctly.



** EDIT **



I found the problem's origin.



To play my video I go through my main file index.php which serves as my router in which I initialize the session with session_start().



When the video is playing and I click on a link or the back button of my browser, I go back to index.php. This is when chrome gets stuck during the session_start()



It looks like there's a conflict with the sessions as long as the video is playing.







php http http-content-range






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 16:19







akio

















asked Oct 15 '18 at 19:10









akioakio

8214




8214








  • 3





    Have a look at ma.ttias.be/…

    – Nico Haase
    Nov 14 '18 at 16:00











  • Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

    – akio
    Nov 14 '18 at 16:40






  • 1





    Unlock it at soon as possible - put heavy loaded stuff behind closing it

    – Nico Haase
    Nov 14 '18 at 16:43











  • Do you have any ideas why this occurs only with chrome ?

    – akio
    Nov 14 '18 at 18:08














  • 3





    Have a look at ma.ttias.be/…

    – Nico Haase
    Nov 14 '18 at 16:00











  • Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

    – akio
    Nov 14 '18 at 16:40






  • 1





    Unlock it at soon as possible - put heavy loaded stuff behind closing it

    – Nico Haase
    Nov 14 '18 at 16:43











  • Do you have any ideas why this occurs only with chrome ?

    – akio
    Nov 14 '18 at 18:08








3




3





Have a look at ma.ttias.be/…

– Nico Haase
Nov 14 '18 at 16:00





Have a look at ma.ttias.be/…

– Nico Haase
Nov 14 '18 at 16:00













Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

– akio
Nov 14 '18 at 16:40





Great explanations. But where am I supposed to add the session_write_close ? Into video.php ? To unlock session after sending my video chunk ?

– akio
Nov 14 '18 at 16:40




1




1





Unlock it at soon as possible - put heavy loaded stuff behind closing it

– Nico Haase
Nov 14 '18 at 16:43





Unlock it at soon as possible - put heavy loaded stuff behind closing it

– Nico Haase
Nov 14 '18 at 16:43













Do you have any ideas why this occurs only with chrome ?

– akio
Nov 14 '18 at 18:08





Do you have any ideas why this occurs only with chrome ?

– akio
Nov 14 '18 at 18:08












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52823297%2fchrome-issue-video-stream-session-conflict%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52823297%2fchrome-issue-video-stream-session-conflict%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Florida Star v. B. J. F.

Danny Elfman

Lugert, Oklahoma