如果没有新的请求说1秒,PHP有没有办法采取一些行动(例如MysqL插入)?
我想要实现的是确定从IP摄像机发送的图像序列的开始和结束.相机在检测到的移动时发送一系列图像,并在移动停止时停止发送.我知道相机每秒制作5张图像(每200毫秒).当没有超过1秒的新图像时,我想将最后一个图像标记为序列的结尾,在MysqL中插入记录,将img放在适当的文件夹中(其中所有其他img来自相同的序列已经写入)并指示app在该文件夹中制作MJPEG图像剪辑.
现在我能够使用Alternative PHP cash确定序列中的第一个图像以保存前一个请求的参考时间,但问题是因为下一个图像序列可能在几个小时后发生,如果没有请求,我无法指示PHP关闭序列有一段时间,只有当新序列的第一次请求到来时.
我真的需要帮助.我的PHP几乎像我的英语一样……
我的问题的伪代码:
<?PHP if(isset($headers["Content-Disposition"])) { $frame_time = microtime(true); if(preg_match('/.*filename=[\'\"]([^\'\"]+)/',$headers["Content-Disposition"],$matches)) { $filename = $matches[1]; } else if(preg_match("/.*filename=([^ ]+)/",$matches)) { $filename = $matches[1]; } } preg_match("/(anpr[1-9])/",$filename,$anprs); $anpr = $anprs[1]; $apc_key = $anpr."_last_time"; //there are several cameras so I have to distinguish those $last = apc_fetch($apc_key); if (($frame_time - $last)>1) { $stream = "START"; //New sequence starts } else { $stream = "-->"; //Streaming }; $file = fopen('PHP://input','r'); $temp = fopen("test/".$filename,'w'); $imageSize = stream_copy_to_stream($file,$temp); //save image file on the file system fclose($temp); fclose($file); apc_store($apc_key,$frame_time); //replace cashed time with this frame time in APC // here goes MysqL stuff... /* Now... if there is no new requests for 1 second $stream = "END"; calling app with exec() or similar to grab all images in the particular folder and make MJPEG... if new request arrives cancel timer or whatever and execute script again. */ ?>
你可以在退出前1.5秒让每个请求发出声音,并作为最后一步检查序列时间戳是否更新了吗?如果是,请退出并不执行任何操作.如果不是,请将序列保存到MysqL. (这将需要互斥锁,因为每个http请求都将检查并尝试保存序列,但只允许一个.)
这种方法会将子文件/脚本合并到PHP代码中(单个代码库,更易于维护),但它可能会使内存使用(每个请求将在内存中保留1.5秒,这对于忙碌的服务器来说是很长的时间) .
另一种方法是将子文件/脚本转换为localhost http服务器上的环回请求,可能会占用更少的内存.每个帧都会触发一个完成序列的请求(类似地再次使用互斥锁).
或者可以创建一个单独的服务调用来检查并保存所有序列,并且每隔几秒就有一个cron作业ping它.或者让每个帧都ping它,如果第二个请求可以检测到服务已经运行,它可以退出. (在APC缓存中共享状态)
编辑:我想我刚刚建议上面说的字节化.