PHP betiği - Linux veya Windows altında çalışıp çalışmadığını tespit etmek?


143

Bir windows sistemi veya linux sistemi üzerine yerleştirilmiş bir PHP komut dosyası var. Her iki durumda da farklı komutlar çalıştırmam gerekiyor.

Hangi ortamda olduğumu nasıl tespit edebilirim? (tercihen akıllı sistem kesmek yerine PHP gibi bir şey)

Güncelleme

Açıklığa kavuşturmak için komut dosyası komut satırından çalışıyor.


Kriterler gerçekleştirdikten sonra, bu arasındaki performans o bir farklılık görünüyor \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN've \stripos(\PHP_OS, 'WIN')% 15'in altında bulunmaktadır. Her üç çözüm de yaklaşık 100 nanosaniye sürdüğü için, bu yine de bir mikro optimizasyon olacaktır. İstediğiniz çözümü seçin. Son olarak, \strncasecmp(\PHP_OS, 'WIN', 3) === 0bunun en okunabilir olduğunu iddia edebilirsiniz .
Caw

Yanıtlar:


229

PHP_OSSabit Google Dokümanlar'ın değerini kontrol edin .

Bu pencere gibi üzerinde size çeşitli değerler verecektir WIN32, WINNTya da Windows.

Ayrıca bakınız: Olası Değerler: PHP_OS ve php_unameDokümanlar :

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

Windows olsaydı ne değer olurdu? Dokümanlarda görebildiğim bir şey yok.
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0onun yerine kullanılabilir, tartışmasız daha okunabilir / basit.
John Hunt

1
@ dw1 - başlangıçta "kazan" kelimesini ararken hala çalışır.
John Hunt

62

Dizin ayırıcının /(unix / linux / mac için) veya \pencerelerde olup olmadığını kontrol edebilirsiniz . Sabit adı DIRECTORY_SEPARATOR.

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

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

Ne yazık ki bu Windows 7 ve Zend Server ile çalışmaz. Bu durumda DIRECTORY_SEPARATOR da '\'
Achim

4
@Achim Ne demek istiyorsun? Zend Server bir işletim sistemi değil, sunucu yazılımıdır. Windows 7 gerektiğini \ dönün.
mpen

1
strpos(__FILE__,92)aynı davranışı kullanır; PATH_SEPARATOR>":"Windows için de true değerini döndürür (PATH_SEPARATOR diğer tüm işletim sistemlerinde ":" olur).
Titus

Bunu bir fonksiyona dönüştürdü: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!';
}

kabul edilen cevaptan biraz daha zarif görünüyor. Bununla birlikte, DIRECTORY_SEPARATOR ile yukarıda belirtilen tespit en hızlı olanıdır.


Maalesef, bir Mac sunucusu kullanıyorsanız bu işe yaramaz, çünkü Mac'te "WIN" içeren "DARWIN" içeren bir dize alırsınız, bu nedenle bir Mac sunucusunda "Bu Windows kullanan bir sunucu! " ki bu doğru değil.
OMA

13
Bu doğru değil. Yalnızca n karakteri değil , ilk n karakteri strncasecmpalan dikkat edin . Eğer denediyseniz, bunun değerlendirildiğini öğrenirsiniz . strncasecmp('DARWIN', 'WIN', 3) == 0false
Ondřej Bouda

18

O Not PHP_OS PHP olduğunu OS raporları inşa üzerinde mutlaka şu anda üzerinde çalıştığı aynı işletim sistemi değildir.

PHP> = 5.3 üzerindeyseniz ve sadece Windows üzerinde mi yoksa Windows üzerinde mi çalıştığınızı bilmeniz gerekiyorsa, Windows'a özgü sabitlerden birinin tanımlı olup olmadığını test etmek iyi bir bahis olabilir, örneğin:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. Doğru PHP AÇIK nerede inşa değil ama ne için inşa edildi IÇIN 2. Bu aynı şekilde tanımlanan sabit pencereler için geçerlidir ...
StanE

Zaten Windows için inşa PHP unix üzerinde çalıştırılamaz, değil mi?
Stalinko


7

Göre Öntanımlı Sabitler: Kullanıcı Notları Katkıda Volker en ve rdcapasso çözüm, sadece böyle yardımcı sınıf oluşturabilir:

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

}

Kullanımı:

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

6

Bu PHP 4.3 ve sonraki sürümlerinde çalışmalıdır:

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

5

PHP 7.2.0 ile başlayarak sabit diski kullanarak çalışan işletim sistemini tespit edebilirsiniz PHP_OS_FAMILY:

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

Olası değerleri için resmi PHP belgelerine bakın .


4

Çekirdek Öntanımlı Sabitler: http://us3.php.net/manual/en/reserved.constants.php sahiptir PHP_OS (string)sabiti.

Veya istemcinin işletim sistemini tespit etmek istiyorsanız:

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

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

Http://us3.php.net/manual/en/function.get-browser.php adresinden


Düzenlemenize göre Komut Satırından bu PHP Sunucusu Adı'na başvurabilirsiniz.

Kullanabilirsiniz

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

Yani

php_uname("s")

's': İşletim sistemi adı. Örneğin. FreeBSD.

Hile sizin için yapardı, buraya bakın http://php.net/manual/en/function.php-uname.php


4

Windows, OS X veya Linux olup olmadığını tespit etmek için:

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
}

stripossubstrbu özel durumdan biraz daha yavaş , ancak böyle küçük bir görev için yeterince verimli ve daha zarif.


Kod yeterince basit olmasına rağmen, bu cevap kendi başına durmaz: Harika bir cevap, bir arama motorundan gelirken soruyu okumaya zorlamaz, çünkü kendi kendine yetmektedir.
jpaugh

2

PHP> 5.3.0'da bir sabit olup olmadığını kontrol edebilirsiniz ( manuel )

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

Daha önce bu yöntem Symfony'de kullanılmıştır. Şimdi farklı bir yöntem kullanıyorlar :

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

0

Linux altında çalışıp çalışmadığını kontrol etmek istiyorsanız, sadece test edin (PHP_OS === 'Linux'). Strtolower () ve substr () kullanmaya gerek yoktur.


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.