ใช้ Composer จัดการ PHP Packages บน VPS
Composer เป็น dependency manager สำหรับ PHP ที่ทุก modern PHP project ต้องใช้ ไม่ว่าจะเป็น Laravel, Symfony หรือ project เล็กๆ Composer จัดการ version ของ library ให้ autoload class อัตโนมัติ และป้องกัน dependency conflict บทความนี้ครอบคลุมตั้งแต่ติดตั้งจนถึง optimize สำหรับ production
ติดตั้ง Composer
sudo apt install php-cli php-curl php-zip unzip -y
# Download installer
cd /tmp
curl -sS https://getcomposer.org/installer -o composer-setup.php
# ตรวจสอบ hash (ดูค่าล่าสุดที่ getcomposer.org/download/)
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# ตรวจ version
composer --version
เริ่มต้น Project ใหม่
# สร้าง composer.json
composer init
# หรือสร้าง project ด้วย template (Laravel)
composer create-project laravel/laravel myapp
# ติดตั้ง package
composer require guzzlehttp/guzzle
composer require --dev phpunit/phpunit
Composer Basics
# ติดตั้ง dependencies จาก composer.json
composer install
# อัพเดท packages ทั้งหมด
composer update
# อัพเดท package เดียว
composer update guzzlehttp/guzzle
# ลบ package
composer remove vendor/package-name
# ดู packages ที่ติดตั้ง
composer show
Optimize สำหรับ Production
# สร้าง classmap autoloader (เร็วกว่า PSR-4 autoloading)
composer install --no-dev --optimize-autoloader
# หรือแยกขั้นตอน
composer dump-autoload --optimize --no-dev
# ดูว่า autoload map ใหญ่แค่ไหน
wc -l vendor/composer/autoload_classmap.php
--no-dev เสมอ จะไม่ติดตั้ง dev dependencies (phpunit, debug tools) ทำให้ vendor/ เล็กกว่าและ autoload เร็วกว่า
composer.json Versioning
{
"require": {
"php": "^8.2",
"guzzlehttp/guzzle": "^7.0", // >= 7.0.0 < 8.0.0
"monolog/monolog": "~2.0", // >= 2.0.0 < 3.0.0
"some/package": "2.1.0" // exact version (ไม่แนะนำ)
}
}
ตรวจสอบว่า Composer ทำงานถูกต้อง
# ตรวจ version และ system requirements
composer --version
composer diagnose
# ตรวจ autoloader ทำงาน
php -r "require 'vendor/autoload.php'; echo 'Autoloader OK';"
# ตรวจ security vulnerabilities
composer audit
# ตรวจ dependencies ล้าสมัย
composer outdated
composer audit ตรวจ CVE ใน packages ที่ติดตั้งอยู่ ควรรันหลัง deploy ทุกครั้ง Laravel ทำอัตโนมัติเมื่อรัน composer install
แก้ปัญหาที่พบบ่อย
Error: "Your requirements could not be resolved"
Package ที่ต้องการ PHP version หรือ extension ที่ไม่ตรงกับ server:
# ดูว่า PHP version และ extensions มีอะไรบ้าง
php -v
php -m | sort
# ดูว่า package ต้องการอะไร
composer why vendor/package
# แก้โดยเปลี่ยน version ของ package หรืออัพเดท PHP
Composer ใช้ memory มากจนหยุดกลางคัน
PHP memory_limit ต่ำเกินไป Composer ต้องการ RAM มากตอน resolve dependencies:
# รันพร้อม memory limit สูง
COMPOSER_MEMORY_LIMIT=-1 composer install
# หรือตั้งใน php.ini
sudo sed -i 's/memory_limit = .*/memory_limit = 1G/' /etc/php/8.3/cli/php.ini
vendor/ directory ขนาดใหญ่มาก กิน disk
ใน production ใช้ --no-dev และไม่ควร commit vendor/ ใน git:
# เพิ่มใน .gitignore
/vendor/
# ลบ dev packages
composer install --no-dev
# ดูขนาด vendor
du -sh vendor/
Class not found หลัง เพิ่ม class ใหม่
Autoloader classmap ยังไม่อัพเดท ต้อง regenerate:
# Regenerate autoload classmap
composer dump-autoload
# หรือถ้าใช้ optimized autoloader
composer dump-autoload --optimize
คำถามที่พบบ่อย
composer.lock คืออะไร ควร commit ไว้ใน git ไหม?
composer.lock บันทึก exact version ของทุก package ที่ติดตั้งไว้ ควร commit ไว้ใน git เสมอ เมื่อ developer คนอื่น composer install จะได้ version เดียวกัน ป้องกัน "works on my machine" ปัญหา
ความแตกต่างระหว่าง composer install กับ composer update?
install ติดตั้ง version ที่ระบุใน composer.lock (reproducible) update ค้นหา version ใหม่ที่ตรง constraint ใน composer.json แล้วอัพเดท lock file ใช้ install สำหรับ deploy production ใช้ update เฉพาะตอน development
Private Packagist หรือ private repository ใช้ Composer ได้ไหม?
ได้ เพิ่ม repository type ใน composer.json: "repositories": [{"type": "vcs", "url": "[email protected]:company/private-repo.git"}] แล้ว require package นั้นตามปกติ ต้องมี SSH key หรือ token ที่มีสิทธิ์ access