PostgreSQL触发器函数花费的时间太长,导致php超时 问题

PostgreSQL触发器函数花费的时间太长,导致php超时 问题,php,postgresql,triggers,plpgsql,postgresql-8.4,Php,Postgresql,Triggers,Plpgsql,Postgresql 8.4,我有一个plpgsql函数prepare\u download\u file,它从php脚本传入几个用户定义的参数,将这些参数插入日志表adc\u query\u log,然后使用它们构建一个sql查询,选择一组数据,将结果复制到csv,最后返回php脚本中所需的唯一id。id是一个关键部分,因为php脚本使用它来选择3个输出文件,将它们打包到.zip存档中,并通过下载链接向用户发送电子邮件 根据参数的不同,查询的执行速度可能会非常快,其他时候我发现,就php脚本而言,查询的执行时间会超过45秒

我有一个
plpgsql
函数
prepare\u download\u file
,它从
php
脚本传入几个用户定义的参数,将这些参数插入日志表
adc\u query\u log
,然后使用它们构建一个
sql
查询,选择一组数据,将结果复制到
csv
,最后返回
php
脚本中所需的唯一id。
id
是一个关键部分,因为
php
脚本使用它来选择3个输出文件,将它们打包到
.zip
存档中,并通过下载链接向用户发送电子邮件

根据参数的不同,查询的执行速度可能会非常快,其他时候我发现,就
php
脚本而言,查询的执行时间会超过45秒,超时,因此无法获得所需的唯一id

提议的解决办法 将
prepare\u download\u file
功能分为两部分,以便第一部分仅将参数插入日志表并返回唯一id,该id应立即发生(第一列
id
为type
serial
):

第二部分
make_download_file()
通过触发器函数执行,并返回
NULL

CREATE TRIGGER make_download_file AFTER INSERT ON adc_query_log
  FOR EACH ROW EXECUTE PROCEDURE make_download_file();
它从表中读取插入的值以构建
sql
查询,然后执行所有繁重的操作-假定在唯一id返回到
php
脚本之后

问题:
将id返回会话\u id
位是否等待触发功能完成,然后将此事务标记为完成,然后返回
id
?如果没有,我有没有办法强迫它不要等待


服务器正在运行PostgreSQL 8.4,我90%确定您必须等待触发器结束,然后才能获取id,因此超时将再次发生


因此,在这种情况下,您应该获取id(正如您所说的几乎是即时的),然后使用id对存储过程进行第二次调用,直到trigger函数完成,语句才会返回

我会将耗时较长的作业放入“队列”表中,并有一个单独的进程异步处理队列中的作业。这样你就不用担心超时了


对于进程之间的通信,您可以定期提取状态,也可以使用PostgreSQL的
LISTEN
NOTIFY

只是一个附带的问题:Postgres没有内置的事件调度器吗?因为MySQL有,而且我听过很多歌颂Postgres比MySQL更先进的歌曲。PostgreSQL中没有任务调度器。有第三方工具,比如@laurenzal,可能还可以,所以我想我可以修改日志表,使其包含一个布尔
processed
列,然后有一个计划的
cron
任务,例如选择任何未标记为已完成的记录,然后处理它们。或者,如果你有任何关键字,我可以搜索如何在postgres中做类似的事情,请分享!是实现队列的pgq扩展。您需要三种状态:新建、进行中、完成。否则,两名工人可能会尝试处理同一项目。
CREATE TRIGGER make_download_file AFTER INSERT ON adc_query_log
  FOR EACH ROW EXECUTE PROCEDURE make_download_file();