检测 PHP 代码块的超时

2024-01-22

如果 PHP 中的代码块花费太长时间,有没有办法可以中止该代码块?也许是这样的:

//Set the max time to 2 seconds
$time = new TimeOut(2);
$time->startTime();

sleep(3)

$time->endTime();
if ($time->timeExpired()){
    echo 'This function took too long to execute and was aborted.';
} 

它不必与上面完全相同,但是是否有任何本地 PHP 函数或类可以执行类似的操作?

Edit:Ben Lee 的回答pcnt_fork这将是完美的解决方案,只是它不适用于 Windows。有没有其他方法可以使用适用于 Windows 和 Linux 的 PHP 来完成此任务,但不需要外部库?

Edit 2:XzKto 的解决方案在某些情况下有效,但不一致,而且无论我尝试什么,我似乎都无法捕获异常。该用例正在检测单元测试的超时。如果测试超时,我想终止它,然后继续下一个测试。


您可以通过分叉进程,然后使用父进程来监视子进程来实现此目的。pcntl_fork http://php.net/manual/en/function.pcntl-fork.php是一种分叉进程的方法,因此内存中有两个几乎相同的程序并行运行。唯一的区别是,在一个进程中,父进程,pcntl_fork返回一个正整数,对应于子进程的进程 ID。而在另一个过程中,孩子,pcntl_fork返回 0。

这是一个例子:

$pid = pcntl_fork();
if ($pid == 0) {
    // this is the child process
} else {
    // this is the parent process, and we know the child process id is in $pid
}

这就是基本结构。下一步是添加流程到期时间。你的东西将在子进程中运行,父进程将只负责监视和计时子进程。但是为了让一个进程(父进程)杀死另一个进程(子进程),需要有一个信号。信号是进程通信的方式,表示“你应该立即结束”的信号是SIGKILL。您可以使用发送此信号posix_kill https://www.php.net/manual/en/function.posix-kill.php。所以父进程应该等待 2 秒然后杀死子进程,如下所示:

$pid = pcntl_fork();
if ($pid == 0) {
    // this is the child process
    // run your potentially time-consuming method
} else {
    // this is the parent process, and we know the child process id is in $pid
    sleep(2); // wait 2 seconds
    posix_kill($pid, SIGKILL); // then kill the child
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测 PHP 代码块的超时 的相关文章

随机推荐

  • Selenium IDE 中上传文件的脚本

    上传文件的脚本 在 selenium IDE 或 如何使用selenium自动上传文件 您可以使用 selenium type xpath of text box path of your file 命令 类型目标 文本框的xpath of
  • 尝试将 Moles 与 NUnit 一起使用。获得“Moles 需要测试成为一个仪器化过程”

    我尝试将 Moles 与 NUnit 一起使用 但收到以下错误 Moles 需要测试才能成为仪表化过程 我还在 Visual Studio 2008 中使用 Visual NUnit 来实现此功能 欢迎任何帮助 为了让 Moles 能够与
  • CIFilter 的便利初始化器给出了奇怪的异常

    这是我正在尝试的代码 typealias Parameters Dictionary
  • 在javascript中添加两个大数字[重复]

    这个问题在这里已经有答案了 我一直在尝试使用 javascript 添加以下数字 76561197960265728 912447736 遗憾的是 由于 JavaScript 中的四舍五入 它不会得到正确的数字 我需要该数字作为字符串 我尝
  • 在 Brave 中发送 XMLHttpRequest 时,引用者的这种行为是有意的吗?

    var xhr new XMLHttpRequest xhr open GET https httpbin org true xhr send 当运行上面这个简单的代码时example org Chrome devtools 中的请求标头显
  • Bootstrap 4 卡相同高度和底部对齐

    我正在尝试对齐 Bootstrap 4 卡并使用d flex随着align self stretch对于卡片本身 这太棒了 但是 我不知道如何让红色边框的部分浮到底部 使用 Bootstrap 4 的任何想法公用事业 https getbo
  • 如何使用 Kivy 获取文本输入的值

    我是 Kivy 的新手 因为我无法在 PySide 上练习 一些动态库损坏了或者我不知道是什么 所以我想尝试这个巨大的工具 我现在迷路了 我尝试这样做 在 Kivy 应用程序中获取文本输入值 https stackoverflow com
  • gsub 或 scan 中的匹配位置

    实现匹配位置的最佳方法是什么 由 对于使用时的每场比赛gsub or scan hello gsub Regexp last match offset 0 first gt 01234 See 正则表达式 last match http w
  • 使用谷歌地图上的 pincode 获取纬度和经度

    我需要加载给定 pin 码或区号的 Google 地图位置 我尝试使用地理编码器方法来查找给定地址的纬度和经度 当给定位置或区域但不适用于密码 特别是印度 时 此功能有效 有没有任何方法或途径可以使用 pincode 查找给定区域的纬度和经
  • Excel,将总和应用于多列上的某些单元格

    Excel 将总和应用于多列上的某些单元格 A B C D A 1 2 3 4 B 1 2 3 4 C 1 2 3 4 D sum A1 A2 A3 so A4 3 我们如何将总和分别应用于 B C D 列上的 4 个 B C D 您需要动
  • Google 电子表格 - 将多列转换为一列

    我想循环遍历 Google 电子表格中的一组行 如下所示 XXX 123 234 234 YYY 789 098 765 ZZZ 76 123 345 最终结果需要是 XXX 123 XXX 234 XXX 234 YYY 789 YYY
  • Python局部变量初始化

    我对 python 相当陌生 我想知道局部变量是如何工作的 让我们从一个简单方法的示例开始 def do sth local dict a 1 b 2 c 3 我们假设 local dict 的使用方式类似于 const 变量 问题是 每次
  • 这个要点
  • 没有以圆圈显示是什么?
  • 我试图在我的网页上显示一些项目符号列表圆圈 但它似乎没有显示 我尝试使用 firebug 但我找不到问题所在 我浏览了整个 css 文件 但我没有不知道问题出在哪里 我希望列表与圆圈垂直 请你帮我 这是代码 Browser resets h
  • 安全套接字连接的最佳实践

    安全套接字连接 无 SSL 的最佳实践是什么 我将通过 TCP 套接字连接移动敏感数据 登录名 密码 帐户 并想知道是否有一种好的 快速的加密 解密方法并避免恶意注入 如果您对 SSL 过敏 请使用 SSH 但原理是相同的 密钥通过非对称算
  • options 参数中可选参数的默认值

    我想传递一个对象作为类构造函数的参数 选项对象的某些键是可选的 在打字稿中是否有更好 更惯用的方法来完成以下任务 谢谢 class Car color number numberOfWheels number constructor opt
  • Python Seaborn 图表 - 阴影区域

    抱歉我的菜鸟问题 但是如何在seaborn图表的上下线之间添加阴影区域 颜色 我正在处理的主要代码如下 plt figure figsize 18 10 sns set style darkgrid palette sns color pa
  • 如何修复“未找到初始内容”错误?

    在客户端的一些代码上使用 Flash Builder 4 6 单击调试 也尝试运行 并收到此错误 Process terminated unexpectedly initial content not found Launch comman
  • 如何在使用通配符的目录指令中使用 apache2 mod_rewrite?

    我编写了一个 Web 应用程序 在托管该 Web 应用程序的专用服务器下运行 此 Web 应用程序的实例可在不同的域中使用 每个域都有自己的 Web 应用程序文件副本 允许根据需要进行自定义 我在 Debian Squeeze 下运行 Ap
  • Google Sign in API - 获取照片 Uri 为空

    我使用 Google Sign in API 来请求用户个人资料 例如用户显示名称 头像照片 我有null值 GoogleSignInAccount getPhotoUrl 获取值 GoogleSignInAccount getDispla
  • 检测 PHP 代码块的超时

    如果 PHP 中的代码块花费太长时间 有没有办法可以中止该代码块 也许是这样的 Set the max time to 2 seconds time new TimeOut 2 time gt startTime sleep 3 time