楼主:
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);
}