在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函数可以实现此功能,但这很重要。一个优先级被调整的程序会愉快地尝试使用非常少的CPU使用率来消耗所有I/O带宽,因此它可能会使整个计算机无响应,尽管程序员的意图并非如此。使用“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));
}
?>