PHP 8.6 RC5 ออกแล้ว ทดสอบแอปก่อนตัวจริงออก 19 พฤศจิกายน

PHP 8.6.0 RC5 ออกวันที่ 5 พ.ย. และตัวจริงมีกำหนดออก 19 พ.ย. 2569 ช่วงนี้เหมาะกับการเปิด CI บน 8.6 เพื่อดูว่า package ไหนยังไม่พร้อม โค้ดไหนขึ้น deprecation และโค้ด PHP เก่าที่ใช้ session_start() จะกระทบจากค่า session ใหม่หรือเปล่า

เผยแพร่
เวลาอ่าน
4 นาที
สรุปจาก
Eric L. Barnes · phpnews.net
ในโพสต์นี้ 6 หัวข้อ
  1. ลองรัน PHP 8.6 ได้โดยไม่แตะเครื่องจริง
  2. composer install บอกได้ก่อนว่า package ไหนยังไม่พร้อม
  3. โค้ดเก่าอาจขึ้น deprecation ชุดใหญ่
  4. session ค่าเริ่มต้นใหม่กระทบโค้ดที่ใช้ session_start()
  5. พฤติกรรมอื่นที่อาจเห็นตอนรันจริง
  6. ของใหม่ที่รออยู่ใน PHP 8.6

ทีม release ของ PHP ประกาศ RC5 พร้อมย้ำว่ายังเป็นรุ่นทดสอบ ตามตารางนี่คือ RC รอบสุดท้ายก่อนตัวจริง จึงเหลือเวลาไม่ถึงสองสัปดาห์ที่จะเจอปัญหาก่อนคนอื่น

ถ้าเว็บยังอยู่บน PHP 8.2 เรื่องที่รีบกว่าคือ 8.2 จะหมด security support วันที่ 31 ธ.ค. 2569 อ่านอายุ support ของ PHP แต่ละเวอร์ชันก่อนได้ครับ

ลองรัน PHP 8.6 ได้โดยไม่แตะเครื่องจริง

ที่ใช้อยู่ วิธีลอง สิ่งที่ควรรู้
GitHub Actions setup-php ตั้ง php-version: '8.6' ได้ nightly จาก branch PHP-8.6 ไม่ใช่ tag RC5 ตรง ๆ
Docker image php:8.6-rc-cli README ของ image ยังระบุเป็น RC4 และต้องเพิ่ม Composer กับ extension เอง
Windows กับ Laragon หรือ XAMPP zip จากหน้า pre-release builds แตกไว้โฟลเดอร์แยก แล้วเรียก php.exe ตัวนั้นตรง ๆ
shared hosting รอผู้ให้บริการเพิ่มตัวเลือก ยังไม่ต้องรีบ ลองบนเครื่องตัวเองก่อนได้

ถ้าโปรเจกต์มี test อยู่แล้ว ทางที่ง่ายที่สุดคือเพิ่ม 8.6 เข้า matrix ของ CI แล้วให้ชุดนี้ล้มได้โดยไม่บล็อกงาน

jobs:
  tests:
    runs-on: ubuntu-latest
    continue-on-error: ${{ matrix.php == '8.6' }}
    strategy:
      fail-fast: false
      matrix:
        php: ['8.5', '8.6']
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
      - run: composer install --no-interaction
      - run: php artisan test

composer install บอกได้ก่อนว่า package ไหนยังไม่พร้อม

composer install บน 8.6 จะหยุดทันทีถ้า package ตัวไหนจำกัดเวอร์ชัน PHP ไว้ต่ำกว่านั้น เราจึงเห็นรายชื่อที่ต้องรอหรือต้องอัปเดตตั้งแต่ขั้นแรก

ฝั่ง Laravel 13 เอง composer.json ของ framework ตั้ง ^8.3 จึงไม่ได้ปิดกั้น 8.6 แต่ตาราง support ในเอกสารยังระบุถึงแค่ PHP 8.5 ระหว่างนี้จึงยังนับเป็นการลองล่วงหน้า

ถ้าอยากรัน test ต่อทั้งที่ยังมี package ค้างอยู่ ให้ข้ามเฉพาะเพดานเวอร์ชันของ PHP

composer install --ignore-platform-req=php+

เครื่องหมาย + ทำให้ Composer ข้ามแค่ขอบบน ส่วนขอบล่างยังตรวจตามปกติ ใช้สำหรับลองเท่านั้น ไม่ควรเอาไป deploy

โค้ดเก่าอาจขึ้น deprecation ชุดใหญ่

RFC deprecation ของ 8.6 ผ่านมาหลายสิบข้อ และมีแผนเอาออกจริงใน PHP 9 ตัวที่น่าจะเจอในโค้ดทั่วไปมีดังนี้

ของเดิม ใช้แทน
is_integer(), is_long() is_int()
is_double() is_float()
doubleval() floatval()
spl_object_hash() spl_object_id()
SplFileObject::fgetcsv(), fputcsv(), setCsvControl(), getCsvControl() ฟังก์ชัน fgetcsv() กับ fputcsv()
return ในบล็อก finally ย้าย return ออกนอก finally
ตั้งชื่อฟังก์ชันหรือคลาสว่า is หรือ let เปลี่ยนชื่อ

เราอาจเจอข้อ SplFileObject ในงาน import CSV ส่วนฟังก์ชัน fgetcsv() ปกติกับ SplFileObject::READ_CSV ยังใช้ได้เหมือนเดิม

deprecation ไม่ทำให้เว็บล่ม แค่เตือน ถ้าอยากเก็บรายการไว้ไล่แก้ทีเดียว ตั้ง LOG_DEPRECATIONS_CHANNEL ใน .env ให้ชี้ไปที่ channel ของ log ได้เลย

session ค่าเริ่มต้นใหม่กระทบโค้ดที่ใช้ session_start()

PHP 8.6 เปลี่ยนค่าเริ่มต้นของ session สามตัว

ค่า เดิม ใหม่ ผลที่เห็น
session.use_strict_mode 0 1 ไม่รับ session ID ที่ server ไม่ได้สร้าง
session.cookie_httponly 0 1 JavaScript อ่าน cookie ของ session ไม่ได้
session.cookie_samesite ไม่ได้ตั้ง Lax ไม่ส่ง cookie ไปกับ POST ที่มาจากเว็บอื่น

แอป Laravel ใช้ session กับ cookie ของตัวเองตาม config/session.php เรื่องนี้จึงไม่ค่อยกระทบ ส่วนที่ควรดูคือเว็บ PHP เก่าที่เรียก session_start() ตรง ๆ

ตัวอย่างที่น่าเช็คคือหน้าที่รับ POST กลับมาจาก payment gateway เมื่อเบราว์เซอร์ไม่ส่ง cookie ของ session ไปด้วย ระบบจะมองเหมือนผู้ใช้หลุดจากระบบหลังจ่ายเงิน ถ้าจำเป็นต้องรับแบบนี้ ให้ตั้ง session.cookie_samesite เป็น None คู่กับ session.cookie_secure=1 ทั้งนี้ค่าที่ตั้งไว้เองใน php.ini ยังมีผลเหนือค่าเริ่มต้นเหมือนเดิม

พฤติกรรมอื่นที่อาจเห็นตอนรันจริง

UPGRADING ของ RC5 มีอีกหลายข้อ ตัวที่น่าจะเจอในงานทั่วไปคือ

  • trim(), ltrim(), rtrim() ตัดอักขระ form feed (\f) ด้วยโดยไม่ต้องระบุ
  • file_exists(), is_file(), filesize() โยน ValueError ถ้าชื่อไฟล์มี NUL byte เดิมเราอาจไม่เคยต้องดักกรณีนี้
  • array_filter(), pathinfo(), scandir(), number_format() โยน ValueError เมื่อได้อาร์กิวเมนต์ที่ไม่ถูกต้อง
  • preg_grep() คืน false เมื่อ PCRE ทำงานผิดพลาด แทนการคืน array ไม่ครบ
  • fclose(), file_put_contents(), copy() คืน false เมื่อ flush หรือปิดไฟล์ไม่สำเร็จ

ใครที่เคยทดสอบบน RC ช่วงต้นไปแล้วควรรันอีกรอบ เพราะ RC3 แก้หลายเรื่อง เช่น error_reporting ใน Fiber, นาฬิกาของ hrtime() และ array_map() ในไฟล์ strict_types

ของใหม่ที่รออยู่ใน PHP 8.6

clamp(101, min: 0, max: 100); // 100

$makeSlug = str_replace(' ', '-', ?); // partial function application

$delay = Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);

นอกจาก clamp(), partial function application และคลาส Time\Duration ยังมี enum SortDirection กับค่าเริ่มต้นของ readonly property รายการเต็มอยู่ในสรุป PHP 8.6 ของ Laravel News ส่วนลิงก์ดาวน์โหลดกับวิธีรายงานบั๊กอยู่ในโพสต์ต้นฉบับของ PHP News ครับ

อ่านต่อ

ถูกอ้างถึงใน

ล่าสุด

ดูทั้งหมด →