gpt4 book ai didi

php - Postgres pg_terminate_backend 替代方案

转载 作者:行者123 更新时间:2023-11-29 12:11:06 30 4
gpt4 key购买 nike

我有以下脚本来终止后端进程。

exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');

注意:此脚本在 postgres 9.3.10 或更高版本上失败,因为 procpid 列已替换为 pid

此脚本在我将数据库重置为较早状态之前运行。如果脚本无法运行,下一个重置我的数据库的脚本也会失败并抛出类似这样的错误,

ERROR:  column "procpid" does not exist
LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity w...
dropdb: database removal failed: ERROR: database "dbName" is being accessed by other users
DETAIL: There is 1 other session using the database.
createdb: database creation failed: ERROR: database "dbName" already exists
Looks like you failed 8 tests of 74.

所以,我想到了一种通过使用 php 脚本来避免此错误的方法

exec('psql --version', $vout);
$isNewVersion = false;
if ($vout !== false)
{
$x = preg_match_all('!\d+!', $vout[0], $mcs);
if ($x !== false && $x > 0) {
$v = implode('', $mcs[0]);
}

// Check if psql version is >= 9.3.10
$isNewVersion = (strpos($v, '931') !== false);
}
if ($isNewVersion)
{
exec('psql -Upostgres -c "select pg_terminate_backend(pid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}
else
{
exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}

问题是,我认为我的代码不可读或不友好,因为我只是在我的单元测试中使用它。

所以,我想知道是否有另一种替代方法可以终止与任何版本的 postgres(8.3 或更高版本)兼容的后端

欢迎任何建议。顺便说一句,我是 postgres 的新手。

最佳答案

pg_stat_activity 的新旧格式中,进程 id 位于第三列,所以你可以使用这个查询得到它:

select (string_to_array(a::text, ','))[3] as pid
from pg_stat_activity a;

关于php - Postgres pg_terminate_backend 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34608614/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com