You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:24:54