2024年PHP开发者大会日本站

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函数可以实现此功能,但这很重要。一个优先级被调整的程序会愉快地尝试使用非常少的CPU使用率来消耗所有I/O带宽,因此它可能会使整个计算机无响应,尽管程序员的意图并非如此。使用“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
16年前
用于检查进程优先级的简单函数,默认情况下返回当前进程的优先级

<?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