PHP exec()执行失败的PostgreSQL脚本仍返回状态码0问题排查
问题描述
在PHP中执行PostgreSQL脚本时,刻意让SQL触发唯一约束违反错误,但exec()调用始终返回状态码0。
PHP代码片段:
[...] $command = "$psqlPath -h $myHost -d $myDb -U $myUser -f $sqlScript 2>&1"; $output = []; $return_var = 0; exec($command, $output, $return_var);
执行结果:
$return_var -> 0 $output[0] -> "psql:/pathToMyScript/sqlScript.sql:1: ERROR: duplicate key value violates unique constraint"
使用的PostgreSQL版本为10.17,询问操作哪里有误,为何return_var还是0?
问题原因及解决办法
这是因为默认情况下,psql遇到错误时不会立即退出,而是继续执行后续语句,最终返回的是整个脚本执行结束后的状态码——只要psql本身没有崩溃,就会返回0。
要让psql在遇到第一个错误时就退出并返回非零状态码,需要在命令中添加-v ON_ERROR_STOP=1参数,修改后的命令如下:
$command = "$psqlPath -h $myHost -d $myDb -U $myUser -v ON_ERROR_STOP=1 -f $sqlScript 2>&1";
另外,也可以在SQL脚本开头添加\set ON_ERROR_STOP on,效果和命令行参数一致,但命令行参数的优先级更高。
修改后,当脚本触发约束违反错误时,psql会立即终止执行,exec()的return_var就会返回对应的非零错误码,可通过该值判断脚本是否执行失败。
内容的提问来源于stack exchange,提问作者i know nothing
相关产品推荐
相关产品推荐

