1
2
我认为对于这种情况,我将尝试直接控制查询超时。最好的方法是使用PHP的mysqli模块,而不是mysql模块,因为这样您就可以访问 mysqli::options 功能。 使用mysqli::options,可以根据每个连接将查询超时值设置为所需的任何值。一旦超时,您就可以在代码发生错误时将其作为正常流的一部分进行控制。 如果你不能使用mysqli(或者你没有使用mysql 5),你可以在mysql选项中直接设置这个值,但是这当然会对你的应用产生更大的影响。 编辑 作为对你的评论的回应,我认为这可能行不通。这是我刚想到的笨重的东西,但可能会让你过去。 这个 set_time_limit() 函数可以对PHP脚本的执行设置总的时间限制,如果达到该限制,将触发一个PHP致命错误。但是,当你调用它时,计时器重置为零…并且可以处理PHP致命错误。
您可以编写自己的错误处理函数,在执行问题查询之前,通过
set_error_handler()
. 立即呼叫
如果没有触发,您可以通过另一个调用重置计时器
就像我说的,笨重,但也许它能起作用? |
2
0
不幸的是,在modphp+apache下运行时,php似乎不允许使用pcntl_*()函数。在Linux上运行时,PHP本身提供的设置脚本超时的功能只适用于脚本本身所花费的时间, 不 等待阻塞的数据库查询所花费的时间。 所以,你 必须 借助于启动新进程(我们不能调用pcntl_fork())的一般策略来“做可能阻塞的事情”,然后让父进程轮询连接并在n秒后放弃。一种方法是使用proc_open(),将php端管道设置为非阻塞(通过stream_set_blocking())和stream_select()轮询循环,该循环在一定时间后中止。 这在几个层面上都很烦人。首先,必须确保正确地启动子进程,并安全地将所需操作的信息从父进程传递到子进程,然后必须确保轮询逻辑正确地处理各种子进程失败情况,然后必须安全地将信息从子进程传递回父进程,最后必须清理EVE。然后适当地进行Rything(如果父进程在多次迭代中持续存在,这就变得很重要)。这里的复杂性是如此之大,我敢打赌,任何第一次做这件事的人都必须花几个星期的时间来修复bug,然后行为才真正强大。尽管您对轮询频率和错误处理有明确的控制,但是您还拥有与启动新流程相关的成本。 我承认没有“一刀切”的解决方案 全部的 这类问题,但是 每个人 谁用PHP编写了一个Web应用程序,必须与Oracle数据库进行对话,他曾经或曾经希望“运行查询X,如果在n秒内没有得到响应,就会抛出异常”。所以我觉得这很荒谬 每个人 谁想要这种行为 必须 实现上面描述的整个系统(或者找到已经完成的其他人)。 |
Jacco · 未能格式化我的日期以在php中正确工作 1 年前 |
jay ram · 如何在URL核心php中从API获取JSON? 1 年前 |
Ishwarya A · php电子表格在浏览器中显示多张excel 1 年前 |