irap / async-query
一个使异步MySql查询变得简单的包。
Requires
- php: >=5.5.0
- irap/queues: 1.0.*
README
此包的创建是为了简化创建异步MySql逻辑的过程。使用异步数据库查询可以通过消除建立连接和查询数据库执行过程中的所有等待/空闲时间,显著提高应用程序的性能。
要求
- 原生mysql驱动程序(msyqlnd).
- 在Ubuntu上使用以下命令安装:
sudo apt-get install php5-mysqlnd -y
- 在Ubuntu上使用以下命令安装:
- 此包是在PHP 5.5上构建/测试的。它可能在更早的版本上工作,也可能不工作。但请注意,任何低于5.5的PHP版本都已过时。
连接池
异步查询依赖于自己的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
脚本。所有代码贡献都应提供相关的测试用例。
阅读自动化测试以获取示例用法可能是个好主意。