PostgreSQL触发函数耗时太长导致php超时

时间:2018-02-01 15:52:40

标签: php postgresql triggers plpgsql postgresql-8.4

问题

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

根据参数的不同,查询可能会很快执行,有时我发现它需要的时间超过45秒,并且就php脚本而言是超时的,所以它不会得到它需要的唯一身份。

提议的解决方案

prepare_download_file函数拆分为两部分,以便第一部分仅将参数插入日志表并返回唯一ID,该id应立即发生(第一列id是类型{{ 1}}):

serial

第二部分INSERT INTO adc_query_log VALUES (DEFAULT,query_type,severity,year_range,local_authorities) RETURNING id INTO session_id; 通过触发函数执行并返回make_download_file()

NULL

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

问题

php位是否等到触发器功能完成后才将此事务标记为完成,然后返回RETURNING id INTO session_id?如果没有,有没有办法迫使它不要等待?

服务器正在运行id

2 个答案:

答案 0 :(得分:1)

声明不会返回,直到触发功能完成。

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

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

答案 1 :(得分:0)

我90%确定在获取id之前你必须等待触发器结束,所以超时会再次发生。

所以在这种情况下,您应该获取id(正如您所说的几乎是即时的),然后使用id

再次调用存储过程