如何在PHP中排队请求

时间:2016-05-29 13:07:39

标签: php forms queue

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

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

我找不到任何合适的解决方案 enter image description here

1 个答案:

答案 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文件将再次处理该文件,因为它没有被删除,但是对于事务,不会有问题。