PHP स्क्रिप्ट - पता लगाएँ कि क्या लिनक्स या विंडोज के तहत चल रहा है?


143

मेरे पास एक PHP स्क्रिप्ट है जिसे विंडोज़ सिस्टम या लिनक्स सिस्टम पर रखा जा सकता है। मुझे किसी भी स्थिति में अलग-अलग कमांड चलाने की आवश्यकता है।

मैं कैसे पता लगा सकता हूं कि मैं किस माहौल में हूं? (अधिमानतः चतुर प्रणाली हैक के बजाय कुछ PHP)

अपडेट करें

स्पष्ट करने के लिए, स्क्रिप्ट कमांड लाइन से चल रही है।


बेंचमार्क करने के बाद, ऐसा लगता है कि प्रदर्शन में कोई अंतर है \strncasecmp(\PHP_OS, 'WIN', 3) === 0, \strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN'और \stripos(\PHP_OS, 'WIN')15% से नीचे हैं। चूंकि सभी तीन समाधान केवल लगभग 100 नैनोसेकंड लेते हैं, यह वैसे भी एक माइक्रो-अनुकूलन होगा। इसलिए आपको जो भी समाधान पसंद हो उसे चुनें। अंत में, आप तर्क दे सकते हैं कि \strncasecmp(\PHP_OS, 'WIN', 3) === 0सबसे अधिक पठनीय है।
कांव-कांव

जवाबों:


228

PHP_OSनिरंतर डॉक्स का मान जांचें ।

यह आपको विंडोज पर विभिन्न मूल्य देगा जैसे WIN32, WINNTया Windows

साथ ही देखें: संभावित मान: PHP_OS और php_unameडॉक्स के लिए :

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

यदि यह विंडोज है तो इसका क्या मूल्य होगा? डॉक्स में ऐसा कुछ भी नहीं है जिसे मैं देख सकूं।
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0इसके बजाय, यकीनन अधिक पठनीय / सरल का उपयोग किया जा सकता है।
जॉन हंट

1
@ dw1 - यह अभी भी काम करेगा क्योंकि यह शुरुआत में "जीत" की खोज करता है।
जॉन हंट

62

आप यह देख सकते हैं कि निर्देशिका विभाजक /(यूनिक्स / लिनक्स / मैक के लिए) है या \विंडोज़ पर। निरंतर नाम है DIRECTORY_SEPARATOR

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

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

दुर्भाग्य से यह विंडोज 7 और ज़ेंड सर्वर के साथ काम नहीं करता है। इस मामले में DIRECTORY_SEPARATOR भी '\' है
Achim

4
@ अचिम आपका क्या मतलब है? Zend Server एक OS नहीं बल्कि सर्वर सॉफ्टवेयर है। विंडोज 7 को वापस लौटना चाहिए
एमपैन

1
strpos(__FILE__,92)समान व्यवहार का शोषण करता है; PATH_SEPARATOR>":"विंडोज के लिए भी सही रिटर्न (PATH_SEPARATOR अन्य सभी OS पर ":" है)।
टाइटस

इसे एक समारोह में बदल दिया:function is_linux(){return (DIRECTORY_SEPARATOR == '/') ? true : false;}
मारियो 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!';
}

स्वीकृत उत्तर की तुलना में थोड़ा अधिक सुरुचिपूर्ण लगता है। DIRECTORY_SEPARATOR के साथ पूर्वोक्त पता लगाना सबसे तेज़ है, हालाँकि।


क्षमा करें, लेकिन यह सही काम नहीं करता है यदि आप एक मैक सर्वर का उपयोग कर रहे हैं, क्योंकि मैक में आपको एक स्ट्रिंग मिलती है जिसमें "डार्विन" होता है, जिसमें "विन" भी शामिल होता है, इसलिए मैक सर्वर में आपको "यह" मिलेगा विंडोज का उपयोग कर एक सर्वर! " जो सच नहीं है।
ओमा

13
खैर, यह बिल्कुल सच नहीं है। सूचना है कि strncasecmpलेता है पहले n वर्ण ही नहीं, किसी भी n अक्षर। यदि आप इसे आज़माते हैं, तो आपको पता चलता है कि इसका strncasecmp('DARWIN', 'WIN', 3) == 0मूल्यांकन किया जाता है false
Ond12ej Bouda

18

ध्यान दें कि PHP_OS OS पर रिपोर्ट करता है कि PHP का निर्माण किया गया था , जो जरूरी नहीं कि वही OS है जो वर्तमान में चल रहा है।

यदि आप PHP> = 5.3 पर हैं और आपको यह जानने की आवश्यकता है कि क्या आप विंडोज पर चल रहे हैं या नहीं-तो विंडोज परीक्षण है कि क्या विंडोज-विशिष्ट स्थिरांक में से एक परिभाषित है, एक अच्छा शर्त हो सकता है, उदाहरण के लिए:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. सही नहीं है जहां PHP बनाया गया था, लेकिन इसके लिए क्या बनाया गया था 2. यह परिभाषित खिड़कियों पर उसी तरह से संबंधित लागू होता है ...
स्टेनी

वैसे भी विंडोज़ के लिए निर्मित PHP को यूनिक्स पर नहीं चलाया जा सकता है, क्या यह?
स्टालिंको


7

पूर्वनिर्धारित स्थिरांक के अनुसार : उपयोगकर्ता योगदान नोट्स वोल्कर और rdcapasso समाधान, आप बस इस के लिए सहायक वर्ग बना सकते हैं:

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

}

उपयोग:

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


5

PHP 7.2.0 से शुरू करके आप स्थिरांक का उपयोग करके चल रहे OS का पता लगा सकते हैं PHP_OS_FAMILY:

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

इसके संभावित मूल्यों के लिए आधिकारिक PHP प्रलेखन देखें ।


4

कोर पूर्वनिर्धारित स्थिरांक: http://us3.php.net/manual/en/reserved.constants.php जिसमें PHP_OS (string)निरंतर है।

या यदि आप क्लाइंट के OS का पता लगाना चाहते हैं:

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


अपने एडिट के अनुसार आप कमांड लाइन से इस dublicate PHP Server Name का उल्लेख कर सकते हैं

आप उपयोग कर सकते हैं

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

इसलिए

php_uname("s")

's': ऑपरेटिंग सिस्टम नाम। जैसे। FreeBSD।

आपके लिए चाल चलेगा , यहाँ देखें http://php.net/manual/en/function.php-uname.php


4

यह पता लगाने के लिए कि क्या यह विंडोज, ओएस एक्स या लिनक्स है:

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
}

stripossubstrइस विशेष मामले की तुलना में थोड़ा धीमा है , फिर भी यह इतने छोटे कार्य के लिए पर्याप्त कुशल है, और अधिक सुरुचिपूर्ण है।


हालांकि कोड काफी सरल है, यह उत्तर अपने आप नहीं खड़ा होता है: एक महान जवाब किसी को खोज इंजन से आने पर सवाल पढ़ने के लिए मजबूर नहीं करता है, क्योंकि यह स्व-निहित है।
jpaugh

2

आप जाँच सकते हैं कि PHP में कोई स्थिरांक मौजूद है या नहीं। 5.3.0 ( मैनुअल )

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

पहले, इस विधि का उपयोग सिम्फनी में किया गया था। अब वे एक अलग विधि का उपयोग करते हैं :

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

0

यदि आप जाँच करना चाहते हैं कि लिनक्स के तहत चल रहा है, तो बस परीक्षण करें यदि (PHP_OS === 'Linux')। स्ट्रेटोलॉवर () और रूट () का उपयोग करने की आवश्यकता नहीं है।


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

-2

से 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>"
?>

यह संपूर्ण $ _SERVER सरणी है ... जैसा कि ArtWorkAD ने नोट किया है, HTTP_USER_AGENT कुंजी का उपयोग करके, आप OS को अधिक स्पष्ट रूप से निकाल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.