gpt4 book ai didi

php - 使用 PHP 脚本更新具有打开/待处理事务的数据库表时,如何避免无限期阻塞?

转载 作者:搜寻专家 更新时间:2023-10-31 21:19:00 26 4
gpt4 key购买 nike

我发现,如果我通过 SQLplus 修改表 X 并且不提交更改,那么如果我的 Web 应用程序(在 ModPHP 模式下作为 PHP 脚本在 Apache 下运行)尝试提交对表 X 的更改,它将无限期阻塞,直到我通过 SQLplus 提交我的更改。

这种行为是正确的,但我想要的是一种干净/可靠/简单的方法,让我的 Web 应用程序在 N 秒后超时并发出 HTTP 409 错误,而不是无限期地阻塞。

我的第一个想法是使用带有信号处理程序的 pcntl_alarm(N) 在 N 秒后捕获 SIGALRM。但我发现 pcntl_* 函数通常在编译时从 ModPHP Apache 模块中删除,大概是为了避免弄乱根 Apache 进程本身用来控制其子进程的信号。也许它应该对通过 ModPHP 运行的 PHP 脚本处理它们自己的 SIGARLM 是无害的,但我现在不想与我的 Ops 团队打架,所以我不得不拒绝这种方法。

我的第二个想法是每次我的应用程序需要修改表 X 时派生/启动一个子进程,并让父进程轮询子进程(可能通过管道上的 select())直到操作完成(成功)或 N 秒已过(超时 + 失败)。

第二种方法起作用,但我觉得它丑陋、复杂且脆弱。

考虑到 PHP 5.2.11 版和 Apache 1.3.41 版(在 Linux 2.6.9 上)的限制,有没有人知道更好的方法?

最佳答案

我认为对于这种情况我会尝试直接控制查询超时。最好的方法是使用 PHP 的 MySQLi 模块而不是 MySQL 模块,因为这样您就可以访问 mysqli::options。功能。

使用 mysqli::options,您可以在每个连接的基础上将查询超时值设置为您想要的任何值。一旦超时,您可以在错误发生时将其控制在代码中作为正常流程的一部分。

如果你不能使用 MySQLi(或者你没有使用 MySQL 5),你总是可以直接在 MySQL 选项中设置这个值,但这当然会对你的应用程序产生更大的影响。

编辑

根据您的评论,我认为这可能行不通。这是我刚刚想到的一些笨拙的东西,但可能会让你度过难关。

set_time_limit()函数可以对 PHP 脚本的执行设置总时间限制,如果达到该限制,则会触发 PHP fatal error 。但是,当您调用它时,计时器会重置为零...并且可以处理 PHP fatal error 。

您可以编写自己的错误处理函数,并在执行问题查询之前,通过 set_error_handler() 将其转换为使用状态。 .立即调用 set_time_limit(),并运行您的查询。如果超过您的时间限制,将触发 fatal error ,并转到您的错误处理函数。您可以从那里继续。

如果它没有被触发,您可以在查询之后再次调用 set_time_limit() 来重置计时器,然后使用 restore_error_handler()将默认错误处理函数交换回原位。

正如我所说,笨拙,但也许它可以工作?

关于php - 使用 PHP 脚本更新具有打开/待处理事务的数据库表时,如何避免无限期阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870125/

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