在 Linux 系统上,以非特权用户身份运行 apache2,您无法在降低进程的优先级后提高其优先级。此外,您也不能使用 apache_child_terminate。我发现以下方法有效
<?php
// 降低优先级
proc_nice(19);
// 杀死子进程以“重置”优先级
posix_kill( getmypid(), 28 );
?>
(PHP 5, PHP 7, PHP 8)
proc_nice — 更改当前进程的优先级
proc_nice() 通过 priority
中指定的数量更改当前进程的优先级。正数的 priority
会降低当前进程的优先级,而负数的 priority
会提高优先级。
proc_nice() 与 proc_open() 及其相关函数没有任何关系。
priority
新的优先级值,该值在不同平台上可能会有所不同。
在 Unix 上,较小的值,如 -20
表示高优先级,而正值表示较低的优先级。
对于 Windows,priority
参数具有以下含义
优先级类别 | 可能的值 |
---|---|
高优先级 |
priority < -9 |
高于正常优先级 |
priority < -4 |
正常优先级 |
priority < 5 & priority > -5 |
低于正常优先级 |
priority > 5 |
空闲优先级 |
priority > 9 |
版本 | 描述 |
---|---|
7.2.0 | 此函数现在在 Windows 上可用。 |
示例 #1 使用 proc_nice() 将进程优先级设置为高
<?php
// 最高优先级
proc_nice(-20);
?>
注意: 可用性
proc_nice() 仅在您的系统具有 'nice' 功能时才存在。'nice' 符合:SVr4、SVID EXT、AT&T、X/OPEN、BSD 4.3。
注意: 仅限 Windows
proc_nice() 将更改当前进程优先级,即使 PHP 使用线程安全进行编译。
在 Linux 系统上,以非特权用户身份运行 apache2,您无法在降低进程的优先级后提高其优先级。此外,您也不能使用 apache_child_terminate。我发现以下方法有效
<?php
// 降低优先级
proc_nice(19);
// 杀死子进程以“重置”优先级
posix_kill( getmypid(), 28 );
?>
如果重新调整了进程的优先级,那么它的所有子进程都将继承该优先级。因此,PHP 脚本可以调用 proc_nice 来调整自身优先级,然后调用 system(),通过 system() 执行的命令也将调整优先级。
另外值得注意的是 ionice。PHP 没有为此提供函数,但它很重要。优先级调整的程序可以毫无问题地消耗所有 I/O 带宽,同时 CPU 使用率很低,因此它可能会让整个计算机无响应,尽管程序员的意图并非如此。使用“ionice -c3”或参见“man ionice”。
需要注意的是,这是一个相对变化。我之前没有正确阅读描述,无法理解为什么设置 proc_nice(0) 无法将派生的子进程优先级恢复到 0!
例如,如果您运行以下代码
<?php
proc_nice(-5);
proc_nice(0); // 将没有效果
proc_nice(5); // 将优先级恢复到 0
?>
在 Debian(以及可能许多其他 Linux 发行版)下的 PHP CLI 中,您可以从 proc 文件系统读取“优先级”。(可能有一个 PHP 命令可以提供此信息,但此页面上似乎没有链接到它。)
例如
<?php
$Current_Niceness_Value = intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18]);
// 注意:旧版本的 Linux 返回一个无符号整数,需要将其转换为有符号整数。
$Current_Niceness_Value = unpack("l",pack("L",intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18])))[1];
?>
用于检查进程优先级的简单函数,默认情况下返回当前进程的优先级
<?php
public static function getProcessNice ($pid = null) {
if (!$pid) {
$pid = getmypid ();
}
$res = `ps -p $pid -o "%p %n"`;
preg_match ('/^\s*\w+\s+\w+\s*(\d+)\s+(\d+)/m', $res, $matches);
return array ('pid' => (isset ($matches[1]) ? $matches[1] : null), 'nice' => (isset ($matches[2]) ? $matches[2] : null));
}
?>