irap/async-query

一个使异步MySql查询变得简单的包。

2.1.0 2017-02-04 22:35 UTC

This package is auto-updated.

Last update: 2024-09-24 02:03:34 UTC


README

此包的创建是为了简化创建异步MySql逻辑的过程。使用异步数据库查询可以通过消除建立连接和查询数据库执行过程中的所有等待/空闲时间,显著提高应用程序的性能。

要求

连接池

异步查询依赖于自己的MySql连接。为了防止开发人员达到数据库连接限制,我们的AsyncQuery对象依赖于传递一个MysqliConnectionPool对象,该对象将连接限制作为其所需参数之一。此对象将在有可用连接时为异步查询提供连接。

AsyncQuery

AsyncQuery对象接受一个回调。重要的是要记住,此回调提供了执行SQL语句的结果。此结果可以是mysqli_result对象或表示查询失败的FALSE。您应该在此回调中放置任何处理结果或应在查询完成后执行的代码。

示例用法

# Create the connection pool
$connectionPool = new \iRAP\AsyncQuery\MysqliConnectionPool(
    5, # max connections
    DB_HOST,
    DB_USER,
    DB_PASSWORD,
    DB_NAME
);

$sql =  "SHOW TABLES";

$queryCallback = function($result) {
    if ($result === FALSE)
    {
        throw new Exception("query failed!");
    }
};

$asyncQuery = new \iRAP\AsyncQuery\AsyncQuery(
    $sql,
    $queryCallback,
    $connectionPool
);

# Execute the query and wait for its result
while ($asyncQuery->run() === FALSE)
{
    usleep(1);
}

队列

我推荐使用以下三个队列对象

  • SerialRunnableQueue - 依次运行项目(FIFO),在移动到下一个项目之前等待每个项目完成。
  • ParallelRunnableQueue - 并行运行项目。这些项目可以以任何顺序执行/完成。在这里可以实现性能优势。
  • RunnableStack - 以与SerialRunnableQueue相同的方式执行项目,除了不是FIFO,项目以相反的顺序执行,最后添加的项目首先执行。

每个队列都接受RunnableInterface对象,这些对象是AsynqQuery对象或其他队列。这允许您创建任何需要的组合。例如,您可能有几个“任务类型”需要按顺序执行,但是每个“任务类型”可能由数百个可以按任何顺序执行的任务组成。在这种情况下,您将想要为每个这些“任务类型”创建一个包含所有并行任务的ParallelRunnableQueue,然后将这些ParallelRunnableQueue对象放入一个单独的SerialRunnableQueue对象中。

每个队列都可以在其构造函数中接受一个可选的回调。当队列被清空时,将执行此回调。这样做的主要原因是可以让开发人员运行只能在组中所有任务完成时运行的逻辑。然而,您也可以使用此逻辑运行一些会导致更多查询被添加到队列等的逻辑。

队列的大小不是固定的,您可以使用add方法随时将其添加。但是,请记住,每次队列被清空时都会调用回调。

AsyncQuery对象一样,队列本身不执行任何操作。开发人员需要执行它们的run()方法才能执行查询。如果查询/队列完成/耗尽,则run()方法将返回true。

示例用法

...

$asyncQuery1 = new \iRAP\AsyncQuery\AsyncQuery(
    $sql1,
    $queryCallback1,
    $connectionPool
);

$asyncQuery2 = new \iRAP\AsyncQuery\AsyncQuery(
    $sql2,
    $queryCallback2,
    $connectionPool2 # <-- different pool, perhaps for a different database?
);

$parallelRunnableQueue = new \iRAP\Queues\ParallelRunnableQueue($queueCallback);

$parallelRunnableQueue->add($asyncQuery1);
$parallelRunnableQueue->add($asyncQuery2);

# Run until the queue has completed all of the tasks.
while ($parallelRunnableQueue->run() !== TRUE)
{
    usleep(1);
}

自动化测试

从2.0.0版本开始引入了自动化测试。只需进入testing目录,将Settings.php.tmpl重命名为Settings.php,并填写您的数据库详细信息。然后执行main.php脚本。所有代码贡献都应提供相关的测试用例。

阅读自动化测试以获取示例用法可能是个好主意。