php 分叉问题

2024-01-09

我有以下测试 php 来执行 fork/spawn 过程,其中测试还尝试在完成后杀死子进程(僵尸)。

我希望有一个更有效的流程,其中任何子进程都会尽快从进程表中删除。当前尝试填满了进程表,并导致内存分配问题,导致系统关闭。该应用程序在 Fedora/Centos 系统上运行。

当它运行时,我遇到了内存分配错误,并且在被删除之前生成了太多进程。

任何指点将不胜感激,谢谢。

$fname="ef_deptData.txt";

$t=0;
$pids = array();
$pids1[] = array();


$fh=fopen($fname,"r");
$p=0;
while(!feof($fh))
{
    print " inside course   pppppppppppppppppppppp \n";
    //--go ahead and parse the line of input from the file 
    //--(if it exists)

    $buf = fgets($fh);

    $buf=trim($buf);
    if($buf)
    {
        $data1=explode("&&",$buf);
        $stateVal=trim($data1[0]);
        $collegeVal=trim($data1[1]);
        $campusVal=trim($data1[2]);

        $pid = pcntl_fork();

        //process the spawned child procs
        if($pid) 
        {
            $pids[$p]=$pid;
            $p=$p+1;
        }
        else 
        {
            $app="ef_course.py";

            $args[0]='"'.$stateVal.'"';
            $args[1]='"'.$collegeVal.'"';
            $args[2]='"'.$campusVal.'"';

            pcntl_exec($app, $args);
        }
    }
    $t=$t+1;
    if($t==40)
    {
        sleep(5);
        $t=0;
    }
}


    // --this section is a kludge to see if the child process is complete
    // --prior to deleting the spwaned child process (should be a better way)
$q=true;
    while($q)
    {  
            $a="ps -aux  |  grep ef_course   | grep -v grep   |   awk '{print $8}'";
            $a=`$a`;
            $t=explode("\n",$a);
            $t=array_slice($t,1,-1);
            print_r($t);
            sleep(5);
            $y=0;

            for($i=0;$i<count($t);$i++)
            {
                    if((strcmp($t[$i],"Z+")!=0)&&(strcmp($t[$i],"Z")!=0))
                    {
                            $y=1;
                            print "ddd \n";
                    }
           }

           if($y==0)
    {
        //--try to go ahead and kill the zombie processes
        $w="pgrep ef_course";
        $r=`$w`;
        if($r!="")
        {
            //foreach($pids as $p){ posix_kill($p,SIGHUP); } 
            //foreach($pids as $p){ posix_kill($p,SIGINT); } 
            foreach($pids as $p){ posix_kill($p,SIGTERM); } 

            $dead_and_gone = pcntl_waitpid(-1,$status,WNOHANG);
            while($dead_and_gone > 0){
                // Remove the gone pid from the array
                unset($pids[array_search($dead_and_gone,$pids)]); 

                // Look for another one
                $dead_and_gone = pcntl_waitpid(-1,$status,WNOHANG);
            }
            print_r($pids);
        }
        else
            $q=false;
    }
    sleep(10);
    print "waiting for ef_course.py to complete \n";
}

更新::: 设法得到我认为的解决方案......

 //--start the process to get the store urls..
 $fname="ef_programData.txt";

 $t=0;
 $pids = array();
 $pids1[] = array();


  $fh=fopen($fname,"r");
  $p=0;
  while(!feof($fh))
  {
          print " inside program   pppppppppppppppppppppp \n";
         //--go ahead and parse the line of input from the file 
         //--(if it exists)

            $tmp=array();
            $buf = fgets($fh);

            $buf=trim($buf);
            if($buf)
            {
                   $data1=explode("&&",$buf);

                   $pid = pcntl_fork();

                   //process the spawned child procs
                   if($pid) 
                   {
                          $pids[]=$pid;
                   }
                    else 
                     {
                           $args=array();
                           $app="foo.py";

                           $args[0]='"'.$stateVal.'"';

                           pcntl_exec($app, $args);
                    }

                    while(pcntl_wait($status, WNOHANG) > 0) {
                      usleep(500);
                    }

                     while(list($key, $val) = each($pids)) {
                     if(!posix_kill($val, 0)) { // This detects if the child is still running or not
                           unset($pids[$key]);
                     }
                    }
                    $pids = array_values($pids); // Reindex the array

            }
            $t=$t+1;
            if($t==40)
            {
                    sleep(5);
                    $t=0;
            }
    }

只需使用 pcntl_wait() 即可。无需查看子进程是否完成,只需调用 pcntl_wait() 并阻塞直到子进程被收获。

避免传递 WNOHANG,以便您的父进程将坐下来等待子进程完成。

您可以将您编写的收获代码(从示例的第 58 行“$q=true;”开始)替换为:

$status = null;

do {
    // You can use $status with pcntl_wifexited(), pcntl_wifstopped(),
    // pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() and
    // pcntl_wstopsig() if you need to.

    $pid = pcntl_wait($status);

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

php 分叉问题 的相关文章

  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 标签

    我正在使用某人留下的遗留代码 而重新部署代码恰好是我的任务 我使用的是 Windows Server 2003 Apache 2 0 63 和 PHP 5 2 10 这不起作用 至少 不是以我期望的方式工作 如果你愿意的话 可以称之为错误
  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • .htaccess 异常导致主目录出现问题

    这是我的目录结构 localhost or livehost app bootstrap public vendor code demo 这是我的 htaccess
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • PHP:读取字体文件的 TrueType/OpenType 元数据

    如何阅读字体详细信息 例如 字体在其元数据中包含版权 姓氏 设计者 版本等信息 我还希望脚本能够计算文件中的字形数量 并返回字体支持的语言 例如 典型的字体可能包含西方语言 瑞典语和罗马语言支持 并具有数百个字形 它应该支持 truetyp
  • 将 Google 信任徽章添加到 Magento

    我正在尝试将 Google Trust Badge 添加到我的 magento 商店 我尝试在 Magento 网站上搜索扩展程序 但找不到 我是否需要将以下代码粘贴到产品和结账页面 还是必须对其进行更改 如果有人能引导我走向正确的方向 我
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 设置 Apache CouchDB 屏幕在容器重新启动时重新出现

    我使用官方 Docker 镜像运行 CouchDB v2 3 我已使用 Fauxton 将数据库配置为单节点 data 目录挂载到本地目录 当我重新启动容器时 数据库仍然存在 所以卷绑定按预期工作 现在 每次我重新启动容器并导航到 设置 选
  • Spark Streaming + Kafka:SparkException:无法找到 Set 的领导者偏移量

    我正在尝试设置 Spark Streaming 以从 Kafka 队列获取消息 我收到以下错误 py4j protocol Py4JJavaError An error occurred while calling o30 createDi
  • 库中存储库的 NoSuchBeanDefinitionException

    我创建了一个用于在多个 Spring Boot 应用程序上共享代码的库 该库包含一个 Repository 类RequestRepository 将库添加到 Spring Boot 项目后 编译并成功运行单元测试 Library Reque
  • YSlow 规则“不要在 HTML 中缩放图像”背后的基本原理是什么

    我在以下地方遇到过这个规则YSlow http developer yahoo com performance rules html no scale为了提高性能 表示不应在 HTML 中调整图像大小 他们没有提到这条规则的任何具体原因 有
  • 为什么OpenGL(IOS)中有.pvr文件

    我正在 IOS 中使用 OpenGL 制作应用程序 使用 PVR 纹理来制作 3D 效果 我无法理解 pvr 文件 所以请朋友们了解一下 pvr 文件以及它在 OpenGL 中的重要性以及我该如何制作它 PVR 文件是各种纹理格式的容器 例
  • 从 condaenvironment.yaml 安装时的依赖项的 pip 依赖项

    我正在尝试为项目的用户创建一个 condaenvironment yml 文件 其中一种依赖项不是由 conda 分发的 而是通过 pip github 提供 我假设基于这个例子 https github com conda conda b
  • 使用 avro-tools 连接 Avro 文件

    我正在尝试将 avro 文件合并为一个大文件 问题是concat命令不接受通配符 hadoop jar avro tools jar concat input part output bigfile avro I get 线程 main 中
  • MYSQL INSERT 中的德语变音

    我的 mysql 插入语句有问题 我有一个将 utf 8 字符正确提交到插入文件的表单 我已经检查了 POST 变量 现在 当我查看数据库中的 INSERT 时 没有变音符号 而是问号 该错误必须位于插入语句之前 如果我从数据库输出 手动输
  • Scikit-learn Predict_proba 给出错误答案

    这是来自的后续问题如何知道 Scikit learn 中的 Predict proba 返回数组中表示哪些类 https stackoverflow com questions 16937243 how to know what class
  • 使用 Google Analytics 进行 Javascript 覆盖/对话跟踪

    使用 javascript 在我的例子中准确地说是 jQuery 我需要启用一个对话框 以便在 Google Analytics 中将其作为唯一的页面视图进行跟踪 尽管它只是一个模态叠加层 出于上下文目的 我不希望用户离开页面并且对话框内容
  • UITextField 上的 UITapGestureRecognizer 在 IOS 7.1 中不再工作

    我有一个UITapGestureRecognizer附于一个UITextField以获得类似 下拉 的效果 当 的时候UITextField被点击 我提出一个UIPopover与内容 这在 7 1 之前就像一个魅力 现在UITextFiel
  • 如何知道电子邮件地址是否无效?

    我在 www email it 上的电子邮件地址已被禁用 因为我已经很长时间没有使用它了 现在 当我访问 FB 时 我收到以下消息 Our systems have detected that email protected cdn cgi
  • 在 IntelliJ IDEA 14 中运行 JUnit 测试而不选择配置类型

    在带有 Gradle 插件的 IntelliJ IDEA 14 中 我想运行 JUnit 测试 而不询问配置类型 当我第一次运行测试时出现问题 本次运行没有配置 我从未在 IDE 中使用 Gradle 运行测试 因此禁用使用 Gradle
  • 如何根据其他列值设置唯一约束

    我编写以下脚本用于客户域维护 在我的脚本中 我想在表中进行修改 如果状态为活动 我想为端口字段设置唯一约束 否则 如果状态为非活动 我不想设置唯一约束 如何根据其他列值设置此约束 请帮我 bin bash echo Enter the Da
  • C# ui Automation [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试在 C 中自动化 gui 这与浏览器自动化相同吗 我如何启动 ui 自动化 如果您使用 WPF Microsoft 有一个非
  • 如何使用 heroku CLI 连接到选定的应用程序

    我正在尝试在 Heroku 上部署我的 Java Web 应用程序 当我制作教程时 我使用创建了一个应用程序赫罗库创建命令 我们可以说它是 name app1 然后我在教程结束后删除了它并创建了一个新的来部署它 让它成为 new app 但
  • 最新的 CSS 父选择器 [重复]

    这个问题在这里已经有答案了 我能找到的关于此的最新信息是W3C 选择器 4 级编辑草稿 http dev w3 org csswg selectors 4 但是 据我所知 它不再提及父选择器 我知道有一个谷歌对此进行的调查 https do
  • 我的 TableView 中分隔线之前的空白

    我有一个关于 UITableView 的问题 我有一个 UITableViewController 并且创建了一个自定义单元格 当我可视化 tableView 时 我在分隔线之前看到了一点空白 正如您在这个屏幕截图中看到的那样 为什么 这是
  • F# 与 OCaml:堆栈溢出

    我最近发现了一个关于适合 Python 程序员的 F http combiol org fs FSUG FS4PPv2 pptx 看完之后 我决定自己实现一个 蚂蚁谜题 的解决方案 有一只蚂蚁可以在平面网格上走动 蚂蚁一次可以向左 向右 向
  • php 分叉问题

    我有以下测试 php 来执行 fork spawn 过程 其中测试还尝试在完成后杀死子进程 僵尸 我希望有一个更有效的流程 其中任何子进程都会尽快从进程表中删除 当前尝试填满了进程表 并导致内存分配问题 导致系统关闭 该应用程序在 Fedo