開發環境(Windows)與生產環境往往不同,程式碼需根據作業系統動態調整路徑分隔符、指令執行、擴充套件載入等邏輯。PHP 提供多種內建常數與函式可偵測 OS 類型,本文整理最可靠的判斷方法與實用程式碼片段。
| 常數/函式 | Windows 典型值 | Linux/Unix 典型值 | 說明 |
|---|---|---|---|
PHP_OS | WINNT, WIN32 | Linux, FreeBSD, Darwin | 編譯時期作業系統標識,最常用 |
php_uname() | Windows NT ... | Linux localhost 2.6... | 回傳完整核心版本資訊 |
DIRECTORY_SEPARATOR | \ | / | 目錄分隔符,建構跨平台路徑必用 |
PATH_SEPARATOR | ; | : | 路徑搜尋分隔符(如 include_path) |
PHP_SHLIB_SUFFIX | dll | so | 動態庫副檔名 |
PATH_SEPARATOR(推薦,無函式呼叫開銷)<?php
if (PATH_SEPARATOR === ':') {
echo 'Linux/Unix 環境';
} else {
echo 'Windows 環境';
}
?>
PHP_OS 前綴(標準作法)<?php
// 取得前 3 字元並轉大寫比對
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
echo 'This is a server using Windows!';
} else {
echo 'This is a server NOT using Windows!';
}
// 完整輸出範例
echo php_uname(); // 例:Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686
echo PHP_OS; // 例:Linux / WINNT
?>
DIRECTORY_SEPARATOR 區分(直觀)<?php
define('DS', DIRECTORY_SEPARATOR);
$path = 'var' . DS . 'www' . DS . 'html'; // 自動適應平台分隔符
?>
$configPath = (strtoupper(substr(PHP_OS,0,3)) === 'WIN')
? 'C:/config/app.ini'
: '/etc/app/app.ini';
$cmd = (PHP_OS === 'WINNT') ? 'dir' : 'ls -la';
exec($cmd, $output);
dl(PHP_SHLIB_SUFFIX === 'dll' ? 'php_xdebug.dll' : 'xdebug.so');
strpos($_SERVER['SERVER_SOFTWARE'], 'Win'):$_SERVER 依賴 Web 伺服器提供,CLI 模式下不可用。PHP_OS 為編譯時期常數:跨平台複製二進位檔(如 php.exe)時會保留原編譯平台標識,但 PHP 腳本本身可攜性不受影響。Linux,符合實際執行環境。掌握 PHP_OS、PATH_SEPARATOR、DIRECTORY_SEPARATOR 三大關鍵常數,即可輕鬆編寫跨平台相容的 PHP 程式碼,消除「本機測試正常、上線報錯」的部署困擾。