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.

silikonpi
sumber
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!';
}
Sander Marechal
sumber
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
}
Ibu
sumber
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.

Ondřej Bouda
sumber
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');
ejn
sumber
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
8

Fungsi php_uname dapat digunakan untuk mendeteksi ini.

echo php_uname();
Anders Lindahl
sumber
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
}
Patryk Uszyński
sumber
6

Ini harus bekerja di PHP 4.3+:

if (strtolower(PHP_SHLIB_SUFFIX) === 'dll')
{
    // Windows
}
else
{
    // Linux/UNIX/OS X
}
Bukit Jonathon
sumber
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.

Yosemmo
sumber
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

Suara positif
sumber
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.

artnikpro
sumber
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
}
ghost404
sumber
0

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

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

Dari http://www.php.net/manual/en/reserved.variables.server.php#102162 :

<?php
echo '<table border="1">';

foreach ($_SERVER as $k => $v){
    echo "<tr><td>" . $k ."</td><td>" . $v . "</td></tr>";
}

echo "</table>"
?>

Ini adalah seluruh array $ _SERVER ... seperti yang dicatat ArtWorkAD, dengan menggunakan kunci HTTP_USER_AGENT, Anda dapat mengekstrak OS lebih eksplisit.

Jordan Arseno
sumber