前端之家收集整理的这篇文章主要介绍了
如何在PHP / Windows中异步任务结束时通知用户,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑下图:
思念
>用户可以执行单个文件/批量上传(我知道HTTP规范),批量我的意思是有人在视觉上能够一次发送多个文件.
>图像上传服务旨在为每个发送的文件创建(图像处理器)子进程.
问题
>那么客户端 – 服务器通信的哪种方法最适合从这些子进程发送回客户端的通知?
>创建子进程的最佳方法是什么?我读过有关proc_open,curl方法的内容.我没有得到如何使用消息队列(如果它适用的话).
笔记
我得知道我正在使用Windows操作系统(Windows Server 2008)和XAMPP
@H_
301_16@
用户上传图像.完成此步骤后,您可以创建一个任务. One Taks是
数据库中任务表的一行.
class Task
{
const STATUS_PENDING = 'pending'
const STATUS_ERROR = 'error'
const STATUS_FINISHED = 'finished'
private $userid;
private $taskData = array();
public function run()
{
// create process
}
public function update()
{
// update the status an other changes you need to the database
// or any other storage you use.
}
public function getStatus();
}
class TaskManager
{
const MAX_TASKS = 5;
private $tasks = array();
public function addTaks();
public function start()
{
foreach ($tasks as $task) {
$task->run();
}
}
}
在服务器端,您需要考虑如何工作/组织您的任务.这取决于您的需求.借助TaskManager的强大功能,您可以
控制你的过程.这非常重要,不是100个进程并行运行.
客户端现在可以轻松地向用户ID询问任务表以检查待处理任务.如果状态完成或错误,您可以给用户
一个很好的反馈.您可以每五秒轮询一次此信息.间隔取决于您的需要.五秒钟的投票对你来说可能很奇怪
浏览器.一个好主意是客户端将获取状态而不是服务器将状态发送到客户端.如果服务器发送状态非常重要,那么您将使用Web套接字.后端可以是相同的.
这是一个简单的轮询示例.
setInterval(function(){
$.ajax({ url: "server",success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
},dataType: "json"});
},30000);
proc_open只有在你有一些高级选项时才有用.具有proc_open的功能(关注管道)并与stream_set_blocking结合使用.
您可以编写异步任务处理.如果你不需要一些特殊的exec就足够了.
这是一个非阻塞的例子.
class Task
{
private $process = null;
private $pipes = array();
private $status = 'pending'
public function run()
{
$descriptor = array (
0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w")
);
$cmd = "/path/to/progam --with --some-arguments"
$this->process = proc_open($command,$descriptor,$this->pipes);
stream_set_blocking($this->pipes[1],0);
}
public function close()
{
foreach($this->pipes as $pipe) {
fclose($pipe);
}
$exitStatus = proc_close($this->process);
$this->process = NULL;
return $exitStatus;
}
}
我希望这会给你一些解决问题的灵感.
对于真正的消息队列,您可以使用您想要的.我是http://kr.github.io/beanstalkd/的粉丝我现在停止提供解决方案和想法,因为这个问题更复杂,我可以再写100页.如果你有konkrete问题,你可以放弃一条线.