如何在PHP / Windows中异步任务结束时通知用户

前端之家收集整理的这篇文章主要介绍了如何在PHP / Windows中异步任务结束时通知用户前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑下图:

思念

>用户可以执行单个文件/批量上传(我知道HTTP规范),批量我的意思是有人在视觉上能够一次发送多个文件.
>图像上传服务旨在为每个发送的文件创建(图像处理器)子进程.

问题

>那么客户端 – 服务器通信的哪种方法最适合从这些子进程发送回客户端的通知
>创建子进程的最佳方法是什么?我读过有关proc_open,curl方法内容.我没有得到如何使用消息队列(如果它适用的话).

笔记

我得知道我正在使用Windows操作系统(Windows Server 2008)和XAMPP

用户上传图像.完成此步骤后,您可以创建一个任务. 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问题,你可以放弃一条线.

原文链接:https://www.f2er.com/php/131771.html

猜你在找的PHP相关文章