当前位置: 首页 > 知识库问答 >
问题:

杀叉过程

魏勇军
2023-03-14

我想写一个php脚本在后台运行。这需要pcntl_ fork。我使用这个函数来分叉一个孩子:

function launchchild($programexe,$programvars) 
{ 
//foreach ($tasks as $key => $v){ 
switch ($pid = pcntl_fork()) { 
  case -1: 
     // @fail 
     die('Fork failed'); 
     break; 

  case 0: 
     // @child: Include() misbehaving code here 
     pcntl_exec($programexe,$programvars);
     break; 

  default: 
     // @parent 
     //pcntl_waitpid($pid, $status); 
     break; 
} 

//print "Done! :^)\\n\\n"; 
}

我在一分钟内用下面这样的片段来称呼它:

$parameters = array('/Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/gather_checks.php', $serialize_triagger, $server_list[$server_choose]);
launchchild('/Applications/XAMPP/xamppfiles/bin/php',$parameters); // fork a child for parallel processing.

所以,它只能优雅地工作几分钟。我用‘PS-ax | grep PHP’查了一下流程。我看到有这么多的进程,永远不会结束,直到代码将给出35个错误,这意味着我们没有更多的内存来运行它!这就是‘PS-ax | grep PHP’的结果

ps -ax | grep php
12020 ttys001    0:00.07 /Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/main.php
12021 ttys001    0:00.00 (php-5.3.1)
12022 ttys001    0:00.00 (php-5.3.1)
12025 ttys001    0:00.00 (php-5.3.1)
12028 ttys001    0:00.00 (php-5.3.1)
12037 ttys001    0:00.00 (php-5.3.1)
12040 ttys001    0:00.00 (php-5.3.1)
12043 ttys001    0:00.00 (php-5.3.1)

当我取消注释 //pcntl_waitpid($pid, $status);它像一个魅力一样工作,没有任何问题,从来没有。但我不希望父母等待孩子工作。任何事情都会有所帮助。

共有2个答案

陈鸿才
2023-03-14

您正在启动另一个程序/脚本,因此您不需要任何分叉,只需使用system()屏幕获取终端(idk if

权弘新
2023-03-14

PHP的PCNTL函数,如<code>PCNTL_fork</code>,不应该从web服务器上使用,因为子进程最终不会得到正确的清理。(正如您无疑注意到的那样。)这些函数主要用于独立的PHP守护进程,以及不适用于此处的特殊情况。

请使用更高级的流程控制函数,如< code>proc_open()。如果您需要在后台运行一个进程,请使用< code >通过shell运行它

 类似资料:
  • 问题内容: 假设我有一个bash脚本(),它的格式非常简单,如下所示: 第三行模仿,在Mac OS X上默认没有,但您可以将其视为与相同。但是,当我运行此脚本时,得到以下输出: 我如何抑制中间的线,以便我看到的是和? 问题答案: 怎么样呢?这在Linux上的Bash上最适合我。 编辑: 更好地匹配海报的代码。

  • 问题内容: 我在一家开发公司工作,正在对Web应用程序进行重大的重新设计,该应用程序在每次单击后都会重新加载所有内容,以广泛使用Javascript,因此实际上感觉就像是一个真正的Web应用程序。功能之一是使用基于Web的Painter(我认为是Web上的MSPaint),我将其嵌入到“按需页面”中。绘制并上传图像后,Web应用程序将卸载该applet,然后继续显示文件上传到的目录。 这是麻烦开始

  • 嗨,我想知道Android是如何管理内存的,我找不到确切的答案。假设我有一个应用程序在当前activity堆栈上有5个活动(4个停止,1个恢复),没有连接服务。我按HOME键,这样我的所有活动都停止了。我启动了一些其他内存消耗应用程序,而整个设备内存开始变低。问题是 …我的申请会发生什么? 系统是否只能破坏我的一个或部分活动以恢复内存? 系统会扼杀我的应用程序的整个过程吗?所有活动都会被很好地销毁

  • 在命令行中运行时,会出现以下失败 在肯定的情况下-报告说 null 谢谢你的帮助

  • 问题内容: 我正在使用SUSE SLES 11在POWER7系统上运行多程序工作负载(基于SPEC CPU2006基准)。 有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量会超过系统中安装的可用内存(32 GB)。 我禁用了交换,因为否则使用交换的过程可能会严重影响测量结果。我知道通过这样做,内核可以通过OOM杀手来杀死某些进程。很好 问题是我希望内核杀死的线程以错误条件退出(例如

  • 问题内容: 有时,当我尝试启动Firefox时,它会显示“ Firefox进程已在运行”。所以我必须这样做: 我想要的是一个可以为我完成所有任务的命令。它会在进程列表中使用一个输入字符串并将其(或其他内容)放入其中,并杀死输出中的所有进程: 我尝试在PHP中执行此操作,但似乎只显示已在PHP脚本本身中执行过的进程(因此,它显示的唯一进程是其自身。) 问题答案: 详细信息:http : //linu