作者darkk6 (Mr. Pan)
看板PHP
标题[请益] 使用者断线後 php 是否会自动结束执行?
时间Wed May 7 07:13:53 2014
大家好,这个问题实在不太晓得要如何下标题 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);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.60.161.211
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/PHP/M.1399418035.A.75F.html
1F:推 gpmm:嘛,其实你可以自己测一下啊 XD (写 log 这样 05/07 10:30
2F:推 banjmin:只是要播影片的话 为什麽要这样写? 05/07 11:26
3F:→ banjmin:另外 关掉当然会停止 就像把cmd while(1)程式关掉一样 05/07 11:27
4F:→ alog:那是不可能终止的,http request 是单向传输的 05/07 11:41
5F:→ alog:server端不会知道使用者关闭,通常由php or server 程式中断 05/07 11:41
6F:→ alog:你如果把 set_time_limit 设为 0 很有可能程式会一直跑 05/07 11:42
7F:→ alog:除非你server程式分出来的process意外中断都不会断线 05/07 11:43
8F:→ alog:虽然不清楚你要做的东西,不过可以给个小建议 05/07 11:45
9F:→ alog:在这死回圈内加入一段程式码,检查使用者是否还在浏览画面 05/07 11:46
10F:→ alog:如果他跳开了就break 05/07 11:47
11F:→ alog:看你要隔多少时间检查一次..这不难处理 05/07 11:47
12F:推 alog:另一种做法是,系统这里弄个程式挂着,定时处理画面 05/07 11:51
13F:→ alog:把画面输出在伺服器的档案系统上,使用者端只要纯粹看图就可 05/07 11:52
14F:推 Kenqr:用无限回圈的话,这样网页是不是会一直在载入状态? 05/07 12:19
15F:→ Kenqr:图片轮播的部份,感觉从client端用js处理会比较好 05/07 12:20
16F:推 banjmin:我懂了 就像Comet那样 05/07 12:30
17F:→ danny8376:alog server端不见得不知道 要看架构而定 05/07 13:39
18F:→ danny8376:但如果是在没buffer的前提下 因为这PHP一直保持输出 05/07 13:40
19F:→ danny8376:PHP会发现到没人消耗这些资料 所以能知道使用者关闭了 05/07 13:41
20F:→ darkk6:原来~ 我也觉得应该不会停 XD 但测试结果是会停 0.0 05/07 13:42
21F:推 xxxzzz:一般情况,网页关掉,PHP"觉察"到,就会停止了,就如danny所述 05/10 18:47
22F:→ xxxzzz:也才会有ignore_user_abort(),可以让PHP不理会网页关闭, 05/10 18:48
23F:→ xxxzzz:继续执行到完。另外connection_status()也可判断网页关了否 05/10 18:49
25F:→ darkk6:感谢楼上~ 又学到了 :D 05/13 07:42