Forker 可以让 php-cli 进程借助 nohup 以守护进程的方式运行。
Forker可以让php-cli进程借助nohup以守护进程的方式运行。这个Forker仅仅是让进程成为守护进程,不会复制父进程的内存。 无 ?php// 运行实例,fork 10 个进程,每个进程输出一行 Im a worker ,并保存在 /tmp/forker.log 中:// CLI命令: php Forker.php 10/
Forker 可以让 php-cli 进程借助 nohup 以守护进程的方式运行。这个 Forker 仅仅是让进程成为守护进程,不会复制父进程的内存。
<?php // 运行实例,fork 10 个进程,每个进程输出一行 Im a worker ,并保存在 /tmp/forker.log 中: // CLI命令: php Forker.php 10 /* if (empty($argv[1])) { echo "Im a worker\n"; sleep(10); exit(); } else { $forker = new Forker('/tmp/forker.log'); $forker->fork($forker->findCommand('php') . ' ' . __FILE__, (int)$argv[1] <= 0 ? 10 : (int)$argv[1]); } */ /** * Forker 可以让 php-cli 进程借助 nohup 以守护进程的方式运行。 * 这个 Forker 仅仅是让进程成为守护进程,不会复制父进程的内存。 */ class Forker { private $nohub = '/usr/bin/nohup'; private $out = '/tmp/forker.log'; /** * @param string $output 输出文件的路径。进程的标准输出将重定向到此文件 * @throws \RuntimeException */ public function __construct($output = '') { if (false !== ($nohup = $this->findCommand('nohup'))) { $this->nohub = $nohup; } if (!is_executable($this->nohub)) { throw new \RuntimeException('nohup not excutable'); } if ($output) { $this->setOutput($output); } } /** * 设置输出文件的路径。进程的标准输出将重定向到此文件 * @param string $file * @return \Forker * @throws \RuntimeException */ public function setOutput($file) { if (!is_file($file)) { $dir = dirname($file); if ((!is_dir($dir) && !mkdir($dir, 0755, true)) || !is_writable($dir)) { throw new \RuntimeException('output is not writable, can not create output'); } } else if (!is_writable($file)) { throw new \RuntimeException('output is not writable'); } $this->out = $file; return $this; } /** * 获取输出文件的路径 * @return string */ public function getOutput() { return $this->out; } /** * 执行命令 * @param string $command 命令。命令中的文件参数需要使用绝对路径 * @param int $forks fork的进程数 */ public function fork($command, $forks = 1) { for ($i = 0; $i < $forks; ++$i) { $this->execute($command); } } /** * 根据当前环境查找命令的绝对路径 * @param string $name * @return boolean */ public function findCommand($name) { $file = trim(exec("which {$name}")); if (is_file($file) && is_executable($file)) { return $file; } return false; } /** * 执行命令,成功返回 true,失败返回 false * @param string $command * @return boolean */ private function execute($command) { $lines = []; $code = 0; exec("{$this->nohub} {$command} >> {$this->out} 2>&1 &", $lines, $code); if (0 !== (int)$code) { file_put_contents($this->out, "fork {$command} FAILD[{$code}]:\n" . implode("\n", $lines) . "\n", FILE_APPEND); return false; } file_put_contents($this->out, "fork {$command} OK\n", FILE_APPEND); return true; } }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

explorer.exe是什么进程在我们使用Windows操作系统的时候,经常会听到一个名词"explorer.exe".那么,你是否好奇这个进程到底是什么?在本文中,我们将详细解释explorer.exe是什么进程以及其功能和作用。首先,explorer.exe是Windows操作系统的一个关键进程,它负责管理和控制Windows资源管理器(Window

“com surrogate”是“C:\Windows\System32\dllhost.exe”的进程;出现该进程通常是“COM+”组件停止工作,这个进程占用高甚至直接未响应,这是由于电脑在加载文件图标的时候出现问题,导致电脑变的卡顿,可以在计算机属性设置中解决卡顿问题。

ccsvchst.exe是一种常见的进程文件,它是SymantecEndpointProtection(SEP)软件的一部分,而SEP则是一款由著名的网络安全公司Symantec开发的终端保护解决方案。作为该软件的一部分,ccsvchst.exe负责管理和监控SEP的相关进程。首先,我们来了解一下SymantecEndpointProtection(

nohup的作用及原理解析在Unix和类Unix操作系统中,nohup是一个常用的命令,用于在后台运行命令,即便用户退出当前会话或关闭终端窗口,命令仍然能够继续执行。在本文中,我们将详细解析nohup命令的作用和原理。一、nohup的作用后台运行命令:通过nohup命令,我们可以让需要长时间运行的命令在后台持续执行,而不受用户退出终端会话的影响。这在需要运行

在Linux系统中,僵尸进程是已经终止但仍保留在系统中的特殊进程。虽然僵尸进程不会消耗太多资源,但如果数量过多,可能会导致系统资源耗尽。本文将介绍如何正确清除僵尸进程,以确保系统的正常运行。1Linux僵尸进程子进程完成任务后,如果父进程没有及时检查状态,子进程将成为僵尸进程。子进程在等待父进程确认,完成后系统才会回收。否则,僵尸进程会继续悬挂在系统中。要检查系统中是否存在僵尸进程,可通过运行命令top来查看所有正在运行的进程及可能存在的僵尸进程。‘top’命令的结果从上图可以看到Linux中进

Linux进程优先级调整方法详解在Linux系统中,进程的优先级决定了其在系统中的执行顺序和资源分配情况。合理调整进程的优先级可以提高系统的性能和效率。本文将详细介绍Linux中如何调整进程的优先级,并提供具体的代码示例。一、进程优先级概述在Linux系统中,每个进程都有一个与之相关联的优先级。优先级的范围一般是-20到19,其中-20表示最高优先级,19表

downloads可以删除吗近年来,随着数字化时代的来临,我们生活中出现了越来越多的数字化产品和服务。而随之而来的,就是我们对于数字化内容的需求与日俱增。在日常生活和工作中,我们经常需要下载各种各样的文件,如文档、图片、音频和视频等等。而这些下载的文件,通常都被保存在一个名为“downloads”(下载)的文件夹之中。然而,随着时间的推移,我们经常会发现,“

如何在Windows11和Windows10中暂停任务管理器进程更新按CTRL+窗口键+删除打开任务管理器。默认情况下,任务管理器将打开“进程”窗口。正如您在此处看到的,所有应用程序都在无休止地移动,当您想要选择它们时,可能很难将它们指向下方。因此,按CTRL并按住它,这将暂停任务管理器。您仍然可以选择应用程序,甚至可以向下滚动,但您必须始终按住CTRL按钮。
