บล็อก

♻️ เพิ่มประสิทธิภาพความเข้ากันได้ของ PHP สำหรับ WordPress 6.4 และไดเรกทอรีปลั๊กอิน

Leonardo Losoviz
โดย Leonardo Losoviz ·

WordPress 6.4 "Shirley" ได้เปิดตัวแล้ว แนะนำให้ใช้งานร่วมกับ PHP 8.1 หรือ 8.2 แต่เวอร์ชัน PHP ขั้นต่ำที่รองรับยังคงเป็น 7.0

ดังนั้น ปลั๊กอิน WordPress ของเราจึงจำเป็นต้องรองรับ PHP ตั้งแต่เวอร์ชัน 7.0 เป็นต้นมา (ให้มากที่สุดเท่าที่เป็นไปได้) และต้องสามารถใช้งานร่วมกับ PHP 8.1 และ 8.2 ได้ด้วย

วิธีที่สมเหตุสมผลที่สุดคือเขียนโค้ดปลั๊กอินโดยใช้ PHP 7.0 ในขณะที่:

  • ไม่ใช้ฟีเจอร์ที่ถูกยกเลิก (deprecated) ใน PHP 7.x เพราะฟีเจอร์เหล่านั้นจะถูกลบออกใน PHP 8.x
  • ไม่ใช้ฟีเจอร์ที่ถูกยกเลิก (deprecated) ใน PHP 8.x เพราะฟีเจอร์เหล่านั้นจะสร้างคำเตือน

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

การเขียนโค้ดใน PHP 7.x มีข้อเสียที่ชัดเจน: โค้ดของปลั๊กอินต้องเข้ากันได้กับ PHP 8.x แต่ไม่สามารถใช้ฟีเจอร์ใดๆ ของ PHP 8.x ได้เลย เช่น union types, match expression, nullsafe operator และอื่นๆ อีกมากมาย

มีทางเลือกที่ดีกว่านั้น

การ Downgrade โค้ด PHP จาก 8.x ไปยัง 7.x

แทนที่จะเขียนโค้ดใน PHP 7 แล้วตรวจสอบให้แน่ใจว่าใช้งานได้กับ PHP 8 เราสามารถทำตรงกันข้าม: เขียนโค้ดปลั๊กอินด้วย PHP 8 แล้ว downgrade ไปยัง PHP 7

สิ่งนี้เป็นไปได้ด้วย Rector ซึ่งเป็นเครื่องมือที่ช่วยทำให้การ refactor โค้ด PHP เป็นแบบอัตโนมัติ

Rector มี กฎสำหรับการ downgrade โค้ดจาก PHP 8.1 ไปยัง PHP 7.2 ซึ่งหมายความว่าเราสามารถใช้ฟีเจอร์ที่ทันสมัยเหล่านี้ในปลั๊กอิน WordPress ของเรา และสามารถ downgrade ไปเป็นโค้ด PHP 7.2 ได้

ตัวอย่างเช่น กฎ DowngradeMatchToSwitchRector จะแปลง operator match เป็น operator switch:

class SomeClass
{
    public function run()
    {
-        $message = match ($statusCode) {
-            200, 300 => null,
-            400 => 'not found',
-            default => 'unknown status code',
-        };
+        switch ($statusCode) {
+            case 200:
+            case 300:
+                $message = null;
+                break;
+            case 400:
+                $message = 'not found';
+                break;
+            default:
+                $message = 'unknown status code';
+                break;
+        }
    }
}

โปรดทราบว่ากฎเหล่านี้รองรับการ downgrade ลงมาถึง PHP 7.2 ไม่ใช่ถึง PHP 7.1 และ 7.0 อย่างไรก็ตาม นี่ไม่ใช่เรื่องสำคัญนัก เนื่องจาก PHP สองเวอร์ชันนี้รวมกันคิดเป็นเพียง 3% ของเว็บไซต์ WordPress ทั้งหมด

การ Downgrade โค้ดเป็นวิธีที่ดีกว่า เนื่องจาก:

  • การเขียนโค้ดใน PHP 8.1 ทำให้เรามั่นใจอย่างแน่นอนว่าโค้ดจะเข้ากันได้กับ PHP 8.1 และ 8.2
  • ตราบใดที่เราใช้ฟีเจอร์ PHP ที่มีกฎ downgrade รองรับ โค้ดก็จะทำงานได้ใน PHP 7.2, 7.3 และ 7.4 ด้วย
  • เราสามารถใช้ประโยชน์จากฟีเจอร์ PHP 8.x ได้ เช่น union types, match expression, nullsafe operator และอื่นๆ อีกมากมาย

โปรดทราบว่าไม่ใช่ทุกฟีเจอร์ของ PHP 8.x จะพร้อมใช้งาน ตัวอย่างเช่น ยังไม่มีกฎสำหรับการ downgrade enumeration ดังนั้นเราจึงไม่สามารถใช้สิ่งเหล่านี้ได้

ในแง่ของการทดสอบ ไม่มีความแตกต่างใดๆ: เราต้องทดสอบปลั๊กอินอย่างละเอียดในหลายสภาพแวดล้อมที่ใช้ PHP เวอร์ชันต่างๆ เพื่อความปลอดภัย

วิธีการ Downgrade โค้ด

Gato GraphQL พัฒนาด้วย PHP 8.1 และ downgrade ไปยัง PHP 7.2 สำหรับใช้งานในระบบ production

การ downgrade โค้ดและทดสอบ รวมถึงการปล่อยปลั๊กอินสำหรับใช้งาน production ทั้งหมดนี้ถูกทำให้เป็นอัตโนมัติผ่าน GitHub Actions workflows:

  • downgrade_php_tests.yml: Downgrade โค้ดและวิเคราะห์โดยใช้ PHP 7.2
  • generate_plugins.yml: สร้างปลั๊กอินสำหรับการปล่อย โดย downgrade ไปยัง PHP 7.2
  • integration_tests.yml: ติดตั้งปลั๊กอินที่สร้างใหม่ในชุด InstaWP instances ที่ใช้ PHP เวอร์ชันต่างๆ และรัน integration tests

หากต้องการเรียนรู้เพิ่มเติม ฉันได้เขียนบทความเกี่ยวกับหัวข้อนี้ไว้หลายบทความ:

หวังว่าจะเป็นประโยชน์ 🙏


สมัครรับจดหมายข่าวของเรา

ติดตามการอัปเดตทั้งหมดของ Gato GraphQL