proc_nice

(PHP 5, PHP 7, PHP 8)

proc_nice更改当前进程的优先级

描述

proc_nice(int $priority): bool

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

返回值

如果成功则返回 true,失败则返回 false。如果发生错误,例如用户没有更改优先级的权限,则还会生成级别为 E_WARNING 的错误。

变更日志

版本 描述
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 使用线程安全进行编译。

参见

添加注释

用户贡献的注释 5 个注释

kevin AT REMOVETHIS mrkmg.com
11 年前
在 Linux 系统上,以非特权用户身份运行 apache2,您无法在降低进程的优先级后提高其优先级。此外,您也不能使用 apache_child_terminate。我发现以下方法有效

<?php

// 降低优先级
proc_nice(19);

// 杀死子进程以“重置”优先级
posix_kill( getmypid(), 28 );

?>
php at richardneill dot org
14 年前
如果重新调整了进程的优先级,那么它的所有子进程都将继承该优先级。因此,PHP 脚本可以调用 proc_nice 来调整自身优先级,然后调用 system(),通过 system() 执行的命令也将调整优先级。

另外值得注意的是 ionice。PHP 没有为此提供函数,但它很重要。优先级调整的程序可以毫无问题地消耗所有 I/O 带宽,同时 CPU 使用率很低,因此它可能会让整个计算机无响应,尽管程序员的意图并非如此。使用“ionice -c3”或参见“man ionice”。
Marek
13 年前
关于 ionice - 在 Linux 上,ionice -c3 类别的影响类似于 nice,因为在计算 IO 优先级时会考虑 CPU 的“优先级”。
phil_php at zieaon dot com
3 年前
需要注意的是,这是一个相对变化。我之前没有正确阅读描述,无法理解为什么设置 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];

?>
pandi at home dot pl
15 年前
用于检查进程优先级的简单函数,默认情况下返回当前进程的优先级

<?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));
}

?>
To Top