Chrome issue - video stream & session conflict
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 > $size - 1 // 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
add a comment |
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 > $size - 1 // 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
2
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
add a comment |
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 > $size - 1 // 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
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 > $size - 1 // 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
php http http-content-range
edited Nov 14 '18 at 16:19
akio
asked Oct 15 '18 at 19:10
akioakio
8214
8214
2
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
add a comment |
2
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
2
2
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
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
2
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