gpt4 book ai didi

php - 使用 postgreSQL 在 PHP 中执行异步准备语句并忽略其结果

转载 作者:行者123 更新时间:2023-11-29 12:06:28 26 4
gpt4 key购买 nike

我在 postgreSQL 数据库中使用某种(基本的)用户操作日志记录。为了获得性能,我异步执行所有日志插入,让脚本继续执行,而不是等到创建日志条目。

我在任何地方都使用准备好的语句来防止 SQL 注入(inject)并按需加载它们。

当我准备一条语句时,如果要从先前的异步查询中获取待定 结果,就会出现问题。 (PostgreSQL 表示在准备新语句之前有待获取的结果)

因此,作为一种变通方法,我会收集所有未决结果(如果有的话)并忽略它们,以便在准备任何语句之前让 PHP 和 PostgreSQL 满意。

但是有了这个解决方法(如我所见),我错过了通过异步执行可以获得的性能,因为无论如何我都必须收集结果。

有没有办法异步执行准备好的语句并故意告诉 postgres 忽略结果?

在我的 PostgreSQL 类中,我调用准备好的语句

pg_send_execute($this->resource, $name, $params);

并准备它们

//Just in case there are pending results (workarround)
while (pg_get_result($this->resource)!==FALSE);
$stmt = pg_prepare($this->resource, $stmtname, $query);

我们将不胜感激。

更新:我使用的所有异步查询都只是 INSERT 查询,因此(理论上)忽略它们的结果应该是安全的。

最佳答案

唯一异步的是您与 PostgreSQL 服务器的通信 - 您的数据库必须按顺序处理所有内容。

我的建议:

如果您必须使用 PostgreSQL 进行日志记录,请使用单独的数据库连接进行日志记录,并在您的脚本和数据库之间建立一个连接池 - PostgreSQL 中的身份验证成本高昂且需要一些时间,这将减少它。获取第二个连接需要一些时间,但如果您使用此方法,它将比没有连接池的方法更快。

根据您的可靠性要求,您应该使用自动提交(当 PHP 崩溃时永远不会丢失日志条目)。如果您不关心数据库端的可靠性(当您的数据跳过 WAL 时插入速度更快)或者您不使用复制或不需要日志,您可能想要使用 UNLOGGED 表(自 PostgreSQL 9.1 起可用)复制。

作为速度优化,您的日志表应该没有索引,因为它们必须在每次插入时更新。如果您需要它们,请创建第二个表并批量移动数据(每 X 分钟或每小时)。

关于php - 使用 postgreSQL 在 PHP 中执行异步准备语句并忽略其结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9902458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com