PIE 1.5 มีอะไรใหม่ CI ต้องระบุ package ของ extension เอง และ pie upgrade

PIE 1.5 เลิกเลือก package ของ extension ให้เองตอนติดตั้งแบบไม่ถามตอบ สคริปต์ CI หรือ Dockerfile ที่ติดตั้งตาม composer.json ต้องใส่ --select ให้ทุก extension ที่ขาด มี --no-dev ข้าม extension ของเครื่อง dev อย่าง Xdebug มีคำสั่ง pie upgrade และควรใช้ 1.5.5 ขึ้นไปที่แก้ช่องโหว่ระดับต่ำไปแล้ว

เผยแพร่
เวลาอ่าน
4 นาที
สรุปจาก
Yannick Lyn Fatt · laravel-news.com
แท็ก
#CI/CD#Linux#PHP
ในโพสต์นี้ 6 หัวข้อ
  1. PIE คืออะไร
  2. CI ต้องบอกเองว่า extension มาจาก package ไหน
  3. --no-dev ข้าม extension ที่ใช้แค่ตอนพัฒนา
  4. pie upgrade อัปเดตภายในกรอบเวอร์ชันเดิม
  5. ของใหม่อื่น ๆ ใน 1.5
  6. ใช้ 1.5.5 ขึ้นไป

PIE คืออะไร

บน Ubuntu ที่ลง PHP จาก ondrej PPA เราได้ extension จาก apt อยู่แล้ว เช่น php8.4-redis จึงอาจไม่เคยต้องใช้ตัวติดตั้งอื่น แต่ใน Docker image ทางการของ PHP หรือเครื่องที่คอมไพล์ PHP เอง extension ที่ไม่ได้มากับ PHP ต้อง build จาก source ทางที่ใช้กันมาตลอดคือ pecl install redis

PIE (PHP Installer for Extensions) เป็นตัวติดตั้งตัวใหม่ที่ PHP Foundation ดูแล ทำงานคล้าย Composer คือหา extension จาก Packagist ตามชื่อ package (phpredis/phpredis, xdebug/xdebug) ดาวน์โหลด build แล้วเปิดใช้ใน php.ini ให้ และถ้ารันในโฟลเดอร์โปรเจกต์ PIE จะอ่าน ext-* จาก composer.json แล้วติดตั้งตัวที่ยังขาดให้

1.5.0 ออกกลางเดือนกันยายน 2026 และ PHP Foundation ประกาศ เมื่อ 7 ตุลาคม หลังทำมาราวห้าเดือน

CI ต้องบอกเองว่า extension มาจาก package ไหน

สมมติ composer.json ของแอปประกาศไว้แบบนี้

{
    "require": {
        "ext-redis": "*"
    },
    "require-dev": {
        "ext-xdebug": "*"
    }
}

ext-redis แค่บอกว่าแอปต้องมี extension ชื่อ redis ไม่ได้บอกว่าให้ติดตั้งจาก package ไหน ก่อน 1.5 ถ้าสั่ง pie install ในโหมดไม่ถามตอบพร้อม --allow-non-interactive-project-install PIE จะเลือก package ให้เอง ซึ่ง PHP Foundation บอกว่าเสี่ยง เพราะไม่มีอะไรรับประกันว่า extension ที่ขาดจะไปจบที่ package ไหน

ใน 1.5 flag นี้ไม่มีผลแล้ว ถ้า extension ไหนขาดแล้วไม่ได้เลือก package ไว้ คำสั่งจะล้มทันที ทางแก้คือใส่ --select หนึ่งตัวต่อหนึ่ง extension ฝั่งซ้ายเป็นชื่อ extension ไม่ต้องมี ext- ฝั่งขวาเป็นชื่อ package (PR #633)

pie install --no-interaction --no-dev \
    --select=redis=phpredis/phpredis

PIE ดูก่อนว่ามี redis แล้วหรือยัง แล้วติดตั้งจาก phpredis/phpredis เฉพาะเมื่อยังไม่มี เรื่องนี้กระทบเฉพาะการติดตั้งตาม composer.json ถ้าสั่งตามชื่อ package ตรง ๆ อย่าง pie install phpredis/phpredis อยู่แล้วก็ไม่ต้องแก้อะไร

แอป Laravel ที่ต่อ Redis ผ่าน Predis ซึ่งเป็น PHP ล้วน ไม่ต้องมี ext-redis ใน composer.json เลย บรรทัดนี้มีไว้สำหรับแอปที่ตั้ง client เป็น phpredis เท่านั้น

--no-dev ข้าม extension ที่ใช้แค่ตอนพัฒนา

ปกติ PIE ตรวจทั้ง require และ require-dev image สำหรับ production จึงพยายามลง Xdebug ไปด้วย --no-dev (PR #710) ทำให้ PIE ดูเฉพาะ require ส่วนเครื่อง dev ที่อยากได้ทั้งสองตัวก็เลือก package ให้ครบ

pie install --no-interaction \
    --select=redis=phpredis/phpredis \
    --select=xdebug=xdebug/xdebug

--no-dev ไม่ได้ถอด extension ที่ลงไว้แล้ว และไม่ได้แทน composer install --no-dev ของ package PHP ยังต้องสั่งแยกเหมือนเดิม

อีกเรื่องที่ CI มักติดคือเครื่องมือสำหรับ build (compiler, make, unzip) ในโหมดไม่ถามตอบ PIE จะไม่ลงให้เองถ้าไม่สั่ง ใส่ --auto-install-build-tools ให้ลงเอง หรือ --no-build-tools-check ถ้าเตรียมไว้ใน image แล้ว ส่วน pie check-build-tools (PR #673) ใช้เช็คเครื่องก่อนติดตั้งได้

pie upgrade อัปเดตภายในกรอบเวอร์ชันเดิม

pie upgrade (PR #666) อัปเดต extension ทุกตัวที่ลงด้วย PIE โดยไม่ข้ามกรอบเวอร์ชันที่ใช้ตอนติดตั้ง ถ้าเคยสั่ง pie install 'phpredis/phpredis:^6.0' การ upgrade จะขยับได้แค่ใน 6.x ถ้าจะไป 7.x ต้องสั่ง install ใหม่ด้วยกรอบใหม่ คำสั่งนี้แตะเฉพาะ extension ของ PHP ตัวที่สั่ง ไม่เกี่ยวกับ Laravel หรือของใน vendor

เทียบกับคำสั่งเดิมของ PECL ได้ตรง ๆ คือ pecl upgrade-all กลายเป็น pie upgrade และ pecl search กลายเป็น pie search

ของใหม่อื่น ๆ ใน 1.5

  • ติดตั้งหลายตัวในคำสั่งเดียว เช่น pie install phpredis/phpredis xdebug/xdebug (PR #642) ใช้ตอนเขียน Dockerfile ได้สะดวกขึ้น
  • pie search หาชื่อ package ของ extension (PR #674)
  • pie install --from-lock ติดตั้งตาม pie.json และ pie.lock ให้ได้ชุดเดียวกันทุกเครื่อง
  • image สำหรับ Docker มี tag แบบมีแต่ตัวโปรแกรม คือ bin, 1.5-bin และ 1-bin ใช้ผูกเข้ามาตอน build ได้โดยไม่ต้องเก็บ PIE ไว้ใน image
RUN --mount=type=bind,from=ghcr.io/php/pie:bin,source=/pie,target=/usr/local/bin/pie \
    pie install --no-interaction phpredis/phpredis
  • ตรวจลายเซ็นของไฟล์ที่ดาวน์โหลดละเอียดขึ้น PIE เปลี่ยนมาใช้ไลบรารีตรวจ Sigstore ของ PHP Foundation เองแทนการพึ่ง gh CLI
  • รองรับ PHP 8.6 ที่ยังเป็นรุ่นทดสอบ

ใช้ 1.5.5 ขึ้นไป

หลัง 1.5.0 มีแพตช์ออกตามมาอีกห้าตัว ตัวล่าสุด 1.5.5 (30 ตุลาคม) แก้ GHSA-4538-pqqf-mv67 ความรุนแรงระดับต่ำ ถ้า build ล้มแล้ว output ของ make ยาวเกิน 5,000 byte PIE จะเขียนลงไฟล์ใน /tmp โดยไม่จำกัดสิทธิ์ user อื่นในเครื่องเดียวกันจึงเปิดอ่านได้ กระทบเฉพาะเครื่องที่มีหลาย user ใช้ร่วมกัน รุ่น 1.4 แก้แล้วใน 1.4.12

ถ้าใน CI ดาวน์โหลด PIE แบบระบุเวอร์ชันไว้ หรือใช้ image 1.5-bin ตอนเปลี่ยนมา 1.5 ก็เช็คด้วยว่าได้ 1.5.5 แล้ว รายละเอียดของแต่ละ PR อ่านต่อได้ที่บทความต้นฉบับครับ

อ่านต่อ

ล่าสุด

ดูทั้งหมด →