Script PHP - mendeteksi apakah berjalan di linux atau Windows?


143

Saya memiliki skrip PHP yang dapat ditempatkan pada sistem windows atau sistem linux. Saya perlu menjalankan perintah yang berbeda dalam kedua kasus.

Bagaimana saya bisa mendeteksi lingkungan tempat saya berada? (lebih disukai sesuatu PHP daripada hack sistem pintar)

Memperbarui

Untuk memperjelas, skrip berjalan dari baris perintah.


Setelah melakukan tolok ukur, tampaknya ada perbedaan kinerja antara \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'dan di \stripos(\PHP_OS, 'WIN')bawah 15%. Karena ketiga solusi hanya membutuhkan sekitar 100 nanodetik, ini akan menjadi optimasi mikro. Jadi pilih solusi apa pun yang Anda suka. Akhirnya, Anda mungkin berpendapat bahwa \strncasecmp(\PHP_OS, 'WIN', 3) === 0itu yang paling mudah dibaca.
gak

Jawaban:


228

Periksa nilai DokumenPHP_OS konstan .

Ini akan memberi Anda berbagai nilai pada Windows seperti WIN32, WINNTatauWindows .

Lihat juga: Nilai yang Mungkin Untuk: PHP_OS dan php_unameDocuments :

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

Apa nilainya jika itu Windows? Tidak ada dalam dokumen yang bisa saya lihat.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0dapat digunakan sebagai gantinya, bisa dibilang lebih mudah dibaca / sederhana.
John Hunt

1
@ dw1 - ini masih berfungsi saat mencari "menang" di awal.
John Hunt

62

Anda dapat memeriksa apakah pemisah direktori /(untuk unix / linux / mac) atau \di windows. Nama konstannya adalah DIRECTORY_SEPARATOR.

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

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

Sayangnya ini tidak berfungsi dengan Windows 7 dan Zend Server. Dalam hal ini DIRECTORY_SEPARATOR juga '\'
Achim

4
@Achim Apa maksudmu? Zend Server adalah perangkat lunak server, bukan OS. Windows 7 harus kembali \.
mpen

1
strpos(__FILE__,92)mengeksploitasi perilaku yang sama; PATH_SEPARATOR>":"mengembalikan true untuk Windows juga (PATH_SEPARATOR adalah ":" di semua OS lain).
Titus

Mengubah ini menjadi fungsi: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!';
}

sepertinya sedikit lebih elegan daripada jawaban yang diterima. Deteksi yang disebutkan sebelumnya dengan DIRECTORY_SEPARATOR adalah yang tercepat.


Maaf, tetapi ini tidak berfungsi dengan benar jika Anda menggunakan server Mac, karena di Mac Anda mendapatkan string yang berisi "DARWIN", yang juga berisi "WIN", jadi di server Mac Anda akan mendapatkan "Ini adalah server menggunakan Windows! " itu tidak benar.
OMA

13
Ya, ini tidak sepenuhnya benar. Perhatikan bahwa strncasecmpmengambil n karakter pertama , bukan sembarang n karakter. Jika Anda mencobanya, Anda akan menemukan yang mengevaluasi . strncasecmp('DARWIN', 'WIN', 3) == 0false
Ondřej Bouda

18

Perhatikan bahwa PHP_OS melaporkan OS yang PHP itu dibangun pada , yang belum tentu OS yang sama yang saat ini berjalan di.

Jika Anda menggunakan PHP> = 5.3 dan hanya perlu tahu apakah Anda menjalankan pada Windows atau bukan-Windows maka menguji apakah salah satu konstanta khusus Windows didefinisikan mungkin merupakan taruhan yang bagus, misalnya:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Benar bukan di mana PHP dibangun ON tetapi untuk apa itu dibangun UNTUK 2. Ini berlaku untuk jendela yang didefinisikan terkait konstan dengan cara yang sama ...
StanE

Pokoknya PHP yang dibangun untuk Windows tidak dapat dijalankan di unix, bukan?
Stalinko


7

Menurut Predefined Constants: User Contributed Notes Volker dan rdcapasso solusi, Anda dapat membuat kelas pembantu seperti ini:

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

}

Pemakaian:

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

6

Ini harus bekerja di PHP 4.3+:

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

5

Dimulai dengan PHP 7.2.0 Anda dapat mendeteksi OS yang sedang berjalan menggunakan konstanta PHP_OS_FAMILY:

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

Lihat dokumentasi PHP resmi untuk kemungkinan nilainya.


4

Core Predefined Constants: http://us3.php.net/manual/en/reserved.constants.php yang memilikiPHP_OS (string) konstanta.

Atau jika Anda ingin mendeteksi OS klien:

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

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

Dari http://us3.php.net/manual/en/function.get-browser.php


Menurut hasil edit Anda, Anda dapat merujuk ke Nama Server PHP dublicate ini dari Command Line

Kamu bisa memakai

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

Begitu

php_uname("s")

's': Nama sistem operasi. misalnya. FreeBSD.

Akan melakukan trik untuk Anda, lihat di sini http://php.net/manual/en/function.php-uname.php


4

Untuk mendeteksi apakah itu Windows, OS X atau 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
}

stripossedikit lebih lambat daripada substrdalam kasus khusus ini, namun cukup efisien untuk tugas sekecil itu, dan lebih elegan.


Walaupun kodenya cukup sederhana, jawaban ini tidak berdiri sendiri: Jawaban yang bagus tidak memaksa seseorang untuk membaca pertanyaan ketika datang dari mesin pencari, karena itu mandiri.
jpaugh

2

Anda dapat memeriksa apakah ada konstanta di PHP> 5.3.0 ( manual )

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

Sebelumnya, metode ini digunakan di Symfony. Sekarang mereka menggunakan metode yang berbeda :

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

0

Jika Anda ingin memeriksa apakah berjalan di Linux, coba saja jika (PHP_OS === 'Linux'). Tidak perlu menggunakan strtolower () dan substr ().


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.