Tập lệnh PHP - phát hiện xem chạy dưới linux hay Windows?


143

Tôi có một đoạn mã PHP có thể được đặt trên hệ thống windows hoặc hệ thống linux. Tôi cần phải chạy các lệnh khác nhau trong cả hai trường hợp.

Làm thế nào tôi có thể phát hiện môi trường tôi đang ở? (tốt nhất là một cái gì đó PHP hơn là hack hệ thống thông minh)

Cập nhật

Để làm rõ, tập lệnh đang chạy từ dòng lệnh.


Sau khi thực hiện các tiêu chuẩn, có vẻ như bất kỳ sự khác biệt về hiệu năng giữa \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'\stripos(\PHP_OS, 'WIN')là dưới 15%. Vì cả ba giải pháp chỉ mất khoảng 100 nano giây, dù sao đây cũng sẽ là một tối ưu hóa vi mô. Vì vậy, chọn bất cứ giải pháp nào bạn thích. Cuối cùng, bạn có thể lập luận rằng đó \strncasecmp(\PHP_OS, 'WIN', 3) === 0là dễ đọc nhất.
caw

Câu trả lời:


228

Kiểm tra giá trị của DocsPHP_OS không đổi .

Nó sẽ cung cấp cho bạn các giá trị khác nhau trên Windows như WIN32, WINNThoặc Windows.

Xem thêm: Các giá trị có thể có cho: PHP_OSphp_unameDocs :

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

Nó sẽ có giá trị gì nếu là Windows? Không có gì trong các tài liệu mà tôi có thể nhìn thấy.
Shabbycoat


8
stripos(PHP_OS, 'WIN') === 0có thể được sử dụng thay thế, dễ đọc hơn / đơn giản hơn.
John Hunt

1
@ dw1 - nó vẫn hoạt động khi tìm kiếm "win" lúc đầu.
John Hunt

62

Bạn có thể kiểm tra xem dấu phân cách thư mục là /(đối với unix / linux / mac) hoặc \trên windows. Tên không đổi là DIRECTORY_SEPARATOR.

if (DIRECTORY_SEPARATOR === '/') {
    // unix, linux, mac
}

if (DIRECTORY_SEPARATOR === '\\') {
    // windows
}

Thật không may, điều này không hoạt động với Windows 7 và Zend Server. Trong trường hợp này, TRỰC TIẾP_SEPARATOR cũng là '\'
Achim

4
@Achim Ý bạn là gì? Zend Server là phần mềm máy chủ, không phải HĐH. Windows 7 sẽ trở lại \.
mở

1
strpos(__FILE__,92)khai thác hành vi tương tự; PATH_SEPARATOR>":"cũng trả về true cho Windows (PATH_SEPARATOR là ":" trên tất cả các HĐH khác).
Tít

Biến điều này thành một chức năng:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
Mario Lurig

37
if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}

có vẻ như một chút thanh lịch hơn câu trả lời được chấp nhận. Mặc dù vậy, việc phát hiện đã nói ở trên với DIRECTORY_SEPARATOR là nhanh nhất.


Xin lỗi, nhưng điều này không hoạt động đúng nếu bạn đang sử dụng máy chủ Mac, vì trong Mac bạn có một chuỗi chứa "DARWIN", cũng chứa "THẮNG", vì vậy trong máy chủ Mac bạn sẽ nhận được "Đây là một máy chủ sử dụng Windows! " Điều đó không đúng sự thật.
OMA

13
Chà, điều này không hoàn toàn đúng. Lưu ý rằng strncasecmpn ký tự đầu tiên , không chỉ bất kỳ n ký tự. Nếu bạn đã thử nó, bạn sẽ tìm ra rằng đánh giá . strncasecmp('DARWIN', 'WIN', 3) == 0false
Ondřej Bouda

18

Lưu ý rằng PHP_OS báo cáo hệ điều hành mà PHP được xây dựng trên , mà không nhất thiết phải là hệ điều hành tương tự mà nó hiện đang chạy trên.

Nếu bạn đang sử dụng PHP> = 5.3 và chỉ cần biết bạn đang chạy trên Windows hay không - Windows thì hãy kiểm tra xem một trong các hằng số cụ thể của Windows có được xác định hay không, ví dụ:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Đúng không phải là nơi PHP được xây dựng BẬT mà cho những gì nó được xây dựng CHO 2. Điều này áp dụng cho các cửa sổ được xác định liên quan theo cùng một cách ...
StanE

Dù sao PHP được xây dựng cho Windows không thể chạy trên unix, phải không?
Stalinko


7

Theo các hằng số được xác định trước: Ghi chú đóng góp của người dùng Giải pháp của ROLer và rdcapasso, bạn chỉ cần tạo lớp trợ giúp như thế này:

<?php

class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}

Sử dụng:

if(System::getOS() == System::OS_WIN) {
  // do something only on Windows platform
}

6

Điều này sẽ hoạt động trong PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}

5

Bắt đầu với PHP 7.2.0, bạn có thể phát hiện HĐH đang chạy bằng hằng số PHP_OS_FAMILY:

if (PHP_OS_FAMILY === "Windows") {
  echo "Running on Windows";
} elseif (PHP_OS_FAMILY === "Linux") {
  echo "Running on Linux";
}

Xem tài liệu PHP chính thức cho các giá trị có thể của nó.


4

Các hằng số được xác định trước cốt lõi: http://us3.php.net/manual/en/reserved.constants.phpPHP_OS (string)hằng số.

Hoặc nếu bạn muốn phát hiện HĐH của máy khách:

<?php
    echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

    $browser = get_browser(null, true);
    print_r($browser);
?>

Từ http://us3.php.net/manual/en/feft.get-browser.php


Theo chỉnh sửa của bạn, bạn có thể tham khảo công khai này Tên máy chủ PHP công khai này từ Dòng lệnh

Bạn có thể dùng

string php_uname ([ string $mode = "a" ] )

Vì thế

php_uname("s")

'S': Tên hệ điều hành. ví dụ. FreeBSD.

Sẽ làm mẹo cho bạn, xem tại đây http://php.net/manual/en/feft.php-uname.php


4

Để phát hiện xem đó là Windows, OS X hay Linux:

if (stripos(PHP_OS, 'win') === 0) {
    // code for windows
} elseif (stripos(PHP_OS, 'darwin') === 0) {
    // code for OS X
} elseif (stripos(PHP_OS, 'linux') === 0) {
    // code for Linux
}

striposchậm hơn một chút so với substrtrường hợp cụ thể này, nhưng nó đủ hiệu quả cho một nhiệm vụ nhỏ như vậy và thanh lịch hơn.


Mặc dù mã này đủ đơn giản, nhưng câu trả lời này không tự đứng vững: Một câu trả lời tuyệt vời không bắt buộc người ta phải đọc câu hỏi khi đến từ một công cụ tìm kiếm, bởi vì nó là độc lập.
jpaugh

2

Bạn có thể kiểm tra nếu một hằng số tồn tại trong PHP> 5.3.0 ( thủ công )

if (defined('PHP_WINDOWS_VERSION_BUILD')) {
    // is Windows
}

Trước đây, phương pháp này đã được sử dụng trong Symfony. Bây giờ họ sử dụng một phương pháp khác :

if ('\\' === DIRECTORY_SEPARATOR) {
    // is Windows
}

0

Nếu bạn muốn kiểm tra nếu chạy trong Linux, chỉ cần kiểm tra nếu (PHP_OS === 'Linux'). Không cần sử dụng strtolower () và chất nền ().


-1
function isWin(){
 if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || PHP_SHLIB_SUFFIX == 'dll' || PATH_SEPARATOR == ';') {
    return true;
 } else {
    return false;
 }
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.