Composer คือ Dependency Manager สำหรับ PHP ช่วยติดตั้งและจัดการ Library ต่างๆ เช่น PHPMailer, Guzzle, Carbon, Stripe SDK ได้ด้วยคำสั่งเดียว ใน Shared Hosting DirectAdmin มี SSH Access (ขึ้นอยู่กับแผน) ทำให้ใช้ Composer ได้โดยตรงผ่าน Terminal หรืออัพ vendor/ folder ผ่าน FTP ก็ได้เช่นกัน
ตรวจสอบ PHP CLI และ SSH Access
Composer ต้องการ PHP CLI (Command Line) ตรวจสอบผ่าน SSH:
ssh [email protected]
php -v
# PHP 8.3.x (cli)
ถ้าไม่มี SSH หรือ PHP CLI ไม่ถูก version ต้องการ ใช้ php83 หรือ php82 แทน (DirectAdmin อนุญาตให้เรียก PHP หลายเวอร์ชัน):
php83 -v
ติดตั้ง Composer บน Hosting
cd ~
curl -sS https://getcomposer.org/installer | php
# สร้างไฟล์ composer.phar ในโฟลเดอร์ปัจจุบัน
เพิ่ม alias ให้พิมพ์ composer ได้เลยโดยไม่ต้อง php composer.phar:
echo 'alias composer="php ~/composer.phar"' >> ~/.bashrc
source ~/.bashrc
composer --version
สร้างโปรเจกต์ PHP พร้อม Composer
ไฟล์ composer.json (โครงสร้างพื้นฐาน)
{
"require": {
"phpmailer/phpmailer": "^6.9",
"guzzlehttp/guzzle": "^7.8",
"nesbot/carbon": "^3.0"
}
}
ติดตั้ง Package
cd ~/domains/yourdomain.com/public_html
composer install
Composer จะสร้างโฟลเดอร์ vendor/ พร้อม autoloader vendor/autoload.php
Composer คืออะไรและทำไมถึงสำคัญสำหรับ PHP Developer
ก่อนจะมี Composer นักพัฒนา PHP ต้องดาวน์โหลด Library แต่ละตัวด้วยตัวเอง คอยอัพเดต version เองด้วยมือ และแก้ปัญหาเมื่อ Library ที่ดาวน์โหลดมาต้องการ Library อื่นที่ยังไม่ได้ติดตั้ง ปัญหานี้เรียกว่า "Dependency Hell" และทำให้เสียเวลาไปมากกับงานที่ไม่ใช่ logic หลักของโปรแกรม
Composer แก้ปัญหาทั้งหมดนี้ได้ในคำสั่งเดียว เมื่อระบุ Package ที่ต้องการใน composer.json Composer จะ:
- ดาวน์โหลด Package ทั้งหมดพร้อม Dependency ที่ Package นั้นต้องการอัตโนมัติ
- ตรวจสอบความเข้ากันได้ของ PHP version กับ Package แต่ละตัว
- สร้าง
vendor/autoload.phpที่รวม autoloading ทุก Package ไว้ในไฟล์เดียว - ล็อก version ทุกอย่างใน
composer.lockเพื่อให้ทีมทุกคนได้ Environment เดียวกัน
ปัจจุบัน Framework ยอดนิยมทุกตัวในโลก PHP ไม่ว่าจะเป็น Laravel, Symfony, Slim หรือ CodeIgniter ล้วนใช้ Composer เป็นพื้นฐาน และ Packagist.org ซึ่งเป็น repository กลางของ Composer มี Package ให้เลือกใช้มากกว่า 400,000 Package ในปี 2026
ทำความเข้าใจโครงสร้างไฟล์ที่ Composer สร้าง
หลังรัน composer install สำเร็จ โครงสร้างโฟลเดอร์ในโปรเจกต์จะมีลักษณะดังนี้
| ไฟล์/โฟลเดอร์ | หน้าที่ | อัพ Git? |
|---|---|---|
composer.json |
ระบุ dependencies และ config ของโปรเจกต์ | ✓ ควรอัพ |
composer.lock |
ล็อก version ทุก package ให้ทีมใช้ version เดียวกัน | ✓ ควรอัพ |
vendor/ |
โค้ดของ package ทั้งหมดและ autoloader | ✗ ใส่ใน .gitignore |
vendor/autoload.php |
ไฟล์ที่ require ในโค้ดเพื่อใช้งาน package | ✗ สร้างอัตโนมัติ |
composer.lock มีความสำคัญมากในทีม เพราะทำให้ทุกคนติดตั้ง package version เดียวกันทุกครั้งที่รัน composer install ไม่เกิดปัญหา "ในเครื่องฉันใช้งานได้ แต่บน server พัง" เพราะ version ต่างกัน
การจัดการ Dependency แบบมืออาชีพด้วย Composer
ระบุ Version Constraint ที่เหมาะสม
ใน composer.json รูปแบบการระบุ version มีผลต่อความเสถียรของโปรเจกต์อย่างมาก
| Constraint | ความหมาย | เหมาะกับ |
|---|---|---|
^6.9 |
≥6.9.0 และ <7.0.0 (ยอมรับ minor update) | Production ทั่วไป |
~6.9 |
≥6.9.0 และ <6.10.0 (ยอมรับเฉพาะ patch) | ต้องการความระมัดระวังสูง |
6.9.* |
6.9.x ทุก patch version | Lock ที่ minor version |
6.9.1 |
version นี้เท่านั้น | ไม่แนะนำ (หยุดรับ security patch) |
ใช้ Autoload ของโปรเจกต์เอง
นอกจาก autoload ของ package Composer ยังช่วยจัดการ autoload ของโค้ดโปรเจกต์เองได้ผ่าน composer.json
{
"require": {
"phpmailer/phpmailer": "^6.9"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
หลังแก้ไขให้รัน composer dump-autoload เพื่ออัพเดต autoloader แล้ว class ใน src/ จะถูก autoload ได้ทันที
ใช้ Package ในโค้ด PHP
format('d/m/Y H:i');
// ใช้ PHPMailer
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.yourdomain.com';
// ... ส่ง email
ติดตั้ง Package ยอดนิยมและวิธีใช้งาน
Stripe PHP SDK — รับชำระเงินออนไลน์
Stripe SDK ช่วยให้โปรเจกต์ PHP รองรับการชำระเงินด้วยบัตรเครดิต PromptPay และ QR Code ได้ง่ายขึ้น
composer require stripe/stripe-php
# ตัวอย่างสร้าง PaymentIntent
require_once __DIR__ . '/vendor/autoload.php';
\Stripe\Stripe::setApiKey('sk_live_xxx');
$intent = \Stripe\PaymentIntent::create([
'amount' => 50000, // หน่วย satang (500 บาท)
'currency' => 'thb',
]);
echo $intent->client_secret;
Guzzle HTTP Client — ส่ง API Request
Guzzle เป็น HTTP Client ที่ใช้งานง่ายและรองรับ async request, middleware และ retry โดยอัตโนมัติ
composer require guzzlehttp/guzzle
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://api.example.com']);
$response = $client->get('/users', [
'headers' => ['Authorization' => 'Bearer token123'],
'timeout' => 5,
]);
$data = json_decode($response->getBody(), true);
Carbon — จัดการวันที่และเวลาในภาษาไทย
Carbon ขยายความสามารถของ PHP DateTime ให้ใช้งานง่ายขึ้น รองรับ timezone, locale และ human-readable format
composer require nesbot/carbon
use Carbon\Carbon;
Carbon::setLocale('th');
$now = Carbon::now('Asia/Bangkok');
echo $now->format('d/m/Y H:i'); // 07/06/2026 15:30
echo $now->diffForHumans(); // เมื่อไม่กี่วินาทีที่แล้ว
echo $now->addDays(7)->toDateString(); // 2026-06-14
Intervention Image — ประมวลผลรูปภาพ
Intervention Image ช่วย resize, crop, watermark รูปภาพ และแปลง format (WebP, JPG, PNG) ได้โดยตรงจาก PHP
composer require intervention/image
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
$manager = new ImageManager(new Driver());
$image = $manager->read('upload.jpg');
$image->resize(width: 820, height: 340);
$image->save('output.webp'); // แปลงเป็น WebP อัตโนมัติ
กรณีไม่มี SSH — อัพ vendor/ ผ่าน FTP
ถ้า Hosting ไม่มี SSH Access ให้รัน Composer บนเครื่องตัวเองก่อน แล้วอัพโหลดทั้งโฟลเดอร์ vendor/ ขึ้น Hosting ผ่าน FTP:
- ติดตั้ง Composer บน Local (Mac:
brew install composer/ Win: ดาวน์โหลด installer) - รัน
composer installใน project folder - อัพโหลด
vendor/และcomposer.lockขึ้น Hosting ด้วย FileZilla หรือ FTP
ข้อสำคัญ: ห้ามอัพโหลดโฟลเดอร์ vendor/ ขึ้น Git โดยตรง — ให้ใส่ /vendor ใน .gitignore แทน และใช้ composer install บน server หรือ CI/CD pipeline แทน
เลือก Package อย่างไรให้เหมาะกับโปรเจกต์
Packagist.org มี Package มากกว่า 400,000 รายการ การเลือก Package ที่ถูกต้องมีผลต่อความมั่นคง ประสิทธิภาพ และความปลอดภัยของโปรเจกต์ในระยะยาว หลักการเลือก Package ที่ดีมีดังนี้
- จำนวน Download: Package ที่มีผู้ดาวน์โหลดสูง (เช่น 100 ล้าน+ ครั้ง) มักผ่านการทดสอบจากนักพัฒนาทั่วโลกมาแล้ว มีโอกาสพบ Bug น้อยกว่า
- ความถี่ในการอัพเดต: ตรวจสอบวันที่ release ล่าสุดบน GitHub ว่า Package ยังมีการดูแลอยู่หรือไม่ Package ที่ไม่ได้รับการอัพเดตนานกว่า 2 ปีอาจมีช่องโหว่ Security ที่ไม่ได้รับการแก้ไข
- License ที่เข้ากัน: ตรวจสอบ License ให้เข้ากับโปรเจกต์ของตัวเอง MIT และ Apache 2.0 เป็น License ที่ใช้เชิงพาณิชย์ได้อย่างอิสระ GPL อาจมีข้อจำกัดสำหรับโปรเจกต์ Closed Source
- ทดสอบบน PHP version ที่ใช้: ดู
requireในcomposer.jsonของ Package ว่ารองรับ PHP version ที่ Hosting ให้บริการหรือไม่ เช่น PHP 8.3 บน AsiaGB - ตรวจสอบ Vulnerability: รัน
composer auditหลังติดตั้งทุกครั้ง เพื่อตรวจสอบว่า Package ที่เลือกไม่มีช่องโหว่ที่รู้จักในฐานข้อมูล Packagist Security Advisory
สำหรับ Package ใหม่ที่ยังไม่เคยใช้ แนะนำให้ทดสอบใน environment แยกก่อนเสมอ ด้วยการสร้าง Branch ใหม่ใน Git แล้วรัน composer require package/name แล้วทดสอบบน local ก่อนนำขึ้น Hosting จริง
คำสั่ง Composer ที่ใช้บ่อย
# ติดตั้ง dependencies จาก composer.json
composer install
# เพิ่ม package ใหม่
composer require stripe/stripe-php
# อัพเดต packages ทั้งหมดเป็น version ล่าสุด
composer update
# อัพเดต package เฉพาะตัว
composer update phpmailer/phpmailer
# ลบ package
composer remove guzzlehttp/guzzle
# แสดง packages ที่ติดตั้ง
composer show
ตัวอย่าง Use Case จริงสำหรับโปรเจกต์ไทย
Composer เป็นเครื่องมือที่ใช้ในงานจริงหลากหลายประเภท ตั้งแต่เว็บไซต์ขนาดเล็กไปจนถึงระบบ E-Commerce และ API Backend ต่อไปนี้คือตัวอย่างที่นักพัฒนาไทยใช้บ่อย
ระบบส่งอีเมล Newsletter ด้วย PHPMailer
PHPMailer เป็น Library ยอดนิยมสำหรับส่งอีเมลผ่าน SMTP รองรับ TLS, HTML email, Attachment และ Batch sending ใช้งานง่ายกว่าฟังก์ชัน mail() ของ PHP ธรรมดามาก
composer require phpmailer/phpmailer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'mail.yourdomain.com';
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'your-password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->CharSet = 'UTF-8'; // รองรับภาษาไทย
$mail->setFrom('[email protected]', 'ชื่อเว็บไซต์');
$mail->addAddress('[email protected]');
$mail->isHTML(true);
$mail->Subject = 'ข่าวสารประจำสัปดาห์';
$mail->Body = '<h1>สวัสดีครับ</h1><p>เนื้อหา newsletter...</p>';
$mail->send();
echo 'ส่งอีเมลสำเร็จ';
} catch (Exception $e) {
echo "เกิดข้อผิดพลาด: {$mail->ErrorInfo}";
}
ดึงข้อมูล REST API ด้วย Guzzle
สำหรับโปรเจกต์ที่ต้องเชื่อมต่อกับ API ภายนอก เช่น ระบบ ERP, LINE Messaging API, หรือ Payment Gateway ต่างๆ Guzzle ช่วยให้เขียนโค้ดได้กระชับและมีระบบจัดการ error ครบชุด
composer require guzzlehttp/guzzle
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client([
'base_uri' => 'https://api.example.com/v1/',
'timeout' => 10.0,
'headers' => ['Accept' => 'application/json'],
]);
try {
$response = $client->post('orders', [
'json' => [
'product_id' => 123,
'quantity' => 2,
'customer' => 'สมชาย ใจดี',
],
]);
$order = json_decode($response->getBody(), true);
echo 'สร้าง Order สำเร็จ: #'.$order['id'];
} catch (RequestException $e) {
echo 'API Error: '.$e->getMessage();
}
จัดการไฟล์ CSV/Excel ด้วย PhpSpreadsheet
PhpSpreadsheet ช่วยอ่านและเขียนไฟล์ Excel (.xlsx) และ CSV ได้โดยตรงจาก PHP ใช้งานมากในระบบ Import/Export สินค้า หรือรายงานที่ต้องส่งเป็น Excel
composer require phpoffice/phpspreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'ชื่อสินค้า');
$sheet->setCellValue('B1', 'ราคา (บาท)');
$sheet->setCellValue('A2', 'Hosting ไทย 5GB');
$sheet->setCellValue('B2', 500);
$writer = new Xlsx($spreadsheet);
$writer->save('รายการสินค้า.xlsx');
echo 'สร้างไฟล์ Excel สำเร็จ';
แนวทาง Security สำหรับ Composer บน Production
การใช้ Composer บน Hosting มีประเด็น Security ที่ต้องระวังดังนี้
- ปิดกั้น vendor/ ไม่ให้เข้าถึงผ่านเว็บ — เพิ่มไฟล์
vendor/.htaccessที่มีเนื้อหาDeny from allเพื่อป้องกันไม่ให้คนภายนอกอ่านโค้ด package โดยตรง - ใช้ composer audit — คำสั่งนี้ตรวจสอบ package ที่ติดตั้งกับฐานข้อมูล CVE (ช่องโหว่ที่รู้จัก) และแจ้งเตือนถ้าพบ package ที่มีปัญหา Security
- ไม่ใช้ require-dev บน Production — รัน
composer install --no-dev --optimize-autoloaderบน Production เพื่อไม่ติดตั้ง package ที่ใช้แค่ตอน development - ตรวจสอบ integrity อัตโนมัติ — Composer ตรวจ checksum ของ package ทุกตัวกับ packagist.org อัตโนมัติระหว่าง
composer installและcomposer update; รันcomposer validateเพื่อตรวจcomposer.jsonให้ถูกต้องด้วย
# ตรวจหาช่องโหว่ใน package ที่ติดตั้ง
composer audit
# ติดตั้งเฉพาะ production dependencies พร้อม optimized autoloader
composer install --no-dev --optimize-autoloader
# ตรวจสอบความถูกต้องของ composer.json
composer validate
เคล็ดลับ Production: flag --optimize-autoloader สร้าง class-map แทน PSR-4 lookup ทำให้ autoloading เร็วขึ้น 20–30% เหมาะมากสำหรับ Hosting ที่ไม่มี OPCache หรือมี Memory จำกัด
ปัญหาที่พบบ่อยบน Shared Hosting
Memory limit exceeded
php -d memory_limit=512M composer.phar install
ต้องใช้ PHP version เฉพาะ
php83 ~/composer.phar install
Timeout บน SSH
ใช้ nohup เพื่อให้รันต่อแม้ SSH หลุด:
nohup php ~/composer.phar install > composer.log 2>&1 &
ต้องการ Hosting ที่รองรับ SSH และ PHP 8.3?
AsiaGB Hosting รองรับ PHP 8.3, SSH Access และ Composer ทุกแผน เริ่มต้น 500 บาท/ปี
ดู Hosting Plans