PHP 日本研討會 2024

proc_nice

(PHP 5,PHP 7,PHP 8)

proc_nice變更目前程序的優先順序

描述

proc_nice(int $priority): bool

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

傳回值

成功時傳回 true,失敗時傳回 false。如果發生錯誤(例如使用者缺乏變更優先順序的權限),也會產生 E_WARNING 層級的錯誤。

變更紀錄

版本 描述
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() 也會變更目前的程序優先順序。

參見

新增註解

使用者貢獻註解 5 則註解

kevin AT REMOVETHIS mrkmg.com
11 年前
在 Linux 系統上,以非特權使用者身分執行 apache2 時,在降低程序優先順序後,無法再提高程序優先順序。而且,您也不能使用 apache_child_terminate。不過,我發現以下方法有效

<?php

//降低優先順序
proc_nice(19);

//終止子程序以「重設」優先順序
posix_kill( getmypid(), 28 );

?>
php at richardneill dot org
14 年前
如果重新調整程序的優先順序,則其所有子程序都會繼承該優先順序。因此,PHP 腳本可以對自身呼叫 proc_nice,然後呼叫 system(),而且透過 system() 執行的命令也會被調整優先順序。

也值得注意 ionice。雖然沒有適用於此的 PHP 函式,但它很重要。一個被調整優先順序的程式可能會很高興地耗盡所有 I/O 頻寬,但 CPU 使用率卻非常低,因此可能會導致整個電腦無回應,儘管程式設計師的意圖並非如此。請使用 "ionice -c3" 或參閱 "man ionice"
Marek
13 年前
關於 ionice - 在 Linux 上,ionice -c3 類別的影響類似於 nice,因為在計算 I/O 優先順序時會將 CPU「優先順序」納入考量。
phil_php at zieaon dot com
3 年前
請務必注意,這是一個相對變更。我沒有正確閱讀描述,所以搞不懂為什麼設定 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];

?>
pandi at home dot pl
16 年前
用於檢查程序優先順序的簡單函式,預設會傳回目前程序的優先順序

<?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