ใช้ Composer บน Shared Hosting ได้จริงไหม

คำตอบคือ ได้ — ถ้า Hosting รองรับ SSH และ PHP CLI เรียนรู้ขั้นตอนและวิธีแก้ข้อจำกัดได้เลย

ใช้ Composer บน Shared Hosting ได้จริงไหม

Composer คืออะไร?

Composer คือ Dependency Manager สำหรับ PHP ช่วยจัดการ Package และ Library ที่โปรเจกต์ต้องพึ่งพา แทนที่จะดาวน์โหลด Library แต่ละตัวด้วยตนเอง คุณเพียงแค่ระบุชื่อและ Version ใน composer.json จากนั้น Composer จะดาวน์โหลดและจัดการ Dependency ทั้งหมดให้อัตโนมัติ

Composer ใช้กันแพร่หลายในทุก PHP Framework สมัยใหม่: Laravel, Symfony, Slim, CodeIgniter 4 รวมถึง WordPress Plugin และ Theme บางส่วน

ตัวอย่างไฟล์ composer.json เบื้องต้น:

{
    "require": {
        "guzzlehttp/guzzle": "^7.0",
        "vlucas/phpdotenv": "^5.0",
        "monolog/monolog": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

ตรวจสอบว่า Hosting รองรับ Composer

ก่อนลงมือ ให้ตรวจสอบว่า Hosting มีสิ่งที่จำเป็นครบ:

# ตรวจสอบว่ามี SSH Access (ต้องล็อกอิน SSH ก่อน)
ssh [email protected]

# ตรวจสอบ PHP Version (ต้องเป็น 7.2 ขึ้นไป)
php --version

# ตรวจสอบ Memory Limit ของ PHP CLI
php -r "echo ini_get('memory_limit');"

# ตรวจสอบว่ามี Composer ติดตั้งไว้แล้วหรือไม่
which composer
composer --version
หมายเหตุ: Shared Hosting บางรายติดตั้ง Composer ไว้ให้แล้ว ลองรัน composer --version ดูก่อน ถ้าได้ Version ออกมาแสดงว่าใช้ได้เลย

ติดตั้ง Composer ผ่าน SSH

ถ้า Hosting ยังไม่มี Composer ให้ดาวน์โหลดและติดตั้งใน Home Directory:

# ดาวน์โหลด Composer Installer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# ตรวจสอบ Checksum (แทนที่ HASH ด้วยค่าล่าสุดจาก getcomposer.org)
php -r "if (hash_file('sha384', 'composer-setup.php') === 'HASH') { echo 'Verified'; } else { echo 'Error'; }"

# ติดตั้ง Composer ใน ~/bin/ (ไม่ต้องใช้ sudo)
mkdir -p ~/bin
php composer-setup.php --install-dir=$HOME/bin --filename=composer

# ลบไฟล์ Installer
php -r "unlink('composer-setup.php');"

# ทดสอบ
~/bin/composer --version

เพิ่ม PATH ใน ~/.bashrc หรือ ~/.bash_profile เพื่อใช้คำสั่ง composer ได้โดยตรง:

export PATH="$HOME/bin:$PATH"

ติดตั้ง Composer ผ่าน cPanel Terminal

cPanel เวอร์ชันใหม่ (86+) มี Terminal ในตัว ไปที่ cPanel > Advanced > Terminal แล้วรันคำสั่งเดียวกับ SSH ข้างต้น

รัน composer install

# ไปยัง Directory ของโปรเจกต์
cd ~/public_html/myproject

# ติดตั้ง Dependencies ตาม composer.json
composer install

# ถ้า Memory ไม่พอ เพิ่ม Memory Limit ชั่วคราว
COMPOSER_MEMORY_LIMIT=-1 composer install

# สำหรับ Production (ไม่ดาวน์โหลด Dev Dependencies)
composer install --no-dev --optimize-autoloader

# อัปเดต Dependencies
composer update

Autoload — วิธีใช้ใน PHP Script

หลัง composer install เสร็จ ใช้ Autoload ใน PHP ได้ทันที:

<?php
require __DIR__ . '/vendor/autoload.php';

// ใช้ Library ที่ติดตั้งมาได้เลย
use GuzzleHttp\Client;

$client = new Client();
$response = $client->get('https://api.example.com/data');
echo $response->getBody();
?>

ปัญหา Memory Limit บน Shared Hosting

Shared Hosting มักตั้ง Memory Limit ต่ำ (128 MB หรือ 256 MB) ซึ่งอาจไม่พอสำหรับ Composer ที่ต้องการ Memory มากในขณะ Resolve Dependencies:

# วิธีแก้ 1: ใช้ COMPOSER_MEMORY_LIMIT=-1 (ไม่จำกัด)
COMPOSER_MEMORY_LIMIT=-1 composer install

# วิธีแก้ 2: เพิ่ม Memory ใน php.ini ของ CLI
php -d memory_limit=-1 ~/bin/composer install

# วิธีแก้ 3: รัน composer ในเครื่องตัวเองแล้ว Upload vendor/
# (วิธีนี้แนะนำสำหรับ Hosting ที่มีข้อจำกัดมาก)

Upload vendor/ ผ่าน FTP

ถ้า Hosting ไม่รองรับ SSH หรือมีข้อจำกัดมาก วิธีที่ดีที่สุดคือรัน Composer ในเครื่องตัวเองแล้ว Upload ไฟล์ขึ้น Hosting:

  1. รัน composer install ในเครื่องตัวเอง
  2. Upload โฟลเดอร์ vendor/ ทั้งหมดผ่าน FTP ไปยัง Hosting
  3. Upload composer.json และ composer.lock ด้วย
  4. ไม่ต้องรัน composer บน Hosting เลย เพราะมีไฟล์ครบแล้ว
Tip: โฟลเดอร์ vendor/ อาจมีไฟล์หลายพันไฟล์ การ Upload ผ่าน FTP อาจใช้เวลานาน ให้ Zip โฟลเดอร์ vendor/ แล้ว Upload ไฟล์ .zip เดียว จากนั้น Extract ผ่าน cPanel File Manager

ตรวจสอบว่า Composer ทำงานถูกต้อง

# ตรวจสอบว่า vendor/autoload.php มีอยู่
ls -la vendor/autoload.php

# ตรวจสอบ Package ที่ติดตั้งแล้ว
composer show

# ตรวจสอบ Dependency Tree
composer depends guzzlehttp/guzzle

# Dump Autoloader (ถ้าเพิ่ม Class ใหม่)
composer dump-autoload -o

# ตรวจสอบ Security Vulnerabilities
composer audit
Tip: ถ้า PHP Script แจ้ง "Class not found" หลัง composer install ให้รัน composer dump-autoload อีกครั้งเพื่อ Regenerate Autoload Map

แก้ปัญหาที่พบบ่อย

Error: "Your PHP version does not satisfy requirements"

Package บางตัวต้องการ PHP เวอร์ชันสูงกว่าที่ Hosting มี แก้ไขโดยเปลี่ยน PHP Version ใน cPanel > MultiPHP Manager หรือเลือก Package Version ที่รองรับ PHP เก่ากว่า เช่น "guzzlehttp/guzzle": "^6.0" แทน 7.0

Error: "Allowed memory size exhausted"

Memory ไม่พอสำหรับรัน Composer ใช้ COMPOSER_MEMORY_LIMIT=-1 composer install หรือรัน Composer ในเครื่องตัวเองแล้ว Upload vendor/ แทน

vendor/ ใหญ่มาก กิน Disk Space เกิน Quota

รัน composer install --no-dev เพื่อไม่ดาวน์โหลด Dev Dependencies เช่น PHPUnit ซึ่งไม่จำเป็นบน Production นอกจากนี้ตรวจสอบว่า Package ที่ใช้ไม่ได้ Depend อะไรที่ใหญ่เกินความจำเป็น

คำถามที่พบบ่อย

ควร Commit vendor/ เข้า Git หรือไม่?

ไม่ควร ให้ Commit เฉพาะ composer.json และ composer.lock แล้วรัน composer install บน Production Server แทน อย่างไรก็ตามสำหรับ Shared Hosting ที่ไม่มี SSH อาจจำเป็นต้อง Commit vendor/ หรือ Upload ผ่าน FTP

composer.lock คืออะไร ต้องเก็บไว้ไหม?

composer.lock บันทึก Version ที่แน่นอนของทุก Package ที่ติดตั้งอยู่ ทำให้ทุกคนในทีมและทุก Environment ได้ Version เดียวกันเสมอ ควร Commit ไว้ใน Git เสมอ และใช้ composer install (ไม่ใช่ update) บน Production

Shared Hosting VS VPS สำหรับโปรเจกต์ที่ใช้ Composer?

Shared Hosting ใช้ Composer ได้ถ้าโปรเจกต์ไม่ซับซ้อนและ Dependencies ไม่มาก แต่ถ้าโปรเจกต์ใช้ Laravel, Symfony หรือ Framework หนักๆ VPS จะเหมาะกว่ามาก เพราะควบคุม PHP Config และ Memory ได้เต็มที่