pcntl_fork 在 PHP 中如何工作?

2023-12-25

我很困惑pcntl_fork http://php.net/pcntl_fork in PHP.

我认为它具有多线程功能,但它是如何工作的以及如何在脚本中使用它?


PCNTL 不能创建线程。它仅“分叉”当前的 PHP 进程。这是什么意思?你打电话时pcntl_fork(),当前进程被分成两个进程。父进程的整个命名空间被复制到子进程中,两个进程继续并行执行,只有一个区别:pcntl_fork()返回父进程中子进程的 PID0在孩子。

一些提示:

  • 默认情况下它是禁用的。如果您设法启用它,则仅针对 CLI 执行此操作。切勿将其与网络服务器一起使用!它将以非确定性方式表现。它还可能导致整个机器瘫痪。请保持禁用状态并继续阅读。
  • 进程之间的通信是可能的,但很糟糕(通过 共享内存中的序列化对象)。
  • 文件描述符(和数据库 连接)是共享的,这经常会导致问题。分叉后必须重新连接数据库否则你会得到类似的错误MySQL server has gone away当第一个进程关闭连接时,来自所有分叉进程。
  • 父进程必须等待子进程完成,否则它将离开僵尸进程 后面的进程消耗系统资源。

这是例子来自文档 http://php.net/manual/en/function.pcntl-fork.php:

<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {
     // we are the parent
     pcntl_wait($status); //Protect against Zombie children
} else {
     // we are the child
}

但请记住,PHP 只是脚本语言。它不是为并行计算而设计的。根据您的需要,您可以通过同时运行 CRON、消息队列或较低级语言的程序来做得更好。

分叉的 PHP 程序非常难以阅读、理解和调试。维护该计划将是一场噩梦。

不要犯错误并避免分叉。你不需要它。您真正需要的是异步任务运行程序。好消息,有RabbitMQ https://www.rabbitmq.com/ and 不错的教程 https://www.sitepoint.com/use-rabbitmq-php/;-) 您还可以尝试有前途的 RabbitMQ 库,名为Bunny https://github.com/jakubkulhan/bunny

PS:使用消息队列而不是分叉给你带来了另一个优势。您可以使用多个服务器处理队列,并随着流量的增长进行水平扩展。

编辑2019-03-07

我玩过很多异步并发框架amphp在这里我不得不提一下。如果您确实需要在单个请求中运行异步非阻塞任务,我认为amphp成为今天最好的解决方案。它使用 php 生成器的概念($value = yield $promise)来执行人类可读的代码,而无需像reactphp那样的承诺地狱。

https://amphp.org/ https://amphp.org/

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

pcntl_fork 在 PHP 中如何工作? 的相关文章

  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 图像随机损坏(但刷新后加载)并显示“资源解释为图像但使用 MIME 类型 text/html 传输”

    我目前正在开发一个简单的 php 网站 问题是 我的整个网站中的图像 发生在所有 php 文件中 随机损坏并显示错误资源解释为图像 但以 MIME 类型 text html 传输但是 如果我尝试多次刷新页面 可以再次加载图像并且错误消失 我
  • 按文件名对 $_FILES 进行排序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 他俩 如您所知 在新的 HTML5 中 您可以非常轻松地上传多个文件 但我这里的问题是如何按列 名称 对 FILES 数组进行排序 这是
  • Yii2 - 错误请求 (#400) |前端和后端cookie

    仅当我打开时才会出现此问题frontend and backend在相同的browser 设想 与后端交互 gt 切换选项卡 gt 与前端交互 gt 切换选项卡返回 gt 与后端交互 gt 错误请求 400 Cookie 后端 identi
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从网站网址中隐藏 .html 扩展名

    我知道这个问题以前曾被问过 但有人知道隐藏 html 扩展名的好方法吗 我已经尝试了许多代码和许多答案https stackoverflow com https stackoverflow com 但我没有看到结果 那是我再问你一次 我有一
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 将 cookie 设置为在当天结束时过期

    我想设置一个 cookie 并让它在一天结束时过期 这有效 但 24 小时后过期 setcookie route upgrade voted true time 86400 这不起作用 setcookie route upgrade vot
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 覆盖 FOS 用户包中的“更改密码”模板

    我做了一些研究 遗憾的是找不到任何帮助 因此 我将 FOSUserBundle ChangePasswordAction 渲染到我的模板中 但它显示供应商提供的默认模板 我的渲染控制器的模板 block body h2 Einstellun
  • Laravel Vue 组件只能传递数字?

    在我的 UserMenu vue 中我写道 export default props nameVal data return 并在blade php中
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • 如何使用更新资源控制器 laravel 4?

    我有带有索引 编辑 更新方法的客户控制器 Route resource customer CustomerController 控制器方法更新 public function update id echo id 我的 HTML 表单
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • PHPUnit - 模拟 S3Client 无法正常工作

    库 aws aws sdk php 2 PHP 版本 PHP 5 4 24 cli 作曲家 json require php gt 5 3 1 aws aws sdk php 2 require dev phpunit phpunit 4
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐

  • Cocoa-Touch,核心数据:如何删除实体的所有对象?

    我有一个应用程序 使用 Core Data 和 SQLite 存储 在某些时候 我想删除一些实体的所有对象 可能有近千个物体 据我通过谷歌和官方文档所知 删除对象的唯一方法是 managedObjectContext deleteObjec
  • 如何以编程方式检查 X509 证书是否已在 Java 信任库中?

    我正在开发一个客户端 GUI 它接受自签名服务器证书并将其添加到信任存储中 就像任何浏览器一样 问题是我的客户端应用程序每次启动时都会要求提供证书 换句话说 它不记得该证书已经在信任存储中 我该如何实施 这就是我编写信任存储文件的方式 pu
  • WPF 刷新绘图是否与 Windows 窗体类似?

    因此 如果我有一个 WPF 窗口 在 WPF 窗口上移动另一个窗口是否会导致 WPF 窗口像 Windows 窗体一样进行数千次重绘 我想知道在这种情况下使用矢量的效果 而不是像窗口窗体那样基于位图的一切 你可以看一下WPF架构 http
  • 如何处理WinRT异常导致的Exception?

    如果 Windows 运行时类型引发 COM 错误 NET 似乎经常 或总是 将此错误包装到一个Exception实例 错误消息包括 COM HRESULT 错误代码 例如 当将新的加密 API 与 AES CBC 一起使用时 错误的缓冲区
  • 如何向 ActionBar 添加 SearchWidget?

    我正在尝试将 Search ActionView 添加到我的应用程序中 如此处所述http developer android com guide topics search search dialog html UsingSearchWi
  • 如何使用 NativeScript + Angular 2 项目添加侧边菜单?

    我想知道如何在我当前的 NativeScript Angular 2 项目上添加侧面菜单 我知道它有一个侧面菜单模板 但我将其作为空白项目启动 我想知道如何添加此功能 您将需要使用 Telerik UI for NativeScript h
  • 如何将大型 XML 文件转换为类似 java 8 的流对象

    嘿 我有一个 非常 大的 XML 文件 100GB 其中包含 foo 列表 我想将其转换为流 就像它们引入 java 8 对象一样 对库或代码示例有什么想法吗 在开始时
  • 需要运行文件夹中所有命令的Windows命令文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 https www online tech tips com computer tips create windows batch f
  • 如何停止实体框架缓存

    我们在测试 Entity Framework 4 时遇到问题 我们部署了一个实现 EF 数据上下文的 WCF 服务 一切正常 直到我们使用 SQL Server Studio 修改数据 有没有办法停止 EF 缓存我们的结果 或者有没有办法打
  • 除了 Google App Engine 之外还有 Python 云托管吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 等待进程结束异步,然后调用主窗体中的函数

    我正在用 C 编写一个游戏编辑器 我的程序通过启动 notepad exe 进程以 txt 文件打开 如果该进程退出 我想调用主窗体中的函数 以更新文本框 这是我到目前为止正在做的事情 void OpenTextEditor TreeNod
  • 从大表读取时出现 java.lang.OutOfMemoryError

    我正在尝试从 PostgreSQL 中的一个非常大的表 300GB 预先生成报告 我做了这样的事情 rs stmt executeQuery SELECT FROM tbl System out println select all fin
  • jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到)

    我看到有关文件的错误消息 min map 未找到 GET jQuery 的 jquery 1 10 2 min map 正在触发 404 未找到 截屏 这是从哪里来的 如果 Chrome DevTools 报告 map 文件的 404 可能
  • 循环比较宏

    我已经使用 Word 完成了一个文本比较宏 我需要循环它 以便它可以在几组文档之间进行比较 关于如何做到这一点有什么想法吗 这是我的代码 Dim template1 As Word Document Dim spool1 As Word D
  • Sqlalchemy:查询多态类的 m2m 关系

    我有两个通过多对多关系连接的类 Parent and Tag Base declarative base association table Table associations Base metadata Column parent id
  • Proguard 在不混淆的情况下进行收缩和优化

    在我的应用程序中 我有库项目依赖项 其中包含许多未使用的方法字段和类 由于这是一个第三方库 我不想自己删除所有未使用的类和方法 因为它是未来的更新 我正在尝试为此使用混淆器 但是 dontobfuscate 只会将整个项目排除在任何优化 缩
  • PHP 编译器 xdebug 警告

    PHP 新手 从事 PHP 项目并启用 xdebug 以便能够调试我的 PHP 应用程序 生产服务器没有启用 xdebug 因为它是由另一个团队处理的 在我的本地计算机上 当我运行 Composer 时 它会给我一个警告 You are r
  • 当只有一个子项可用时,最后一个子项样式会覆盖第一个子项样式

    ul li first child a border radius 5px 5px 0 0 ul li last child a border radius 0 0 5px 5px 当只有一个子项时 最后一个子项样式将覆盖第一个子项样式 有
  • Mysql 容器无法在 Kubernetes 上启动

    我正在使用this https hub docker com layers bitnami mysql 5 7 images sha256 87d11d41343c5404073f13b555e2849db4cb975f10e9b84ff4
  • pcntl_fork 在 PHP 中如何工作?

    我很困惑pcntl fork http php net pcntl fork in PHP 我认为它具有多线程功能 但它是如何工作的以及如何在脚本中使用它 PCNTL 不能创建线程 它仅 分叉 当前的 PHP 进程 这是什么意思 你打电话时