ฉันใช้งาน PHP ในโหมด ISAPI มาตลอด ข้อเสียที่ใหญ่ที่สุดของวิธีนี้คือความเสถียรต่ำ เมื่อ PHP ผิดพลาด กระบวนการ Apache ก็จะตายเช่นกัน ต่อมา ฉันเห็นการแนะนำบนอินเทอร์เน็ตเกี่ยวกับ PHP ที่ทำงานในโหมด FastCGI ประโยชน์ต่างๆ ที่กล่าวถึง (ความเสถียร ความปลอดภัย ประสิทธิภาพสูง) ทำให้ฉันตัดสินใจลองใช้
อย่างไรก็ตาม สิ่งต่างๆ ยังห่างไกลจากความราบรื่นอย่างที่คาดไว้ ฉันค้นหา Google นับครั้งไม่ถ้วน แต่ไม่พบข้อมูลใดๆ เกี่ยวกับวิธีใช้ Apache + FastCGI เพื่อรัน PHP บน Windows บทความหนึ่งกล่าวถึงว่า Zend ยังแนะนำให้ใช้งาน PHP ในโหมด FastCGI ( http://phplens.com/phpeverywhere/fastcgi-php )
หลังจากสำรวจไปหลายชั่วโมง ในที่สุดฉันก็ติดตั้ง Apache 1.3 + FastCGI เพื่อรัน PHP ได้สำเร็จ
การตระเตรียม:
ครั้งแรก ที่ http://www.fastcgi.com/dist/ เพื่อดาวน์โหลด mod_fastcgi สำหรับ Apache ฉันใช้ mod_fastcgi-2.4.2-AP13.dll หลังจากดาวน์โหลด ให้คัดลอกไฟล์นี้ไปยังไดเร็กทอรีโมดูลของ Apache
ดาวน์โหลด PHP (ฉันใช้ PHP-5.0.4) แล้วแตกไฟล์ออกมา แก้ไขไฟล์ php.ini ตามต้องการ โปรดทราบว่าคุณไม่จำเป็นต้องคัดลอกไฟล์ใดๆ จากไดเร็กทอรี PHP ไปยังไดเร็กทอรี Windows
แก้ไขการกำหนดค่า:
จากนั้นแก้ไขไฟล์ httpd.conf และเพิ่มบรรทัดต่อไปนี้:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" - กระบวนการ 3
# หมายเหตุ: -กระบวนการ 3 ที่นี่หมายถึงการเริ่มต้นกระบวนการ php-cgi.exe สามกระบวนการ
# สำหรับพารามิเตอร์โดยละเอียดของ FastCgiServer โปรดดูเอกสารประกอบของ FastCGI
แอปพลิเคชัน AddType/x-httpd-fastphp5 .php
แอปพลิเคชันการดำเนินการ/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
# คำอธิบาย: แก้ไขคำตัวหนาสองคำด้านบนตามตำแหน่งของไฟล์ PHP ของคุณ
หลังจากการแก้ไขเสร็จสิ้น เพียงรีสตาร์ท Apache
คำถามที่พบบ่อย:
จากการทดลองหลายครั้งของฉัน ปัญหาที่พบบ่อยที่สุดมีสาเหตุมาจากเส้นทางเป็นหลัก ดังนั้นก่อนอื่นให้ตรวจสอบว่าเส้นทางทั้งหมดในไฟล์ php.ini และ httpd.conf ถูกต้องหรือไม่ ประการที่สองคือหากเคยติดตั้ง PHP ในระบบมาก่อน C:Windowsphp.ini จะต้องเปลี่ยนชื่อหรือลบ
ประการที่สอง ตรวจสอบว่าไดเร็กทอรีที่มีไฟล์ PHP อยู่มีสิทธิ์เพียงพอหรือไม่ (ฉันตั้งค่าเป็น "ทุกคน - การควบคุมทั้งหมด" อย่างไรก็ตาม คุณไม่จำเป็นต้องคำนึงถึงข้อจำกัดด้านความปลอดภัยมากมายในเครื่องที่ใช้พัฒนา)
ข้อดีของการรัน PHP ในโหมด FastCGI:
มีประโยชน์หลักหลายประการในการใช้งาน PHP ในโหมด FastCGI อย่างแรกคือเมื่อ PHP ล้มเหลว มันจะไม่ทำให้ Apache ล่ม แต่กระบวนการของ PHP เองจะขัดข้อง (แต่ FastCGI จะรีสตาร์ทกระบวนการ PHP ใหม่ทันทีเพื่อแทนที่กระบวนการที่ขัดข้อง) ประการที่สอง โหมด FastCGI มีประสิทธิภาพที่ดีกว่าเมื่อใช้งาน PHP มากกว่าโหมด ISAPI (เดิมทีฉันใช้ ApacheBench ในการทดสอบ แต่ลืมบันทึกผลลัพธ์ หากคุณสนใจ คุณสามารถทดสอบได้ด้วยตัวเอง)
สุดท้ายนี้ คุณสามารถเรียกใช้ PHP5 และ PHP4 ในเวลาเดียวกันได้ จากไฟล์การกำหนดค่าด้านล่าง มีการสร้างโฮสต์เสมือนสองโฮสต์ ตัวแรกใช้ PHP5 และอีกโฮสต์หนึ่งใช้ PHP4
LoadModule fastcgi_module โมดูล/mod_fastcgi-2.4.2-AP13.dll
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" - กระบวนการ 3
ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
FastCgiServer "d:/usr/local/php-4.3.11/php.exe"
ฟัง 80
ชื่อ VirtualHost *:80
DocumentRoot d:/www
ตัวเลือกดัชนี FollowSymlinks MultiViews
ชื่อเซิร์ฟเวอร์ php5.localhost
แอปพลิเคชัน AddType/x-httpd-fastphp5 .php
แอปพลิเคชันการดำเนินการ/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
IndexOptions โฟลเดอร์การจัดทำดัชนีแฟนซีก่อน
ตัวเลือกดัชนี FollowSymLinks MultiViews
AllowOverride ไม่มี
คำสั่งอนุญาต, ปฏิเสธ
อนุญาตจากทั้งหมด
ฟัง 8080
ชื่อ VirtualHost *:8080
DocumentRootd:/www
ตัวเลือกดัชนี FollowSymlinks MultiViews
ชื่อเซิร์ฟเวอร์ php4.localhost
แอปพลิเคชัน AddType/x-httpd-fastphp4 .php
แอปพลิเคชันการดำเนินการ/x-httpd-fastphp4 "/fcgi-php4/php.exe"
ตัวเลือกดัชนี FollowSymLinks MultiViews
AllowOverride ไม่มี
คำสั่งอนุญาต, ปฏิเสธ
อนุญาตจากทั้งหมด
เมื่อใช้การกำหนดค่าข้างต้น PHP5 จะถูกใช้เมื่อเข้าถึง http://localhost/ และ PHP4 จะถูกใช้เมื่อเข้าถึง http://localhost:8080/ ตราบใดที่มีการกำหนดค่าอย่างเหมาะสม โฮสต์เสมือนที่แตกต่างกันก็สามารถใช้ PHP เวอร์ชันที่แตกต่างกันได้
ข้อเสียบางประการของโหมด FastCGI:
หลังจากพูดถึงข้อดีแล้ว เรามาพูดถึงข้อเสียกันดีกว่า จากการใช้งานจริงของฉัน โหมด FastCGI เหมาะกับเซิร์ฟเวอร์ในสภาพแวดล้อมการใช้งานจริงมากกว่า แต่ไม่เหมาะกับการพัฒนาเครื่องจักร เพราะเมื่อใช้ Zend Studio เพื่อดีบักโปรแกรม FastCGI จะคิดว่ากระบวนการ PHP หมดเวลาแล้วส่งคืนข้อผิดพลาด 500 บนหน้าเว็บ สิ่งนี้น่ารำคาญมากจนฉันเปลี่ยนกลับไปใช้โหมด ISAPI บนเครื่องที่กำลังพัฒนาของฉัน
สุดท้ายนี้ ยังมีช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นในโหมด FastCGI บน Windows เนื่องจากฉันไม่พบวิธีใช้งาน SuEXEC ในสภาพแวดล้อม Windows กระบวนการ PHP จึงทำงานด้วยสิทธิพิเศษสูงสุดเสมอ ซึ่งไม่ใช่ข่าวดีเมื่อพิจารณาจากมุมมองด้านความปลอดภัย
บทสรุป:
การใช้ FastCGI ในบทความนี้ยังอยู่ในขั้นตอนเบื้องต้น และใช้เป็นจุดเริ่มต้นเท่านั้น โดยหวังว่าจะมีแนวทางแก้ไขที่สมบูรณ์มากขึ้น