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

标签 php postgresql asynchronous prepared-statement

我在 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/

相关文章:

ios - 使用模型异步数据和 TableView

PHP和文件授权

php - Yii2 属性标签()

postgresql - 使用Spring Boot和PostgreSQL的Redis数据库

postgresql - Play/光滑 : SQLTimeoutException: Timeout after 1001ms of waiting for a connection

spring-boot - Spring Cloud Gateway 可以与非异步的微服务一起使用吗?

php setcookie 在 php5 下失败

php - 在不创建依赖项的情况下避免魔数(Magic Number)

java - windows下的postgresql类路径

c# - 如何验证我的 async/await 是否正在使用 I/O 完成端口?