如何在PHP中对请求进行排队

如何在PHP中对请求进行排队,php,forms,queue,Php,Forms,Queue,如何在php中跨多个用户对url请求进行排队。假设有一个表单,但我只需要每10秒提交一次 如果user1在12:00:01提交表单,然后另一个用户在12:00:03提交表单,他将排队,他的请求将在12:00:11提交。如果第三个用户在12:00:09提交,则他将是队列中的第二个用户,并将在12:00:21进行处理 对于这样的事情,我找不到合适的解决办法 您有多种队列选项,其中有以下两种: 1)使用队列库,如pheanstalk(需要beanstalkd)。它是一个使用TCP协议的队列(默认情况下

如何在php中跨多个用户对url请求进行排队。假设有一个表单,但我只需要每10秒提交一次

如果user1在12:00:01提交表单,然后另一个用户在12:00:03提交表单,他将排队,他的请求将在12:00:11提交。如果第三个用户在12:00:09提交,则他将是队列中的第二个用户,并将在12:00:21进行处理

对于这样的事情,我找不到合适的解决办法

您有多种队列选项,其中有以下两种:

1)使用队列库,如pheanstalk(需要beanstalkd)。它是一个使用TCP协议的队列(默认情况下在端口11300上,尽管这很容易更改)。它经过了很好的测试,非常健壮,最重要的是开源:

2)将用户输入存储在数据库中,并让代码每10秒执行一次请求。此选项的执行可能要简单得多。但是,您还需要创建一个守护进程,它基本上是一个在后台运行的独立脚本,用于处理队列中的信息。例如,假设表单页面在提交表单并执行以下php PDO代码时将用户重定向到validation.php:

 //....
 $sql = "INSERT INTO queue (user_id, process) VALUES (?, ?)";
 $stmt = $conn->prepare($sql);
 $stmt->execute([$id, $process]);
 //...
然后将
$id
$process
存储在
队列
表的末尾(还假设队列有一个名为
队列id
的主键,该主键设置为自动递增)。从这里开始,您将在后台运行sand-alone脚本(守护进程),该脚本将检索并处理该数据。例如:

worker.php

<?php
//other code like connecting to the database
while (1)
{
    $sql = "SELECT * FROM queue LIMIT 1; ";
    $stmt = $conn->query($sql);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    //code that processes the values obtained from result

    $sql = "DELETE FROM queue WHERE queue_id = {$result['queue_id']}";
    $stmt = $conn->query($sql);


}

使用数据库存储当前在队列中的用户。这是一项非常重要的任务。。。在没有更多细节的情况下,我会说干净而健壮的方法是立即接受每个请求,并在服务器端排队系统中只对要执行的任务进行排队。然后,您可以使用客户端触发的ajax长轮询请求(或web套接字)来等待排队任务结果。如果我的答案有帮助,请告诉我