CakeFest 2024: The Official CakePHP Conference

proc_nice

(PHP 5, PHP 7, PHP 8)

proc_niceÄndert die Priorität des aktuellen Prozesses

Beschreibung

proc_nice(int $priority): bool

proc_nice() ändert die Priorität des aktuellen Prozesses um den in priority angegebenen Betrag. Ein positives priority vermindert die Priorität des aktuellen Prozesses, während ein negatives priority die Priorität erhöht.

proc_nice() ist in keiner Weise verwandt mit proc_open() und der dazugehörigen Funktionen.

Parameter-Liste

priority

Der neue Prioritätswert; dieser Wert ist plattformabhängig.

Unter Unix bedeutet ein niedriger Wert, wie beispielsweise -20, eine hohe Priorität, wohingegen ein positiver Wert eine niedrigere Priorität hat.

Unter Windows hat der Parameter priority die folgende Bedeutung:

Prioritätsklasse Mögliche Werte
Hoch priority < -9
Höher als normal priority < -4
Normal priority < 5 & priority > -5
Niedriger als normal priority > 5
Leerlauf (Idle) priority > 9

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben. Wenn ein Fehler auftritt, zum Beispiel weil der User keine Berechtigung hat, die Priorität eines Prozesses zu ändern, wird ein Fehler der Stufe E_WARNING erzeugt.

Changelog

Version Beschreibung
7.2.0 Diese Funktion steht nun unter Windows zur Verfügung.

Beispiele

Beispiel #1 Verwendung von proc_nice(), um die Prozesspriorität auf hoch zu setzen

<?php
// höchste Priorität
proc_nice(-20);
?>

Anmerkungen

Hinweis: Verfügbarkeit

proc_nice() existiert nur, wenn Ihr System mit 'nice' umgehen kann. 'nice' ist verfügbar unter: SVr4, SVID EXT, AT&T, X/OPEN und BSD 4.3.

Hinweis: Nur für Windows

proc_nice() ändert die aktuelle Prozesspriorität, selbst wenn PHP mit Threadsicherheit kompiliert wurde.

Siehe auch

add a note

User Contributed Notes 5 notes

up
7
kevin AT REMOVETHIS mrkmg.com
10 years ago
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 );

?>
up
3
php at richardneill dot org
13 years ago
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"
up
2
Marek
13 years ago
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.
up
0
phil_php at zieaon dot com
2 years ago
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];

?>
up
0
pandi at home dot pl
15 years ago
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));
}

?>
To Top