Windows 上的信号处理

2023-11-23

我有一个独立的 PHP 脚本,我将处理从 Windows 操作系统发送的信号,以便在发出“终止信号”时正常关闭。

我怎样才能在 Windows 上做到这一点?


2020 年 3 月更新:从 PHP 7.4 开始,有sapi_windows_set_ctrl_handler() and sapi_windows_generate_ctrl_event。这使您的脚本可以处理 Ctrl+C 和 Ctrl+Break 按键,并为同一进程组中的其他进程生成它们。proc_open()还添加了create_process_group选项允许子进程处理 CTRL 事件。就信号处理而言,这是您在 Windows 上可以做的最好的事情。请注意,这些函数仅适用于 PHP CLI SAPI(即 php.exe),并且仅当进程附加到控制台时它们才起作用,这在一定程度上限制了它们的实用性。

原答案:

虽然这里唯一的其他答案是简洁和准确的,但它缺乏关于为什么 Windows 上不支持信号的详细信息。

首先,信号是一种相当有限且过时的与进程通信的方式。有许多更丰富的方法可以通知进程需要放弃正在执行的操作并执行其他操作。即使在 POSIX 平台上,信号处理程序也旨在非常轻量级 - 信号处理程序中的代码必须准备好/能够处理同时到达的多个信号。

PHP 允许信号处理程序通过pcntl_signal()有大量警告。在使用它们之前,代码必须调整 PHP 将到达处理程序的信号传递之前经过的“滴答”数量。一个刻度是 Zend(PHP 的核心)在检查信号处理程序状态并运行必要的回调之前将执行的指令数。它基本上是主执行循环中的一个繁忙循环。因此,如果遵循每报价 1 的建议,调整报价将大大减慢该过程。该函数的注释表明,对于大多数系统,刻度值 100 就足够了。了解处理程序如何工作的最简单方法是,在幕后有一个实际的信号处理程序来收集信号信息,PHP 偶尔会查询该处理程序以查看处理程序是否被调用、发送了哪个信号等。如果是这样,则信息被传递到用户空间(即您的代码)中的回调。这不是真正的信号处理,也永远不会因为真正的信号处理所带来的危险和困难而产生。

第二个问题是,即使使用 pcntl_signal() 提供的伪信号处理程序支持,PHP 也可能会丢失有关发生的信号的信息。如果发生多个信号场景,脚本将不会收到某个信号多次发生的通知。刻度值越大,发生这种情况的可能性就越大,尤其是在繁忙的系统上。

Windows 在大多数情况下并不真正使用信号。有的是设置ConsoleCtrlHandler()该函数用于捕获 Ctrl+C 和 Ctrl+Break,大致相当于 SIGINT。缺点是必须有一个控制台附加到进程才能工作,并且不能由其他进程发送。这终止进程()功能相当于SIGKILL,在其他操作系统下无法被阻止/处理,并且SIGKILL信号实际上并没有到达目标进程。除了这两个功能/信号之外,几乎没有什么共同点。归根结底,Windows 的本质是一个非常不同的野兽。

查看信号的唯一原因是为了某种长时间运行的 PHP 进程 - 每个人似乎都说该语言不适合这项任务(我完全不同意,但这是一个不同的讨论)。当我了解到 PHP 中信号支持的局限性(即使在 POSIX 操作系统下)时,我认为它们并不能真正解决我的情况。正确的解决方案是完全忽略信号。对于 SIGINT,应该编写命令行脚本来处理提前终止的情况 - 也就是说,它们应该是幂等的。在 PHP 的世界中,信号在很大程度上是无关紧要的,因为还有其他更灵活、更丰富的解决方案,包括命名互斥体/事件、套接字、文件、命名管道、共享内存、服务经理, etc.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 上的信号处理 的相关文章

  • Facebook“赞”按钮回调帮助

    我正在使用此代码进行类似 facebook 的回调 问题是 如果我调用 php 脚本 例如 有人可以看到我的 javascript 并运行此页面 甚至可以向其发送垃圾邮件或在没有先点赞的情况下使用它 我的想法是 我想为每个喜欢该页面的用户提
  • Symfony2,如何向表单添加隐藏的日期类型字段?

    我正在尝试以下场景 In myclassType public function buildForm FormBuilder builder array options builder gt add day hidden gt add da
  • .NET 中安全身份的本地化

    我想在 NET 中实现一个用于服务 客户端通信的命名管道 并遇到了这段代码 http code msdn microsoft com windowsdesktop CSNamedPipeCommunication 33b2485c view
  • 用 PHP 截断文件末尾

    我有一个日志文件 我想在 PHP 读取该文件后将其截断 我的代码目前如下所示 fp fopen file r ftruncate fp 125000 fclose fp 但是 这会通过保留first1MB 不过 我想保留last1Mb 的文
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • 当调用dll函数时,参数对象的成员变量的内存地址发生变化

    类某类 一些成员MemberClass one of the mem 我有一个函数foo SomeClass object 在 dll 中 它是从 exe 调用的 Problem 地址one of the mem 在调度 dll 调用期间发
  • zend 表单验证

    我想知道 Zend Form 如何验证输入 我的意思是它如何知道要验证哪些输入字段 我查看了 php 全局变量 POST GET 但没有看到任何设置为标识符 例如 的内容 以便了解如何验证 有人能给我推荐一些关于这些东西的指南吗 好吧 找出
  • 在php中获取大于2GB的文件大小的最佳方法?

    我想检查本地驱动器上的文件大小windows OS 但是PHP原生函数filesize 仅当文件大小小于时才有效2GB 大于的文件2GB将返回错误的数字 那么 是否有其他方法来获取大于的文件大小2GB 非常感谢 您始终可以使用系统的文件大小
  • 随机错误 symfony:ContextErrorException: 警告: simplexml_load_file(): I/O 警告: 无法加载外部实体

    在我的 Symfony 项目中 当我进入应用程序中的随机页面时 会出现以下随机错误 ContextErrorException Warning simplexml load file I O warning failed to load e
  • 如何在 Windows 中创建上下文菜单子菜单?

    我一直在编写实用程序并通过 Shell 键 上的 Regedit 将它们映射到上下文菜单 但我不知道如何像一些更流行的实用程序那样创建子菜单 例如 如果我有三个脚本将文件移动和重命名到三个不同的文件夹 那么现在我有三个不同的上下文菜单条目
  • 写入 xml 文件时允许的内存大小已耗尽(尝试分配 4459414 字节)[重复] 67108864 字节

    这个问题在这里已经有答案了 可能的重复 php 中允许的内存大小已耗尽 尝试分配 43148176 字节 33554432 字节 https stackoverflow com questions 415801 allowed memory
  • 在 PHP 中将整数转换为十六进制值

    如何将PHP中第一类中的数字转换为第二类中的数字 是否有内置函数来转换数字 也是我的标题 将整数转换为十六进制值 甚至正确 class Permission const READ 1 const UPDATE 2 const DELETE
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • MD 和 MKDIR 批处理命令有什么区别?

    这两个命令都会创建文件夹 我read http www computerhope com mdhlp htmMKDIR 甚至可以创建子文件夹 这只是区别吗 为什么有两个命令做同样的事情 我应该使用哪一个 除了 npocmaka 的answe
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • 创建单个随机 Magento 优惠券

    我遇到了一些麻烦 我想要做的是每次有人订阅我们的时事通讯时 在 Magento 中自动生成一个随机优惠券代码 这张优惠券可减 10 美元 并且有exp 订阅后两周的日期 因此 我正在尝试编写一个简单的脚本 当提交 订阅我们的时事通讯 表单时
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • PHP Json_encode 将空格更改为加号 +

    我有一个网络应用程序 我首先将 JSON 数据存储在 cookie 中 然后每 x 秒保存到数据库 它只是打开与服务器的连接 服务器读取 cookie 它实际上并不通过 POST 或 GET 发送任何内容 当我保存到 cookie 时 我的
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft

随机推荐

  • Xamarin NSNotificatioCenter:如何获取正在传递的 NSObject?

    我正在尝试使用 NSNotificationCenter 将视图中的通知从我的应用程序发布到另一个视图 因此 在我的目标类中 我创建了观察者 如下所示 NSNotificationCenter DefaultCenter AddObserv
  • 如何使用 FtpWebRequest 正确断开与 FTP 服务器的连接

    我创建了一个 ftp 客户端 该客户端在一天中多次连接以从 FTP 服务器检索日志文件 问题是几个小时后我从 FTP 服务器收到一条错误消息 已达到 421 会话限制 当我使用 netstat 检查连接时 即使我已经 关闭 了连接 我也可以
  • 如何在 Windows 时区和 IANA 时区之间进行转换?

    如中所述时区标签 wiki 有两种不同风格的时区 Microsoft 提供的用于 Windows 和 Net 的内容TimeZoneInfo类 在 Windows 上运行时 由诸如以下的值标识 Eastern Standard Time 由
  • app:srcCompat - 矢量可绘制对象显示在设计预览中,但不显示在应用程序中

    可绘制 信息 xml
  • scipy logsumexp() 是否可以处理下溢挑战?

    scipy 有吗logsumexp 实现包括通过从每个元素中减去数组中找到的最大值来防止下溢的黑客 下面解释的 其中m maxval 您可以检查定义的源代码logsumexp here 请注意 有一个指向源的链接文档页面 你会看到的 a m
  • div滚动条宽度

    有没有一种简单的方法可以使用 javascript jquery 获取滚动条的宽度 我需要获取溢出的 div 的宽度 滚动条的宽度 谢谢 如果您使用 jquery 请尝试以下操作 function getScrollbarWidth var
  • 使用 HTML 更改浏览器顶部(favicon)

    使用 HTML 查看图像时 如何更改浏览器选项卡中显示的小图像 抱歉 我是编程新手 小图像就是我所说的 它被称为favicon 将 favicon ico 文件放在 www 根目录中并使用以下代码
  • 用于查找小数/浮点数的正则表达式?

    我需要一个十进制 浮点数字的正则表达式 例如 12 12 2 1236 32 123 333 和 12 00 或 12 00 或 123 123 以便在 javascript 和 jQuery 中使用 谢谢 可选地在开头匹配 或 后跟一个或
  • 如何让对话框样式的活动窗口填满屏幕?

    我正在使用一个带有对话框主题集的活动 并且我希望它是全屏的 我尝试了各种各样的方法 甚至通过 WindowManager 手动将窗口扩展到完整的宽度和高度 但没有任何效果 显然 对话框窗口 或具有对话框主题的活动 只会根据其内容扩展 但即使
  • 如何在 readthedocs 上记录 cython 函数

    On 阅读文档我不被允许编译cython扩展 是否可以配置sphinx为了从中提取文档字符串cython文件而不实际编译它们 thanks 我遇到了同样的问题 发现现在可以在 readthedocs 上编译 Cython 扩展 简短回答 可
  • “__cplusplus”宏扩展为什么?

    C 宏有什么作用 cplusplus包含并扩展到 有没有宏 cplusplus即使在最古老的 C 实现中 也始终包含并扩展为numeric value 使用安全吗 if cplusplus或者我们应该用它来代替 ifdef cplusplu
  • Mac 开发的 PyObjc 与 RubyCocoa:哪个更成熟?

    我一直想尝试一下 Ruby 或 Python 同时我也一直想做一些 Cocoa 编程 因此 我认为实现这两个目标的最佳方法是使用 Ruby 或 Python 到 Objective C 的桥梁 PyObjc 或 RubyCocoa 来开发一
  • Quartz Scheduler 关闭后不停止

    我在 jboss 4 0 5 上使用当前最新的quartz 1 8 3 石英作业是持久的并保存到本地数据库中 当我在执行的石英调度程序对象上调用 shutdown 或standby 方法时 作业仍然由调度程序继续执行 只是作业状态为空并且执
  • 状态 Property 中的令牌 PropertyName 将导致无效的 JSON 对象。使用自定义 JsonConverter

    我正在尝试使用 Json NET 和自定义序列化程序序列化 反序列化 NET 数据集 我知道你们中的许多人会告诉我不要这样做 我在其他帖子上看到过这一点 我有充分的理由并希望继续沿着这条路走 我的序列化基于以下事实 NET DataSet
  • 获取 Django url 模板标签中 javascript 变量的值

    众所周知 有一种通过使用 django 模板标签 url 定向到 URL 的 DRY 方式 例如 url someview arg1 X 在这里 我希望 X 是 JavaScript 变量的值 例如tmp 但以下不起作用 我应该如何获取模板
  • 使用 AutoMapper 映射未知类型

    我在用着AutoMapper将一个对象的属性复制到另一个对象 这是我的代码 Get type and create first object Type itemType Type GetType itemTypeName var item
  • Android 6.0 Adb wifi 连接

    我有一台装有 Android 6 0 的 Nexus 6 设备 库存版本无需 root 为了避免用 USB 电缆永久连接设备 我使用了这个程序 我通过 USB 电缆将设备连接到 PC 在终端上输入adb tcpip 5555 type ad
  • 以字符串形式返回 Matplotlib 图像

    我在 django 应用程序中使用 matplotlib 想直接返回渲染的图像 到目前为止我可以走plt savefig 然后返回图像的位置 我想做的是 return HttpResponse plt renderfig mimetype
  • 使用正则表达式 re.sub 删除指定单词之前的所有内容(包括指定单词)

    我有一个字符串 看起来像 Blah blah blah 更新 2012 年 8 月 23 日 我想使用正则表达式从中提取日期Aug 23 2012 我在书库里找到一篇文章 内容类似 正则表达式删除字符之前的所有文本 但是当我尝试时这也不起作
  • Windows 上的信号处理

    我有一个独立的 PHP 脚本 我将处理从 Windows 操作系统发送的信号 以便在发出 终止信号 时正常关闭 我怎样才能在 Windows 上做到这一点 2020 年 3 月更新 从 PHP 7 4 开始 有sapi windows se