proc_nice
(PHP 5)
proc_nice — Change the priority of the current process
Description
$increment
)
proc_nice() changes the priority of the current
process by the amount specified in increment
. A
positive increment
will lower the priority of the
current process, whereas a negative increment
will raise the priority.
proc_nice() is not related to proc_open() and its associated functions in any way.
Parameters
-
increment
-
The increment value of the priority change.
Return Values
Returns TRUE
on success or FALSE
on failure.
If an error occurs, like the user lacks permission to change the priority,
an error of level E_WARNING
is also generated.
Notes
Note: Availability
proc_nice() will only exist if your system has 'nice' capabilities. 'nice' conforms to: SVr4, SVID EXT, AT&T, X/OPEN, BSD 4.3. This means that proc_nice() is not available on Windows.
Коментарии
Simple function for check process nice, by default returns nice of current process:
<?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));
}
?>
If a process is reniced, then all its children inherit that niceness. So a PHP script can call proc_nice on itself, then invoke system(), and the command executed via system() will also be niced.
Also worth making a note of ionice. There's no PHP function for this, but it's important. A nice'd program will happily try to chew up all i/o bandwidth with very little CPU usage, it can therefore make the entire computer non-responsive despite the programmer's intention. Use "ionice -c3" or see "man ionice"
Regarding ionice - on linux the impact of the ionice -c3 class is similar to that of nice, because the CPU "niceness" is taken into account when calculating the io niceness.
On a Linux system, running apache2 as a non-privileged user you can not increase the niceness of the process after decreasing it. Also, you can not use the apache_child_ terminate either. I found the following does work though:
<?php
//decrease niceness
proc_nice(19);
//kill child process to "reset" niceness
posix_kill( getmypid(), 28 );
?>
It is important to note that this is a relative change. I didn't read the description properly and couldn't figure out why setting proc_nice(0) didn't take the forked children back to 0!
For example if you run:
<?php
proc_nice(-5);
proc_nice(0); // will have no effect
proc_nice(5); // will take the niceness back to 0
?>
In PHP CLI under Debian (and probably many other Linux flavours) you can read the 'niceness' from the proc filesystem. (There may be a PHP command that gives this info but there doesn't seem to be a link to it on this page.)
E.g
<?php
$Current_Niceness_Value = intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18]);
// Note: Older versions of Linux return an unsigned integer which has to be converted to a signed integer.
$Current_Niceness_Value = unpack("l",pack("L",intval(explode(" ",file_get_contents("/proc/".getmypid()."/stat"))[18])))[1];
?>