如何在PHP中对请求进行排队
如何在php中跨多个用户对url请求进行排队。假设有一个表单,但我只需要每10秒提交一次 如果user1在12:00:01提交表单,然后另一个用户在12:00:03提交表单,他将排队,他的请求将在12:00:11提交。如果第三个用户在12:00:09提交,则他将是队列中的第二个用户,并将在12:00:21进行处理 对于这样的事情,我找不到合适的解决办法如何在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协议的队列(默认情况下
您有多种队列选项,其中有以下两种: 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套接字)来等待排队任务结果。如果我的答案有帮助,请告诉我