2024 年 PHP Conference Japan

pclose

(PHP 4, PHP 5, PHP 7, PHP 8)

pclose關閉行程檔案指標

說明

pclose(資源 $handle): 整數

關閉由 popen() 開啟的管線檔案指標。

參數

handle

檔案指標必須有效,且必須是由先前成功呼叫 popen() 所返回的。

返回值

返回已執行程序的終止狀態。如果發生錯誤,則返回 -1

注意事項:

如果 PHP 是以 --enable-sigchild 編譯的,則此函式的返回值未定義。

範例

範例 #1 pclose() 範例

<?php
$handle
= popen('/bin/ls', 'r');
pclose($handle);
?>

備註

注意僅限 Unix 系統:

pclose() 內部使用 waitpid(3) 系統呼叫來實作。要取得實際的退出狀態碼,應該使用 pcntl_wexitstatus() 函式。

參見

  • popen() - 開啟程序檔案指標

新增備註

使用者貢獻的備註 4 則備註

Uwe Ohse
9 年前
關於返回值
「返回已執行程序的終止狀態。如果發生錯誤,則返回 -1。」
以及關於退出狀態的注意事項:「pclose() 內部使用 waitpid(3) 系統呼叫來實作。要取得實際的退出狀態碼,應該使用 pcntl_wexitstatus() 函式。」

關於返回值的說明文件,充其量只是誤導。此函式與 proc_close() 一樣會返回:
* 發生錯誤時返回 -1,
* 如果 WIFEXITED(status) 為真,則返回 WEXITSTATUS(status),或
* 如果 WIFEXITED(status) 為假,則返回 status,
其中 status 是 waitpid() 的狀態參數。

這使得無法區分相對正常的退出或由訊號終止,並將 proc_close 返回值的價值降低為二進位值(正常 / 出現錯誤)。

這可以在 ext/standard/proc_open.c (PHP 5.4.44, 5.6.12) 中的 proc_open_rsrc_dtor() 中看到。

建議使用 pcntl_wexitstatus 的注意事項完全錯誤。因為它已經被使用過,所以無法使用 pcntl_wexitstatus。
kcross at nssolutions dot com
21 年前
在 4.1.1 和 4.2.3 之間的某個版本,pclose 的返回值發生了變化。

退出狀態以前位於第二個位元組中,因此狀態為 (pclose($fp)/256)。

現在它位於低位位元組中,因此狀態只是 pclose($fp)。

請小心。
vdweij at mailsurf dot com
21 年前
據我理解,如果 popen 無法執行指定的命令,pclose 將返回 0(在每個平台上)。

因為 popen 只返回是否能夠發送命令的狀態,而不返回是否成功執行的狀態。只有 pclose 的返回值才能用於檢查命令是否可以執行。
Mike
16 年前
如同其他註釋中指出的,終止狀態與程序的退出狀態不同。然而,像 "pclose($fp)/256" 這樣的做法並不是提取退出狀態的正確方法,因為它使用了特定系統和版本的知識,了解退出狀態儲存在終止狀態的哪個位置。(此外,該程序可能甚至沒有正常退出,因此它可能根本沒有退出狀態。)

相反,應該使用 pcntl_wifexited() 和 pcntl_wexitstatus() 函數。它們是 C 巨集 WIFEXITED() 和 WEXITSTATUS() 的包裝器,分別用於確定程序是否具有退出狀態以及該狀態為何。
To Top