สคริปต์ PHP - ตรวจสอบว่าทำงานภายใต้ linux หรือ Windows หรือไม่


143

ฉันมีสคริปต์ PHP ที่อาจวางไว้ในระบบ windows หรือระบบ linux ฉันต้องการเรียกใช้คำสั่งที่แตกต่างกันในทั้งสองกรณี

ฉันจะตรวจสอบสภาพแวดล้อมที่ฉันอยู่ได้อย่างไร (โดยเฉพาะอย่างยิ่ง 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เป็นที่อ่านได้มากที่สุด
caw

คำตอบ:


228

ตรวจสอบค่าของPHP_OSค่าคงที่เอกสาร

มันจะทำให้คุณค่าต่างๆบน Windows เช่นWIN32, หรือWINNTWindows

ดูเช่นกัน: ค่าที่เป็นไปได้สำหรับ: 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!';
}

มันจะมีค่าเท่าไหร่ถ้าเป็น Windows? ไม่มีเอกสารใดในเอกสารที่ฉันเห็น
Shabbyrobe


8
stripos(PHP_OS, 'WIN') === 0สามารถนำมาใช้แทนสามารถอ่านได้ง่ายขึ้น
John Hunt

1
@ dw1 - มันจะยังคงทำงานตามที่ค้นหา "win" ในตอนแรก
John Hunt

62

คุณสามารถตรวจสอบว่าตัวคั่นไดเรกทอรีเป็น/(สำหรับ unix / linux / mac) หรือ\บน windows DIRECTORY_SEPARATORชื่ออย่างต่อเนื่องคือ

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

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

น่าเสียดายที่นี่ใช้ไม่ได้กับ Windows 7 และ Zend Server ในกรณีนี้ DIRECTORY_SEPARATOR ยังเป็น '\'
Achim

4
@Achim คุณหมายถึงอะไร เซิร์ฟเวอร์ Zend เป็นซอฟต์แวร์เซิร์ฟเวอร์ไม่ใช่ระบบปฏิบัติการ Windows 7 ควรกลับ \
mpen

1
strpos(__FILE__,92)ใช้ประโยชน์จากพฤติกรรมเดียวกัน; PATH_SEPARATOR>":"ผลตอบแทนจริงสำหรับ Windows เช่นกัน (PATH_SEPARATOR คือ ":" ในระบบปฏิบัติการอื่น ๆ ทั้งหมด)
ติตัส

เปลี่ยนสิ่งนี้เป็นฟังก์ชั่น: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!';
}

ดูเหมือนจะสง่างามกว่าคำตอบที่ยอมรับ แม้ว่าการตรวจจับดังกล่าวด้วย DIRECTORY_SEPARATOR นั้นเร็วที่สุด


ขออภัย แต่วิธีนี้ใช้ไม่ได้หากคุณใช้เซิร์ฟเวอร์ Mac เนื่องจากใน Mac คุณจะได้รับสตริงที่มี "DARWIN" ซึ่งยังมี "ชนะ" ดังนั้นในเซิร์ฟเวอร์ Mac คุณจะได้รับ "นี่คือ เซิร์ฟเวอร์ที่ใช้ Windows! " ซึ่งไม่เป็นความจริง
OMA

13
นี่มันไม่เป็นความจริงเลย โปรดสังเกตว่าstrncasecmpใช้อักขระnตัวแรก ไม่ใช่เฉพาะอักขระnใด ๆ หากคุณพยายามมันที่คุณจะได้พบว่าประเมิน strncasecmp('DARWIN', 'WIN', 3) == 0false
Ondřej Bouda

18

โปรดทราบว่าPHP_OS รายงาน OS ที่ PHP ได้รับการสร้างขึ้นบนซึ่งไม่จำเป็นต้องเป็นระบบปฏิบัติการเดียวกันว่าขณะกำลังทำงานอยู่บน

หากคุณใช้ PHP> = 5.3 และจำเป็นต้องรู้ว่าคุณกำลังใช้งาน Windows หรือไม่ - Windows ให้ทำการทดสอบว่าหนึ่งในค่าคงที่เฉพาะสำหรับ Windowsนั้นอาจเป็นทางออกที่ดีเช่น:

$windows = defined('PHP_WINDOWS_VERSION_MAJOR');

4
1. ความถูกต้องไม่ใช่ตำแหน่งที่ PHP ถูกสร้างขึ้น แต่สำหรับสิ่งที่สร้างขึ้นสำหรับ 2. สิ่งนี้ใช้ได้กับค่าคงที่ที่เกี่ยวข้องกับหน้าต่างที่กำหนดในลักษณะเดียวกัน ...
StanE

อย่างไรก็ตาม PHP ที่สร้างขึ้นสำหรับ Windows ไม่สามารถทำงานบนยูนิกซ์ได้หรือไม่
Stalinko


7

ตามค่าคงที่ที่กำหนดไว้ล่วงหน้า:วิธีแก้ไขปัญหาของผู้ใช้ Volker และ 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 คุณสามารถตรวจสอบระบบปฏิบัติการที่รันอยู่โดยใช้ค่าคงที่PHP_OS_FAMILY:

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

ดูเอกสาร PHP อย่างเป็นทางการสำหรับค่าที่เป็นไปได้


4

ค่าคงที่ที่กำหนดไว้ล่วงหน้าของ Core: http://us3.php.net/manual/en/reserved.constants.phpซึ่งมีPHP_OS (string)ค่าคงที่

หรือถ้าคุณต้องการตรวจสอบระบบปฏิบัติการของลูกค้า:

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

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

จากhttp://us3.php.net/manual/th/function.get-browser.php


จากการแก้ไขของคุณคุณสามารถอ้างถึงชื่อเซิร์ฟเวอร์ PHP ที่เผยแพร่นี้จาก Command Line

คุณสามารถใช้ได้

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

ดังนั้น

php_uname("s")

's': ชื่อระบบปฏิบัติการ เช่น. FreeBSD

จะทำเคล็ดลับให้คุณดูที่นี่http://php.net/manual/th/function.php-uname.php


4

ในการตรวจสอบว่าเป็น Windows, OS X หรือ 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
}

striposช้ากว่าsubstrในกรณีนี้เล็กน้อยแต่ก็มีประสิทธิภาพเพียงพอสำหรับงานเล็ก ๆ และสง่างามกว่า


แม้ว่ารหัสนั้นง่ายพอคำตอบนี้ไม่สามารถยืนได้ด้วยตัวเองคำตอบที่ยอดเยี่ยมไม่ได้บังคับให้อ่านคำถามเมื่อมาจากเครื่องมือค้นหาเพราะมันมีอยู่ในตัวเอง
jpaugh

2

คุณสามารถตรวจสอบว่าค่าคงที่มีอยู่ใน PHP> 5.3.0 ( แมนนวล )

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

ก่อนหน้านี้วิธีนี้ใช้ใน Symfony ตอนนี้พวกเขาใช้วิธีอื่น :

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

0

หากคุณต้องการที่จะตรวจสอบว่าการทำงานภายใต้ลินุกซ์, (PHP_OS === 'Linux')การทดสอบเพียงถ้า ไม่จำเป็นต้องใช้ strtolower () และ substr ()


-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 คุณสามารถแยกระบบปฏิบัติการได้ชัดเจนยิ่งขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.