วิธีทดสอบเว็บไซต์อย่างรวดเร็วด้วยเว็บเซิร์ฟเวอร์ในตัวของ PHP
เผยแพร่แล้ว: 2022-08-11ต้องการเริ่มต้นเว็บเซิร์ฟเวอร์อย่างรวดเร็วเพื่อทดสอบแอปพลิเคชัน 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