如何在多个用户中对php中的url请求进行排队。假设有一个表单,但我每10秒只需要提交一次。
如果user1在12:00:01提交表单,然后另一个用户在12:00:03提交表单,他将排队,他的请求将在12:00:11提交。如果第三个用户在12:00:09提交,那么他将在队列中排名第二,并将在12:00:21处理。
答案 0 :(得分:2)
您有多种队列选项,其中包括以下两种:
1)使用 pheanstalk 等队列库(需要 beanstalkd )。它是一个使用TCP协议的队列(默认情况下在端口11300上,虽然这可以很容易地更改)。它经过了很好的测试,非常强大,而且最重要的是开源: https://github.com/pda/pheanstalk
2)将用户输入存储在数据库中,并让代码每10秒执行一次请求。执行此选项可能要简单得多。但是,您还需要创建一个守护程序,它基本上是一个在后台运行的独立脚本,用于处理队列中的信息。例如,假设在提交表单并执行以下php PDO代码时,表单页面将用户重定向到validation.php:
//....
$sql = "INSERT INTO queue (user_id, process) VALUES (?, ?)";
$stmt = $conn->prepare($sql);
$stmt->execute([$id, $process]);
//...
然后,您将$id
和$process
存储在queue
表的末尾(也可以假设该队列有一个名为queue_id
的PRIMARY KEY,它已设置是AUTO_INCREMENT)。从那里开始,您将在后台运行单独的沙子脚本(守护程序)来检索该数据并对其进行处理。例如:
<强> 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);
}
重要推荐:
如果您使用上述代码中的事务来保证选择,处理和删除都一起发生,那就更好了。例如,当删除即将发生时,服务器上的电源(或类似的东西)消失,当重新启动服务器时,您的worker.php文件将再次处理该文件,因为它没有被删除,但是对于事务,不会有问题。