在 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);
?>
注意:可用性
只有在您的系統具有 'nice' 功能時,proc_nice() 才會存在。'nice' 符合:SVr4、SVID EXT、AT&T、X/OPEN、BSD 4.3。
注意:僅限 Windows
即使使用執行緒安全編譯 PHP,proc_nice() 也會變更目前的程序優先順序。
在 Linux 系統上,以非特權使用者身分執行 apache2 時,在降低程序優先順序後,無法再提高程序優先順序。而且,您也不能使用 apache_child_terminate。不過,我發現以下方法有效
<?php
//降低優先順序
proc_nice(19);
//終止子程序以「重設」優先順序
posix_kill( getmypid(), 28 );
?>
如果重新調整程序的優先順序,則其所有子程序都會繼承該優先順序。因此,PHP 腳本可以對自身呼叫 proc_nice,然後呼叫 system(),而且透過 system() 執行的命令也會被調整優先順序。
也值得注意 ionice。雖然沒有適用於此的 PHP 函式,但它很重要。一個被調整優先順序的程式可能會很高興地耗盡所有 I/O 頻寬,但 CPU 使用率卻非常低,因此可能會導致整個電腦無回應,儘管程式設計師的意圖並非如此。請使用 "ionice -c3" 或參閱 "man ionice"
請務必注意,這是一個相對變更。我沒有正確閱讀描述,所以搞不懂為什麼設定 proc_nice(0) 沒有將 fork 的子程序恢復為 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));
}
?>