(PHP 5, PHP 7, PHP 8)
proc_nice — Change the priority of the current process
proc_nice() changes the priority of the current
process by the amount specified in priority. A
positive priority will lower the priority of the
current process, whereas a negative priority
will raise the priority.
proc_nice() is not related to proc_open() and its associated functions in any way.
priorityThe new priority value, the value of this may differ on platforms.
On Unix, a low value, such as -20 means high priority
whereas positive values have a lower priority.
For Windows the priority parameter has the
following meaning:
| Priority class | Possible values |
|---|---|
| High priority |
priority < -9
|
| Above normal priority |
priority < -4
|
| Normal priority |
priority < 5 &
priority > -5
|
| Below normal priority |
priority > 5
|
| Idle priority |
priority > 9
|
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.
| Version | Description |
|---|---|
| 7.2.0 | This function is now available on Windows. |
Example #1 Using proc_nice() to set the process priority to high
<?php
// Highest priority
proc_nice(-20);
?>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.
Note: Windows only
proc_nice() will change the current process priority, even if PHP was compiled using thread safety.
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 );
?>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.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];
?>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));
}
?>