1. ทำไมต้องอัพเกรด PHP?
PHP ทุก version มีอายุการ support ที่จำกัด เมื่อผ่าน EOL (End of Life) จะไม่ได้รับ security patch อีกต่อไป ซึ่งเพิ่มความเสี่ยงให้ผู้ไม่ประสงค์ดีโจมตีช่องโหว่ที่รู้จักได้
- Security — PHP เวอร์ชันเก่าที่ EOL แล้วจะไม่ได้รับ security patch
- Performance — PHP 8.x เร็วกว่า PHP 7.x ถึง 2-3 เท่าในบาง benchmark
- Compatibility — framework อย่าง Laravel 11+ ต้องการ PHP 8.2 ขึ้นไป
- Feature — JIT compiler, named arguments, union types, fibers ล้วนมาจาก PHP 8.x
2. PHP Version ปัจจุบันและ EOL
| PHP Version | Release | Active Support | Security Support (EOL) | สถานะ |
|---|---|---|---|---|
| PHP 8.4 | พ.ย. 2024 | พ.ย. 2026 | พ.ย. 2028 | ✅ แนะนำ |
| PHP 8.3 | พ.ย. 2023 | พ.ย. 2025 | พ.ย. 2027 | ✅ Supported |
| PHP 8.2 | ธ.ค. 2022 | ธ.ค. 2024 | ธ.ค. 2026 | ⚠️ Security only |
| PHP 8.1 | พ.ย. 2021 | พ.ย. 2023 | ธ.ค. 2025 | ❌ ใกล้ EOL |
| PHP 8.0 | พ.ย. 2020 | พ.ย. 2022 | พ.ย. 2023 | ❌ EOL แล้ว |
| PHP 7.4 | พ.ย. 2019 | พ.ย. 2021 | พ.ย. 2022 | ❌ EOL แล้ว |
3. เตรียมตัวก่อน Upgrade
การ upgrade PHP โดยไม่เตรียมตัวอาจทำให้เว็บล่มได้ทันที ขั้นตอนเตรียมการเหล่านี้จะช่วยลดความเสี่ยง
3.1 ตรวจสอบ PHP version ปัจจุบัน
php -v
# PHP 7.4.33 (cli) (built: ...)
php-fpm7.4 -v
# หรือตรวจ FPM process
systemctl status php7.4-fpm
3.2 Backup ทุกอย่างก่อน
# Backup database
mysqldump -u root -p --all-databases > /backup/all-db-$(date +%Y%m%d).sql
# Backup web files
tar -czf /backup/webroot-$(date +%Y%m%d).tar.gz /var/www/
# Backup Nginx config
cp -r /etc/nginx /backup/nginx-$(date +%Y%m%d)
# Backup PHP config
cp -r /etc/php /backup/php-$(date +%Y%m%d)
3.3 ตรวจ compatibility ของ code
# ติดตั้ง PHP Compatibility checker
composer require --dev phpcompatibility/php-compatibility
# ตรวจ code ทั้งหมด
vendor/bin/phpcs --standard=PHPCompatibility \
--runtime-set testVersion 8.3 \
/var/www/html/
3.4 ทดสอบบน Staging ก่อน
สร้าง VM หรือ container แยก ติดตั้ง PHP version ใหม่ copy code ไปรัน แล้วทดสอบฟีเจอร์หลักทั้งหมดก่อนจะ upgrade production
4. ติดตั้ง PHP Version ใหม่บน Ubuntu
ใช้ PPA ของ Ondřej Surý ซึ่งเป็นแหล่งมาตรฐานสำหรับ PHP หลาย version บน Ubuntu/Debian
# เพิ่ม PPA
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# ติดตั้ง PHP 8.3 + PHP-FPM + extensions ที่ใช้บ่อย
sudo apt install -y \
php8.3 \
php8.3-fpm \
php8.3-mysql \
php8.3-mbstring \
php8.3-xml \
php8.3-curl \
php8.3-zip \
php8.3-gd \
php8.3-intl \
php8.3-bcmath \
php8.3-opcache \
php8.3-redis
# ตรวจสอบ
php8.3 -v
5. ตั้งค่า Nginx + PHP-FPM
5.1 ตรวจสอบ PHP-FPM socket
# PHP 8.3 FPM socket
ls /run/php/php8.3-fpm.sock
# Start + enable
sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm
sudo systemctl status php8.3-fpm
5.2 แก้ Nginx config ให้ชี้ไป PHP 8.3
# /etc/nginx/sites-available/mysite.conf
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# เปลี่ยน socket นี้เมื่อ upgrade
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
5.3 ตรวจสอบ config และ reload
sudo nginx -t
# nginx: configuration file /etc/nginx/nginx.conf syntax is ok
sudo systemctl reload nginx
6. ทดสอบก่อน Switch Traffic
6.1 ทดสอบ PHP version ที่ server เห็น
# สร้างไฟล์ทดสอบชั่วคราว
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo-test.php
# เรียกผ่าน curl
curl -s http://localhost/phpinfo-test.php | grep -i "php version"
# ลบทิ้งหลังทดสอบ (อย่าลืม!)
rm /var/www/html/phpinfo-test.php
6.2 ทดสอบ application
# สำหรับ Laravel
cd /var/www/html
php8.3 artisan migrate:status
php8.3 artisan config:clear
php8.3 artisan cache:clear
# สำหรับ WordPress — ตรวจ error log
tail -f /var/log/nginx/error.log
tail -f /var/log/php8.3-fpm.log
6.3 ตรวจ OPcache
php8.3 -r "echo opcache_get_status()['opcache_enabled'] ? 'OPcache ON' : 'OPcache OFF';"
7. Switch PHP Version
เมื่อทดสอบแล้วมั่นใจ ก็ถึงเวลา switch traffic หลัก
# 1. แก้ Nginx fastcgi_pass ใน site config
sudo nano /etc/nginx/sites-available/mysite.conf
# เปลี่ยน: fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# เป็น: fastcgi_pass unix:/run/php/php8.3-fpm.sock;
# 2. Test + reload
sudo nginx -t && sudo systemctl reload nginx
# 3. ตรวจว่า PHP version เปลี่ยนแล้ว
curl -s http://example.com/phpinfo-test.php | grep "PHP Version"
# 4. ตั้ง CLI default (optional)
sudo update-alternatives --set php /usr/bin/php8.3
| คำสั่ง | ผลที่ต้องการ |
|---|---|
php -v | แสดง 8.3.x |
curl -I https://example.com | HTTP 200 |
systemctl status php8.3-fpm | active (running) |
nginx -t | syntax is ok |
8. วิธี Rollback ฉุกเฉิน
ถ้าพบปัญหาหลัง switch สามารถ rollback กลับ PHP version เดิมได้ภายในไม่กี่นาที
# กลับไป PHP 7.4
sudo nano /etc/nginx/sites-available/mysite.conf
# เปลี่ยน fastcgi_pass กลับ
# fastcgi_pass unix:/run/php/php7.4-fpm.sock;
sudo nginx -t && sudo systemctl reload nginx
# ตรวจว่า PHP 7.4 FPM ยัง running
sudo systemctl status php7.4-fpm
# ถ้า stopped ให้ start ก่อน
sudo systemctl start php7.4-fpm
8.1 Rollback จาก Snapshot (เร็วที่สุด)
ถ้า VPS รองรับ snapshot (AsiaGB VPS มีบริการ snapshot) ให้ restore snapshot ที่ทำไว้ก่อน upgrade — ทุกอย่างกลับไปสถานะเดิมใน 5-10 นาที โดยไม่ต้องแก้ config
9. มอนิเตอร์หลัง Upgrade
9.1 ดู error log แบบ real-time
# PHP-FPM log
sudo tail -f /var/log/php8.3-fpm.log
# Nginx error log
sudo tail -f /var/log/nginx/error.log
# PHP error log (path ขึ้นกับ php.ini)
sudo tail -f /var/log/php_errors.log
9.2 ตรวจ process และ resource
# ดู PHP-FPM processes
ps aux | grep php-fpm
# ดู memory usage
free -h
# ดู CPU
top -b -n1 | grep php
9.3 ตรวจ OPcache hit rate
php8.3 -r "
\$s = opcache_get_status();
\$hit = \$s['opcache_statistics']['hits'];
\$miss = \$s['opcache_statistics']['misses'];
\$total = \$hit + \$miss;
echo 'Hit rate: ' . round(\$hit/\$total*100, 2) . '%\n';
"
Hit rate ที่ดีควรอยู่ที่ 90%+ หลังเว็บ warm up ประมาณ 30 นาที
9.4 ตั้งค่า PHP-FPM pool สำหรับ production
# /etc/php/8.3/fpm/pool.d/www.conf
[www]
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500
pm.max_children ตาม RAM: (RAM ทั้งหมด – 512MB) ÷ 30MB ≈ จำนวน worker ที่เหมาะสม
10. สรุป
การอัพเกรด PHP บน VPS Nginx มีขั้นตอนหลัก 5 ข้อ:
- เตรียม — backup + snapshot + ตรวจ compatibility
- ติดตั้ง — PHP version ใหม่ + PHP-FPM + extensions
- ตั้งค่า — Nginx fastcgi_pass ชี้ socket ใหม่
- ทดสอบ — บน staging ก่อน switch production
- มอนิเตอร์ — ดู log + OPcache hit rate + resource usage
ถ้าวางแผนดี upgrade PHP ไม่ควรมี downtime เลย — เพราะ PHP-FPM ช่วยให้รัน 2 version พร้อมกันและ switch ได้ชั่วพริบตาด้วยการ reload Nginx
ต้องการ VPS ที่ snapshot ได้และมีทีม support คอยช่วย? ดู AsiaGB VPS ไทย เริ่มต้นราคาประหยัด SSD Uptime 99%
คำถามที่พบบ่อย
ควรอัพเกรด PHP ทุกกี่เดือน?
ควรติดตาม PHP release cycle — minor version ทุก 6-12 เดือน major version ทุก 1-2 ปี และอัพเกรดก่อน EOL อย่างน้อย 3-6 เดือน เพื่อให้มีเวลาแก้ compatibility ปัญหา
PHP-FPM กับ mod_php ต่างกันอย่างไร?
PHP-FPM (FastCGI Process Manager) รัน PHP แยกจาก web server ทำให้ควบคุม resource ได้ดีกว่า รองรับ pool หลาย version พร้อมกัน ส่วน mod_php ฝังอยู่ใน Apache โดยตรง — สำหรับ Nginx จะใช้ PHP-FPM เท่านั้น
หลัง upgrade PHP แล้วเว็บช้าลง ต้องทำอย่างไร?
ตรวจ OPcache ว่าเปิดอยู่ไหม ตรวจ PHP error log ว่ามี deprecated warning เยอะไหม และรัน php -i | grep opcache เพื่อยืนยัน extension โหลดครบ นอกจากนี้ตรวจ PHP-FPM pool config ว่า max_children เพียงพอกับ traffic
สามารถรัน PHP หลาย version พร้อมกันบน Nginx ได้ไหม?
ได้ — ใช้ PHP-FPM แต่ละ version กำหนด socket แยกกัน (เช่น /run/php/php7.4-fpm.sock และ /run/php/php8.3-fpm.sock) แล้ว Nginx server block แต่ละ virtual host ชี้ไป fastcgi_pass ที่ socket ของ PHP version ที่ต้องการ
ถ้า rollback ไม่ได้ ต้องทำอย่างไร?
restore จาก snapshot VPS ก่อน upgrade (ถ้า provider รองรับ) หรือ restore database backup + redeploy code จาก git ที่รู้ว่า stable เป็นสาเหตุที่ต้องทำ backup ก่อน upgrade ทุกครั้ง
WordPress จะ error อะไรบ้างเมื่ออัพเกรด PHP?
พบบ่อยคือ plugin ที่ใช้ function deprecated เช่น create_function(), each(), split() ใน PHP เก่า และ undefined variable / type error ใน PHP 8.x strict mode วิธีแก้คือ update plugin ก่อน upgrade PHP และทดสอบบน staging ก่อนเสมอ