我有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
答案 0 :(得分:1)
声明不会返回,直到触发功能完成。
我会将需要很长时间的作业放入“队列”表中,并且有一个单独的进程可以异步处理队列中的作业。这样你就不用担心超时了。
对于流程之间的通信,您可以定期提取状态,也可以使用PostgreSQL的LISTEN
和NOTIFY
。
答案 1 :(得分:0)
我90%确定在获取id之前你必须等待触发器结束,所以超时会再次发生。
所以在这种情况下,您应该获取id(正如您所说的几乎是即时的),然后使用id
再次调用存储过程