[请益] 使用者断线后 php 是否会自动结束执行?

楼主: darkk6 (Mr. Pan)   2014-05-07 07:13:53
大家好,这个问题实在不太晓得要如何下标题 orz...
也不太确定到底应该和 http server 比较有关还是 php...
是这样的,小弟在 Windows 底下用 Apache + php 的组合
要做一个 MJPEG over HTTP 的服务,目前有两个项目,但因为用了
while 循环以及 set_time_limit(0) 会担心使用者浏览完并关掉网页之后
php 是否还会一直跑 while , 造成系统负担
(如何送 mjpeg over http 这个没问题)
1. 循环播放主机中的图片档案
2. 用 curl 去抓取另一台主机的 mjpeg
先来说 1 吧,简单来说就是送出 header 之后,用 while(1) 的循环
去循环一个 filePath 的 array , 这些都是 jpg 图档,把档案内容
echo 出去 ( echo file_get_contents(filePath[$i]); )
而 2 则是有一个 IP Cam 用 mjpg 的格式输出影像,但连上需要登入
我利用 curl 带着验证的 header 送过去并取得 mjpeg ,是成功了,
但也遇到和 1 相同的疑问,也就是既然 mjpeg 是会持续不断送资料过来,
所以我的 php 就不会停止 while 循环,加上 set_time_limit(0)
这样的状况下使用者关掉网页, php 是否会自己会停止运作?
程式码大概长这样:
set_time_limit(0);
$isHeader=true;
$url = "http://the.ipcam.host/video2.mjpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, "MyBot");
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Authorization:xxxx'));
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "outputFunc");
curl_exec($ch);
function outputFunc($ch, $str){
GLOBAL $isHeader;
if($isHeader && strlen($str)==2){
$isHeader=false;
return strlen($str);
}
if($isHeader){
$out=str_replace("\r\n","",$str);
header($out);
}else{
ob_flush();
echo $str;
ob_end_flush();
}
return strlen($str);
}
作者: gpmm (银色)   2014-05-07 10:30:00
嘛,其实你可以自己测一下啊 XD (写 log 这样
作者: banjmin (HD)   2014-05-07 11:26:00
只是要播影片的话 为什么要这样写?另外 关掉当然会停止 就像把cmd while(1)程式关掉一样
作者: alog (A肉哥)   2014-05-07 11:41:00
那是不可能终止的,http request 是单向传输的server端不会知道使用者关闭,通常由php or server 程式中断你如果把 set_time_limit 设为 0 很有可能程式会一直跑除非你server程式分出来的process意外中断都不会断线虽然不清楚你要做的东西,不过可以给个小建议在这死循环内加入一段程式码,检查使用者是否还在浏览画面如果他跳开了就break看你要隔多少时间检查一次..这不难处理另一种做法是,系统这里弄个程式挂著,定时处理画面把画面输出在服务器的档案系统上,使用者端只要纯粹看图就可
作者: Kenqr (function(){})()   2014-05-07 12:19:00
用无限循环的话,这样网页是不是会一直在加载状态?图片轮播的部份,感觉从client端用js处理会比较好
作者: banjmin (HD)   2014-05-07 12:30:00
我懂了 就像Comet那样
作者: danny8376 (钓到一只猴子@_@)   2014-05-07 13:39:00
alog server端不见得不知道 要看架构而定但如果是在没buffer的前提下 因为这PHP一直保持输出PHP会发现到没人消耗这些资料 所以能知道使用者关闭了
楼主: darkk6 (Mr. Pan)   2014-05-07 13:42:00
原来~ 我也觉得应该不会停 XD 但测试结果是会停 0.0
作者: xxxzzz (...)   2014-05-10 18:47:00
一般情况,网页关掉,PHP"觉察"到,就会停止了,就如danny所述也才会有ignore_user_abort(),可以让PHP不理会网页关闭,继续执行到完。另外connection_status()也可判断网页关了否http://xyz.cinc.biz/2011/01/php.html
楼主: darkk6 (Mr. Pan)   2014-05-13 07:42:00
感谢楼上~ 又学到了 :D

Links booklink

Contact Us: admin [ a t ] ucptt.com