วิธีทดสอบเว็บไซต์อย่างรวดเร็วด้วยเว็บเซิร์ฟเวอร์ในตัวของ PHP

เผยแพร่แล้ว: 2022-08-11

ภาพประกอบแสดงโลโก้ PHP

ต้องการเริ่มต้นเว็บเซิร์ฟเวอร์อย่างรวดเร็วเพื่อทดสอบแอปพลิเคชัน PHP หรือไม่? ล่าม PHP มีในตัว! คุณสามารถใช้สิ่งนี้เพื่อตรวจสอบงานของคุณอย่างรวดเร็วโดยไม่ต้องรัน Apache, NGINX หรือโซลูชันคอนเทนเนอร์

เซิร์ฟเวอร์รวมของ PHP ได้รับความสนใจค่อนข้างน้อยแต่ค่อนข้างมีประสิทธิภาพสำหรับการพัฒนา ในคู่มือนี้ เราจะแสดงวิธีที่คุณสามารถใช้เป็นทางเลือกแทนไมโครเซิร์ฟเวอร์อื่นๆ เช่น SimpleHTTPServer ของ Python หรือแพ็คเกจ http-server npm ซึ่งทั้งสองรายการไม่สามารถรันสคริปต์ PHP ได้

การใช้เซิร์ฟเวอร์ในตัว

เซิร์ฟเวอร์ในตัวเป็นกลไกอำนวยความสะดวกที่จะช่วยคุณทดสอบไซต์ PHP ในสภาพแวดล้อมที่ไม่มีเซิร์ฟเวอร์ HTTP ที่สมบูรณ์ มีให้บริการใน PHP 5.4 และเวอร์ชันที่ใหม่กว่าทั้งหมด คุณสามารถเรียกใช้โดยตรงจากไดเร็กทอรีการทำงานของคุณโดยไม่ต้องตั้งค่าโฮสต์เสมือนก่อน

ก่อนใช้เซิร์ฟเวอร์ เตือนไว้ก่อนว่าออกแบบมาเพื่อใช้ในการพัฒนาเท่านั้น เอกสาร PHP เตือนอย่างชัดเจนว่าอย่าปรับใช้เซิร์ฟเวอร์นี้ต่อหน้าแอปพลิเคชันที่ใช้งานจริง การเปิดเผยข้อมูลบนเครือข่ายที่เข้าถึงได้แบบสาธารณะไม่ปลอดภัยเพียงพอ

การเริ่มต้นเซิร์ฟเวอร์

เซิร์ฟเวอร์เริ่มต้นด้วยการส่งแฟล็ก -S ไปยังไฟล์ปฏิบัติการ php :

 $ php -S localhost:8080
[วันศุกร์ที่ 10 มิ.ย. 16:00:00 น. 202] PHP 8.1.5 Development Server (http://localhost:8080) เริ่มต้นขึ้น

อาร์กิวเมนต์ที่กำหนดให้กับคำสั่งระบุที่อยู่การรับฟังของเซิร์ฟเวอร์ เราใช้พอร์ต 8080 บน localhost ในตัวอย่างด้านบน ตอนนี้คุณสามารถไปที่ http://localhost:8080 ในเว็บเบราว์เซอร์ของคุณเพื่อเข้าถึงเนื้อหาในไดเร็กทอรีการทำงานของคุณ สคริปต์ PHP ใด ๆ จะถูกดำเนินการโดยอัตโนมัติเมื่อคุณร้องขอ

คุณสามารถให้บริการพาธที่อยู่นอกไดเร็กทอรีการทำงานของคุณโดยการตั้งค่าแฟล็ก -t เมื่อคุณเริ่มเซิร์ฟเวอร์:

 $ php -S localhost:8080 -t /home/$USER/public_docs

รูทของเอกสารจะเป็น /public_docs ภายในโฟลเดอร์เริ่มต้นของคุณ

เปิดหน้าต่างเทอร์มินัลไว้ในขณะที่คุณใช้เว็บเซิร์ฟเวอร์ กด Ctrl+C เพื่อหยุดกระบวนการเมื่อคุณทดสอบไซต์ของคุณเสร็จแล้ว PHP จะบันทึกคำขอที่เข้ามาแต่ละรายการในหน้าต่างเทอร์มินัลของคุณ รวมถึงวิธี URI และ HTTP ข้อผิดพลาด PHP ที่ไม่ถูกตรวจจับจะปรากฏในบันทึกด้วย

การเปิดใช้งานการเข้าถึงระยะไกล

การฟังบน localhost จะไม่อนุญาตให้มีการเชื่อมต่อขาเข้าจากอุปกรณ์อื่นในเครือข่ายของคุณ คุณสามารถอนุญาตการเข้าถึงระยะไกลโดยผูกกับ 0.0.0.0 แทน:

 $ php -S 0.0.0.0:8080

โปรดจำไว้ว่าเซิร์ฟเวอร์ไม่ได้เสริมความแข็งแกร่งสำหรับใช้งานจริงและไม่ควรเปิดเผยต่อสาธารณะ อนุญาตการเข้าถึงระยะไกลเมื่อจำเป็นเท่านั้น เช่น เมื่อทดสอบคุณลักษณะเฉพาะบนอุปกรณ์มือถือ ตรวจสอบให้แน่ใจว่าพอร์ตที่คุณใช้ไม่ได้เปิดสู่อินเทอร์เน็ต

ขอการจับคู่สำรอง

PHP จะค้นหาไฟล์ index.php และ index.html ในรูทเอกสารที่ใช้งานอยู่เมื่อคำขอที่เข้ามาไม่มีองค์ประกอบ URI หากไม่มีไฟล์เหล่านี้ เซิร์ฟเวอร์จะย้ายขึ้นไดเร็กทอรีทรี โดยมองหาดัชนีในพาเรนต์ของรูทเอกสารของคุณ ซึ่งหมายความว่าคุณสามารถลงเอยด้วยการแสดงเนื้อหาที่อยู่นอกไดเร็กทอรีที่คุณระบุไว้โดยไม่ได้ตั้งใจ สถานะ 404 Not Found จะออกเมื่อถึงด้านบนของทรีโดยไม่พบไฟล์ดัชนี

คำขอที่มี URI (เช่น /file ) จะต้องตรงกับไฟล์สแตติกในรูทเอกสาร มิฉะนั้น 404 จะถูกส่งคืน PHP ตั้งค่าส่วนหัวตอบกลับ Content-Type MIME ของไฟล์ที่ให้บริการโดยอัตโนมัติสำหรับนามสกุลไฟล์ยอดนิยมส่วนใหญ่

การใช้สคริปต์เราเตอร์

คุณสามารถเลือกกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อเรียกใช้สคริปต์ในทุกคำขอ ซึ่งช่วยให้คุณใช้ตัวควบคุมด้านหน้าของแอปพลิเคชันเพื่อดำเนินการกำหนดเส้นทางแบบไดนามิกขั้นสูงได้

ฟังก์ชันการทำงานของเราเตอร์เปิดใช้งานโดยระบุชื่อไฟล์ PHP ในบรรทัดคำสั่งเมื่อคุณเริ่มเซิร์ฟเวอร์:

 $ php -S localhost:8080 router.php

ตอนนี้ PHP จะใช้ router.php เพื่อจัดการ ทุก คำขอที่เข้ามา คุณสามารถกำหนดเส้นทางผู้ใช้ไปยังจุดที่เหมาะสมในแอปพลิเคชันของคุณโดยตรวจสอบ URI คำขอ:

 ถ้า ( $_SERVER [ "REQUEST_URI" ] === "/dashboard" ) {
    require_once ( "dashboard.php" ) ;
}
อื่น if ( $_SERVER [ "REQUEST_URI" ] === "/profile" ) {
    require_once ( "profile.php" ) ;
}
อื่นๆ {
    require_once ( "404.php" ) ;
}

ผลลัพธ์ที่สร้างโดยสคริปต์เราเตอร์ของคุณจะกลายเป็นการตอบสนองที่ส่งกลับไปยังไคลเอนต์ ข้อยกเว้นคือถ้าสคริปต์ส่งคืน false : ในกรณีนี้ PHP จะย้อนกลับเพื่อส่งคืนไฟล์สแตติกที่ตรงกับ URI คำขอดั้งเดิม

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // กำหนดเส้นทางไปยังปลายทาง API ที่ถูกต้อง
    // ...
}
อื่นๆ {
    // ให้บริการเส้นทางอื่นแบบคงที่
    คืนค่า เท็จ ;
}

การตรวจจับเซิร์ฟเวอร์ในตัวจากโค้ด PHP ของคุณ

โค้ด PHP ของคุณสามารถตรวจพบว่าถูกเรียกโดยเว็บเซิร์ฟเวอร์ในตัวหรือไม่ โดยตรวจสอบชื่ออินเทอร์เฟซที่ใช้งานอยู่ php_sapi_name() ให้ค่านี้ จะถูกตั้งค่าเป็น cli-server เมื่อสคริปต์ถูกเรียกใช้โดยคอมโพเนนต์ integrated server

 if ( php_sapi_name ( ) === "cli-server" ) {
    enable_development_mode ( ) ;
}

จัดการคำขอหลายรายการพร้อมกัน

เซิร์ฟเวอร์มีค่าเริ่มต้นให้ทำงานในโหมดซิงโครนัสแบบกระบวนการเดียวตามค่าเริ่มต้น คำขอจะได้รับการจัดการเป็นรายบุคคลและปิดกั้นไม่ให้ดำเนินการจนกว่าจะเสร็จสิ้น นี่คือสาเหตุหนึ่งที่ทำให้เซิร์ฟเวอร์ไม่เหมาะสำหรับการใช้งานจริง

PHP 7.4 เพิ่มการรองรับสำหรับการจัดการคำขอหลายรายการพร้อมกัน ขึ้นอยู่กับความพร้อมใช้งานของ fork() และไม่ทำงานบน Windows เซิร์ฟเวอร์จะแยกผู้ปฏิบัติงานใหม่เพื่อให้บริการคำขอที่เข้ามาแต่ละครั้งเมื่อเปิดใช้งานโหมดนี้ คุณสามารถเปิดใช้งานได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม PHP_CLI_SERVER_WORKERS เป็นจำนวนพนักงานที่คุณต้องการ:

 $ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

ฟังก์ชันนี้ยังคงถูกทำเครื่องหมายว่าเป็นรุ่นทดลองใน PHP 8.1

สรุป

PHP มีเว็บเซิร์ฟเวอร์ในตัวซึ่งเป็นวิธีที่สะดวกในการทดสอบแอปพลิเคชันของคุณและเปิดเผยเนื้อหาระบบไฟล์ในเครื่องบนเครือข่ายท้องถิ่นของคุณอย่างรวดเร็ว รองรับการเรียกใช้สคริปต์ PHP การกำหนดเส้นทางที่รับทั้งหมด และไฟล์สแตติกที่มีประเภท MIME ทั่วไปส่วนใหญ่

แม้ว่าตอนนี้เซิร์ฟเวอร์จะสนับสนุนโหมดการฟอร์กที่เป็นตัวเลือก แต่ไม่แนะนำให้ใช้ในเวอร์ชันที่ใช้งานจริง มีไว้เพื่อใช้เป็นตัวช่วยในการพัฒนาและไม่มีคุณสมบัติการปรับแต่งและความปลอดภัยที่คุณต้องการสำหรับการปรับใช้สาธารณะของคุณ ที่ที่มันยอดเยี่ยมนั้นเป็นทางเลือกที่มีน้ำหนักเบาและผสานรวมเข้ากับแพลตฟอร์มการพัฒนาทั่วไป เช่น คอนเทนเนอร์ WAMP, XAMPP และ Docker