等待所有 pid 在 php 中退出

2024-02-22

我的问题是这样的。我正在分叉一个进程,以便可以加快磁盘上文件的访问时间。我将这些文件中的所有数据存储在本地桌面上的 tmp 文件中。理想情况下,在所有进程完成后,我需要访问该 tmp 文件并将该数据放入数组中。然后我取消链接 tmp 文件,因为不再需要它。我的问题是, pcntl_wait() 似乎并没有真正等到所有子进程完成后才继续进行最后一组操作。因此,我最终在某个随机过程完成之前取消了该文件的链接。

我似乎无法找到一种可靠的方法来等待所有进程完全退出然后访问我的数据。

    $numChild       = 0;    
    $maxChild       = 20;   // max number of forked processes.

    // get a list of "availableCabs"

    foreach ($availableCabs as $cab) {

            // fork the process
            $pids[$numChild] = pcntl_fork();

            if (!$pids[$numChild]) {

                    // do some work     
                    exit(0);

            } else {

                    $numChild++;
                    if ($numChild == $maxChild) {

                            pcntl_wait($status);
                            $numChild--;

                    } 

            } // end fork   

    }

    // Below is where things fall apart. I need to be able to print the complete serialized data. but several child processes don't actually exit before i unlink the file.

    $dataFile = fopen($pid, 'r');

    while(($values = fgetcsv($dataFile,',')) !== FALSE) {
            $fvalues[] = $values;
    }

    print serialize($fvalues);

    fclose($dataFile);
    unlink($file);      

请注意,我遗漏了很多关于我实际在做什么的代码,如果我们需要发布那不是问题。


尝试重构代码,以便有两个循环 - 一个生成进程,另一个等待进程完成。您还应该使用pcntl_waitpid() http://uk.php.net/manual/en/function.pcntl-waitpid.php检查特定进程 ID,而不是您当前使用的简单子进程计数方法。

像这样的事情:

<?php

  $maxChildren = 20;   // Max number of forked processes
  $pids = array();     // Child process tracking array

  // Get a list of "availableCabs"

  foreach ($availableCabs as $cab) {

    // Limit the number of child processes
    // If $maxChildren or more processes exist, wait until one exits
    if (count($pids) >= $maxChildren) {
      $pid = pcntl_waitpid(-1, $status);
      unset($pids[$pid]); // Remove PID that exited from the list
    }

    // Fork the process
    $pid = pcntl_fork();

    if ($pid) { // Parent

      if ($pid < 0) {
        // Unable to fork process, handle error here
        continue;
      } else {
        // Add child PID to tracker array
        // Use PID as key for easy use of unset()
        $pids[$pid] = $pid;
      }

    } else { // Child

      // If you aren't doing this already, consider using include() here - it
      // will keep the code in the parent script more readable and separate
      // the logic for the parent and children

      exit(0);

    }

  }

  // Now wait for the child processes to exit. This approach may seem overly
  // simple, but because of the way it works it will have the effect of
  // waiting until the last process exits and pretty much no longer
  foreach ($pids as $pid) {
    pcntl_waitpid($pid, $status);
    unset($pids[$pid]);
  }

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

等待所有 pid 在 php 中退出 的相关文章

  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 间歇性 PHP 抽象类错误

    我已经为此奋斗了一段时间 但无法弄清楚 也许其他人也有 或者 Slim PHP Apache 等这里有更深层次的问题 在正常工作几个小时后 我的 Slim 安装将开始给出所有路线均如此 致命错误 类 Slim Collection 包含 1
  • 在PHP中,如何在表格中显示数组内容

    如果我在 MySQL 客户端中进行选择 我将得到如下所示的输出 mysql gt select FROM group LIMIT 2 group id group supergroup id group deletable group la
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • 无法在 Laravel 8 中运行迁移:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: 名称或服务未知 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我不明白为什么我的迁移在全新安装 Laravel 8 时失败 这就是我得到的结果 Illuminate Database
  • 使用 php ping 网站

    我想创建一个 php 脚本 它将 ping 一个域并列出响应时间以及请求的总大小 这将用于监控网站网络 我尝试过curl 这是我到目前为止的代码 function curlTest2 url clearstatcache return if
  • 使用 php 脚本的电子邮件管道

    你好 我想将所有电子邮件 到达我的收件箱 转发到 php 脚本并检索电子邮件内容并将其保存在文件中 因此 我正确地添加了具有管道路径的电子邮件转发器 转发地址 电子邮件受保护 cdn cgi l email protection 管道到程序
  • php 邮件特殊字符 utf8

    我有以下脚本 在电子邮件中 主题 Testmail Special Characters Body Hi there this isn t somet
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 管理面板的 htaccess 重写规则

    我的网络应用程序中有这样的 url 模式 www mysitename com foldername controller method 所有请求的页面首先被重定向到根文件夹上的index php 然后处理请求的页面 但每当我进入管理面板
  • PHP括号少IF条件不接受多个语句

    我从来都不喜欢控制结构中的括号 直到今天我才意识到它如何只接受括号内的一条语句而不是 if 条件 如果我有多个语句 它会抛出语法错误 这是 PHP 的工作方式还是我的 IDE 有问题 显然错误很明显 但我只是想确保这是正常的 如果您有任何其
  • PHP MVC 应用程序中哪里可以捕获异常?

    我有一个中小型 PHP 应用程序 用于练习 OOP 和 MVC 技能 我有初始化 引导程序调用的文件Router谁打电话控制器 gt 服务层 gt 存储库 数据库 然后将变量发送回视图层 所有依赖项均由 DiC IOC 处理 我创建抽象类
  • 警告:mysqli_query() 期望参数 1 为 mysqli,在 中给出 null

    我正在尝试构建一个简单的自定义 CMS 但出现错误 警告 mysqli query 期望参数 1 为 MySQLi 在中给出的为 null 为什么我会收到此错误 我的所有代码都已经是 MySQLi 并且我使用两个参数 而不是一个 con m
  • 访问 Magento 购物车和/或结帐中的运费

    请注意 这个问题是关于运费 而不是价格 有一个重要的区别 即运输方式为店主支付的费用是多少 而不是客户支付的费用 The shipping tablerate数据库表包括一个cost字段 该字段填充在Mage Shipping Model
  • Doctrine2:入门教程“没有要处理的元数据类”

    我已经将本教程的第一部分运行了三遍 到目前为止 在这里或其他地方进行的大量搜索都无法帮助我使其发挥作用 我收到 没有要处理的元数据类 当我尝试时 php vendor bin doctrine orm schema tool update
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • Monolog,如何将 PHP 数组记录到控制台?

    我正在使用浏览器处理程序将消息记录到 JS 控制台 require once vendor autoload php use Monolog Logger use Monolog Handler BrowserConsoleHandler
  • 通过php将mp3转换为ogg

    我有一个网站 用户可以上传音乐并将其转换为 mp3 但我需要 mp3 和 ogg 文件支持才能以 html5 播放音乐 那么 有没有可以将mp3转换为ogg的php脚本呢 使用 ffmpeg 您可以直接从 php 脚本执行命令

随机推荐

  • 使用 textFileStream 的 Python Spark Streaming 示例不起作用。为什么?

    我使用spark 1 3 1和Python 2 7 这是我第一次体验 Spark Streaming 我尝试使用 Spark Streaming 从文件中读取数据的代码示例 这是示例的链接 https github com apache s
  • pandas 系列的 groupby 不起作用

    我无法对 pandas Series 对象进行 groupby 数据帧很好 但我似乎无法对系列进行分组 有人能够让它发挥作用吗 gt gt gt import pandas as pd gt gt gt a pd Series 1 2 3
  • Go 中任意精度常量的目的是什么?

    Go 具有任意大小和精度的无类型精确数值常量 这spec requires https golang org ref spec Constants所有编译器都支持至少 256 位的整数 以及至少 272 位的浮点数 尾数为 256 位 指数
  • Feign Hystrix 回退不起作用

    我有以下 FeignClient FeignClient name FooMS fallback CustomerFeign CustomerFeignImpl class public interface CustomerFeign Re
  • Rails 3 UTF-8 查询字符串显示在 URL 中?

    我的主页 上有一个搜索查询表单 当我提交此搜索表单时 我希望最终到达 search query foo 但是 现在我得到 search utf8 E2 9C 93 query foo 那个 utf8 参数在那里做什么 我怎样才能摆脱它 Th
  • 为什么我所有的看跌期权都返回 =>nil?

    我知道这似乎是一个非常简单的问题 但我的看跌期权不断生成 gt nil 这真的让我很困扰 我寻找答案但找不到答案 谢谢 把 眨眼 4 眨眼眨眼眨眼 gt 无 因为那是返回值puts put obj nil 将给定对象写入 ios 与 IO
  • 使用 Nhibernate 在子查询中仅选择不带 group by 属性的 max 子句

    我有这样的 SQL 查询 select from dbo table1 where Id in select max id as id from dbo table1 group by prop1 prop2 prop3 我想创建 NHib
  • Runtime.getRuntime().exec(String[]) 安全性

    我正在使用 Runtime getRuntime exec String 来运行进程 其中 String 数组的某些元素是由用户定义的 这安全吗 或者它允许将代码注入终端吗 如果不安全 我该怎么做才能避免代码注入 它必须是平台独立的 正如我
  • 如何在迭代时向列表添加值[重复]

    这个问题在这里已经有答案了 我有一个这样的场景 List
  • Android-R.java 文件未找到

    在处理 android 项目时 我被 R java 文件困住了 即使我清理项目 项目 gt clean 也找不到该文件 但该文件仍然找不到 即使我创建一个相同的新项目出现问题 我需要做什么 我期待有价值的答复 以便我可以克服这个问题 R j
  • 不知道如何导出 Objective-C 类。 i386 体系结构的未定义符号

    我正在尝试在 OSX 上的 GTK 上做一些工作 但遇到了一些麻烦 因为说实话 我对 Objective C 不太熟悉 我有足够的编程经验 可以很快掌握基本语法 并且可以在文档中查找我需要的内容 但我遇到的问题与链接库并将类暴露给我链接的程
  • 使用 Linkify.addLinks 与 Html.fromHtml 结合使用

    我有一个TextView通过调用以下命令获取其数据集 tv setText Html fromHtml myText 字符串myText包含部分格式化的 html 数据 例如 它可能有字体标签 但没有任何使用格式设置的 url 链接 a h
  • 通过 MsBuildProj 文件转换多个项目的多个配置文件

    我正在尝试根据模式 所有形式的文件 在文件列表上运行多个命令 config在给定目录的子目录下 如下所示
  • Node.js docker 容器未更新以适应卷的变化

    我正在尝试在我的 Windows 计算机上托管一个开发环境 该计算机托管前端和后端容器 到目前为止 我只在后端工作 所有文件都位于 C 盘上 通过 Docker Desktop 共享 我有以下 docker compose 文件和 Dock
  • 通过 Response.ContentType、Response.End 输出文件时如何显示进度状态/旋转器?

    我有一个网络表单下载链接按钮 在按钮的点击事件上我正在获取数据 然后生成 XLSX 文件供下载 在文件生成过程中 响应 Clear 叫做 响应内容类型被设定并最终响应 End 叫做 我需要显示微调器 gif在那次操作期间 文件生成并弹出文件
  • 角度区域

    什么是区域 Angular ngZone 与 zone js 有何不同 什么时候应该使用它们 有人可以帮助提供使用 ngZone 的实际示例吗 我在这里浏览了角度文档 但是我无法完全理解 https angular io api core
  • Systemd http 健康检查

    我在 Redhat 7 1 上有一个服务 我使用 systemctl 启动 停止 重新启动和状态来控制 有一次 systemctl 状态返回 active 但服务 背后 的应用程序响应的 http 代码与 200 不同 我知道我可以使用 M
  • 每次插入数据库时​​如何找到数据字段(例如电子邮件)的唯一性?

    我正在开发一个 Android 应用程序 用户在其中输入姓名 电子邮件和密码进行注册 这个输入过程工作得很好 现在我想在每次用户输入他 她的电子邮件时检查输入的电子邮件是否已存在于我的数据库中 为此 我在 DBHelper 类中尝试了以下方
  • 4.1 android模拟器未检测到sd卡

    我曾经使用 4 1 kitkat x86 android 模拟器和 SD 卡进行测试 将 Android Studio 升级到 2 3 后 我无法再访问 android 中提供的 SD 卡 这使得我无法进行测试 谷歌还没有对此的答案 我也没
  • 等待所有 pid 在 php 中退出

    我的问题是这样的 我正在分叉一个进程 以便可以加快磁盘上文件的访问时间 我将这些文件中的所有数据存储在本地桌面上的 tmp 文件中 理想情况下 在所有进程完成后 我需要访问该 tmp 文件并将该数据放入数组中 然后我取消链接 tmp 文件