🧩 آموزش PHP و مدیریت وابستگی‌ها

آموزش نصب Composer برای PHP؛ نصب امن، دستورات مهم و رفع خطاهای رایج

Composer ابزار اصلی مدیریت پکیج‌ها و کتابخانه‌های PHP است. اگر با Laravel، Symfony، WHMCS، Magento، پروژه‌های وردپرسی حرفه‌ای یا اسکریپت‌های PHP کار می‌کنید، احتمالاً بدون Composer نمی‌توانید وابستگی‌ها را درست نصب و به‌روزرسانی کنید. در این مقاله روش نصب امن Composer، تفاوت دستورهای مهم، خطاهای رایج کاربران و چک‌لیست استفاده روی سرور را مرحله‌به‌مرحله بررسی می‌کنیم.

Composer چیست و چرا برای PHP لازم است؟

در گذشته بسیاری از پروژه‌های PHP با کپی دستی فایل‌های کتابخانه‌ها راه‌اندازی می‌شدند. این روش در پروژه‌های کوچک شاید ساده به نظر برسد، اما در پروژه‌های واقعی باعث مشکل نسخه، ناسازگاری کتابخانه‌ها، سخت شدن آپدیت و خطاهای امنیتی می‌شود. Composer این مشکل را با فایل‌های composer.json و composer.lock حل می‌کند.

فایل composer.json مشخص می‌کند پروژه به چه پکیج‌هایی نیاز دارد. فایل composer.lock نسخه دقیق پکیج‌هایی را نگه می‌دارد که قبلاً نصب و تست شده‌اند. به همین دلیل وقتی پروژه را روی سرور دیگری منتقل می‌کنید، Composer می‌تواند همان نسخه‌های تست‌شده را نصب کند و احتمال ناسازگاری را کم کند.

Composer بیشتر کجا به درد می‌خورد؟

  • نصب و راه‌اندازی پروژه‌های Laravel و Symfony.
  • مدیریت وابستگی‌های WHMCS، ماژول‌های PHP و ابزارهای توسعه.
  • نصب کتابخانه‌هایی مثل Guzzle، Monolog، PHPMailer، Intervention Image و SDKهای پرداخت یا API.
  • ساخت autoload استاندارد برای کلاس‌های PHP بدون require دستی فایل‌ها.
  • اجرای امن‌تر پروژه در production با composer.lock و نصب بدون پکیج‌های توسعه.

آیا Composer قدیمی شده؟ چه چیزهایی را نباید آموزش اصلی قرار دهیم؟

خود Composer قدیمی یا بی‌استفاده نشده است؛ هنوز یکی از ابزارهای اصلی اکوسیستم PHP است. اما بعضی روش‌ها و نسخه‌ها دیگر انتخاب خوبی برای آموزش عمومی نیستند.

مورد وضعیت پیشنهادی دلیل
Composer 2 پیشنهاد اصلی برای پروژه‌های جدید و اکثر سرورهای امروزی مسیر درست است.
Composer 2.2 LTS فقط برای PHP خیلی قدیمی وقتی پروژه مجبور است با PHP قدیمی کار کند، ممکن است لازم شود؛ اما انتخاب عمومی نیست.
Composer 1 برای پروژه جدید نه برای پروژه‌های قدیمی ممکن است هنوز دیده شود، اما نباید پایه آموزش امروز باشد.
دستور نصب با checksum ثابت برای مقاله دائمی مناسب نیست checksum نصب‌کننده تغییر می‌کند؛ بهتر است checksum به‌صورت زنده از منبع رسمی خوانده شود.
کپی composer.phar از سایت‌های ناشناس خطرناک فایل اجرایی PHP است و می‌تواند امنیت سرور را به خطر بیندازد.
–ignore-platform-reqs فقط اضطراری مشکل واقعی نسخه PHP یا افزونه‌ها را حل نمی‌کند و ممکن است پروژه بعداً خطا بدهد.

نکته مهم برای کاربران سرور

اگر هدف شما نصب Laravel، WHMCS یا یک پروژه PHP روی سرور است، اول نسخه PHP CLI و افزونه‌های PHP را درست کنید. نصب Composer به‌تنهایی کافی نیست؛ Composer باید با همان نسخه PHP اجرا شود که پروژه شما نیاز دارد.

پیش‌نیازهای نصب Composer روی سرور لینوکس

قبل از نصب، باید مطمئن شوید PHP CLI، ابزارهای دانلود و افزونه‌های رایج PHP روی سرور فعال هستند. در سرورهای کنترل‌پنل‌دار ممکن است نسخه PHP وب‌سایت با نسخه PHP خط فرمان متفاوت باشد؛ این موضوع یکی از پرتکرارترین علت‌های خطاهای Composer است.

بررسی نسخه PHP و مسیر اجرایی

php -v
which php
php -m | sort | egrep 'curl|openssl|zip|mbstring|json|phar|iconv|fileinfo' || true

نصب پیش‌نیازها در Ubuntu و Debian

apt update
apt install -y php-cli php-curl php-zip php-mbstring php-xml php-json unzip curl git

نصب پیش‌نیازها در AlmaLinux، Rocky Linux و CentOS

dnf install -y php-cli php-curl php-zip php-mbstring php-xml unzip curl git
# اگر dnf در دسترس نبود:
yum install -y php-cli php-curl php-zip php-mbstring php-xml unzip curl git

اگر روی cPanel، DirectAdmin یا CyberPanel هستید

روی سرورهای کنترل‌پنل‌دار، نصب پکیج‌های PHP با apt/dnf همیشه بهترین مسیر نیست؛ چون کنترل‌پنل ممکن است PHP را در مسیرهای جداگانه مدیریت کند. در این حالت اول مسیر PHP درست را پیدا کنید و Composer را با همان PHP اجرا کنید.

نصب Composer با SSH به روش امن

روش امن این است که نصب‌کننده Composer را از سایت رسمی دریافت کنید، checksum آن را از منبع رسمی بررسی کنید و بعد فایل composer.phar را بسازید. این روش برای مقاله‌های آموزشی ماندگار بهتر از کپی کردن checksum ثابت است.

cd /tmp
EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
  >&2 echo 'ERROR: Invalid installer checksum'
  rm -f composer-setup.php
  exit 1
fi

php composer-setup.php --quiet
rm -f composer-setup.php
php composer.phar --version

اگر خروجی نسخه Composer را دیدید، نصب محلی انجام شده است و فایل composer.phar در همان مسیر قرار دارد.

نصب Composer به صورت Global

برای اینکه بتوانید در هر مسیر فقط دستور composer را اجرا کنید، فایل composer.phar را به مسیر قابل اجرا منتقل کنید.

sudo mv /tmp/composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
composer --version

Composer را از مسیرهای ناشناس دانلود نکنید

Composer یک فایل اجرایی PHP است. اگر آن را از یک mirror ناشناس، فایل تلگرامی یا لینک غیررسمی دریافت کنید، در واقع یک فایل اجرایی را با سطح دسترسی سرور اجرا کرده‌اید. همیشه از مسیر رسمی و با بررسی checksum استفاده کنید.

دستورهای مهم Composer که هر کاربر باید بداند

دستور کاربرد درست
composer install نصب وابستگی‌ها بر اساس composer.lock؛ مناسب برای production و انتقال پروژه.
composer install –no-dev -o نصب بدون پکیج‌های توسعه و ساخت autoload بهینه برای سرور اصلی.
composer update به‌روزرسانی وابستگی‌ها و تغییر composer.lock؛ بهتر است روی محیط تست انجام شود.
composer require vendor/package افزودن یک پکیج جدید به composer.json و نصب آن.
composer remove vendor/package حذف یک پکیج از پروژه.
composer dump-autoload -o بازسازی autoload و بهینه‌سازی آن، مخصوصاً بعد از تغییر کلاس‌ها یا انتقال پروژه.
composer diagnose بررسی مشکلات رایج محیط، تنظیمات و اتصال.
composer clear-cache پاک کردن کش Composer در زمان خطاهای دانلود یا بسته‌های خراب.
composer audit بررسی آسیب‌پذیری‌های شناخته‌شده پکیج‌ها.

برای سرور production معمولاً این دستور بهتر است

composer install --no-dev --optimize-autoloader

این دستور پکیج‌های توسعه را نصب نمی‌کند و autoload را برای اجرا سریع‌تر آماده می‌کند.

مشکل چند نسخه PHP در سرور و کنترل‌پنل‌ها

یکی از رایج‌ترین مشکلات کاربران این است که سایت با PHP 8.2 اجرا می‌شود، اما Composer در SSH با PHP 7.4 یا PHP 8.0 اجرا می‌شود. نتیجه آن خطاهایی مثل ناسازگاری نسخه PHP، نبود ext-zip، ext-curl یا ext-intl است.

بررسی مسیرهای PHP

which php
php -v
ls -lah /usr/local/bin/php /usr/bin/php 2>/dev/null || true
find /usr/local -type f -name php 2>/dev/null | head -n 30

اجرای Composer با نسخه خاص PHP

# نمونه عمومی، مسیر PHP شما ممکن است متفاوت باشد
/usr/local/bin/php /usr/local/bin/composer install

# در بعضی سرورهای cPanel مسیرها شبیه این هستند
/opt/cpanel/ea-php82/root/usr/bin/php /usr/local/bin/composer install

# در بعضی سرورهای OpenLiteSpeed/CyberPanel مسیر PHP CLI می‌تواند متفاوت باشد
/usr/local/lsws/lsphp82/bin/php /usr/local/bin/composer install

اگر پروژه شما Laravel یا یک اسکریپت PHP حساس است، همیشه اول نسخه PHP CLI را با نیاز پروژه تطبیق دهید.

خطاهای رایج Composer و راه‌حل‌ها

خطای ۱: Your requirements could not be resolved to an installable set of packages

این خطا یعنی نسخه PHP، نسخه پکیج‌ها یا وابستگی‌های پروژه با هم سازگار نیستند. ابتدا نسخه PHP و محتوای composer.json را بررسی کنید.

php -v
composer why-not php 8.2 || true
composer diagnose

خطای ۲: ext-zip، ext-curl، ext-intl یا ext-mbstring نصب نیست

این خطا معمولاً یعنی افزونه موردنیاز روی همان PHP CLI که Composer با آن اجرا شده فعال نیست.

php -m | egrep 'zip|curl|intl|mbstring|xml|fileinfo' || true
php --ini

بعد از نصب افزونه، دوباره با همان PHP تست کنید. اگر چند نسخه PHP دارید، نصب افزونه روی نسخه اشتباه مشکل را حل نمی‌کند.

خطای ۳: Allowed memory size exhausted

در پروژه‌های بزرگ، حل وابستگی‌ها ممکن است حافظه بیشتری بخواهد. ابتدا علت را بررسی کنید، اما برای اجرای موقت می‌توانید محدودیت حافظه Composer را افزایش دهید.

COMPOSER_MEMORY_LIMIT=-1 composer install
# یا:
php -d memory_limit=-1 /usr/local/bin/composer install

خطای ۴: proc_open disabled یا توابع PHP غیرفعال هستند

روی برخی هاست‌ها یا سرورهای سخت‌گیرانه، توابعی مثل proc_open در php.ini غیرفعال شده‌اند. Composer برای بعضی عملیات‌ها به این توابع نیاز دارد. باید php.ini نسخه CLI بررسی شود.

php --ini
php -i | grep disable_functions

خطای ۵: The zip extension and unzip command are both missing

Composer برای دانلود و استخراج پکیج‌ها به zip extension یا دستور unzip نیاز دارد.

apt install -y unzip php-zip
# یا در AlmaLinux/Rocky:
dnf install -y unzip php-zip

خطای ۶: SSL certificate problem یا خطای CA

این خطا معمولاً از قدیمی بودن بسته‌های CA یا اختلال در TLS می‌آید. راه‌حل درست، خاموش کردن secure-http نیست؛ باید CA certificates را به‌روز کنید.

apt install -y ca-certificates
update-ca-certificates

# AlmaLinux/Rocky/CentOS
dnf install -y ca-certificates
update-ca-trust

خطای ۷: composer update سایت را خراب کرد

دستور update نسخه وابستگی‌ها و composer.lock را تغییر می‌دهد. در سرور اصلی، به‌خصوص برای Laravel، WHMCS یا فروشگاه‌های فعال، بدون بکاپ و تست اجرا نشود.

# در production معمولاً این امن‌تر است:
composer install --no-dev --optimize-autoloader

خطای ۸: اجرای Composer با root

اگر Composer را با root اجرا می‌کنید، دقت کنید مالکیت فایل‌های پروژه به هم نریزد. در پروژه‌های کاربرمحور بهتر است Composer با همان کاربر مالک فایل‌های سایت اجرا شود.

pwd
ls -ld . vendor composer.json composer.lock 2>/dev/null || true
whoami

چک‌لیست امن قبل از اجرای Composer روی پروژه واقعی

  • از فایل‌های پروژه و دیتابیس بکاپ بگیرید.
  • نسخه PHP CLI را با نیاز پروژه تطبیق دهید.
  • اگر composer.lock وجود دارد، روی سرور اصلی از composer install استفاده کنید، نه update.
  • برای production از –no-dev و –optimize-autoloader استفاده کنید.
  • بعد از نصب، سطح دسترسی و مالکیت فایل‌های vendor را بررسی کنید.
  • اگر پروژه فعال است، تغییرات را اول روی محیط تست اجرا کنید.
  • از –ignore-platform-reqs فقط وقتی استفاده کنید که دقیقاً می‌دانید چه ریسکی دارد.

سوالات متداول درباره نصب Composer برای PHP

آیا Composer برای وردپرس هم لازم است؟

برای نصب ساده وردپرس معمولاً لازم نیست، اما برای توسعه قالب و افزونه حرفه‌ای، مدیریت کتابخانه‌ها، پروژه‌های Bedrock یا ابزارهای PHP می‌تواند بسیار کاربردی باشد.

آیا Composer را باید روی هاست اشتراکی نصب کنیم؟

اگر هاست SSH و PHP CLI داشته باشد ممکن است بتوانید استفاده کنید. اما روی هاست‌های محدود، بهتر است وابستگی‌ها در محیط توسعه نصب و سپس vendor به شکل کنترل‌شده منتقل شود.

فرق composer install و composer update چیست؟

install معمولاً نسخه‌های دقیق composer.lock را نصب می‌کند و برای سرور اصلی امن‌تر است. update وابستگی‌ها را دوباره حل می‌کند و composer.lock را تغییر می‌دهد؛ بهتر است روی محیط تست انجام شود.

چرا Composer نسخه PHP اشتباه را تشخیص می‌دهد؟

چون PHP وب‌سایت و PHP خط فرمان ممکن است دو مسیر متفاوت داشته باشند. باید which php، php -v و مسیر PHP کنترل‌پنل را بررسی کنید.

آیا می‌توان Composer را بدون root نصب کرد؟

بله، می‌توان composer.phar را داخل home کاربر نگه داشت و با php composer.phar اجرا کرد. نصب global فقط برای راحتی اجرای دستور composer از همه مسیرهاست.

آیا Composer 1 هنوز لازم می‌شود؟

در پروژه‌های بسیار قدیمی ممکن است مجبور شوید موقتاً از آن استفاده کنید، اما برای آموزش عمومی و پروژه‌های جدید Composer 2 انتخاب درست‌تری است.

چرا Composer می‌گوید ext-zip یا ext-curl وجود ندارد؟

افزونه موردنیاز روی PHP CLI فعال نیست یا Composer با نسخه PHP دیگری اجرا شده است. باید افزونه را برای همان نسخه PHP نصب و فعال کنید.

جمع‌بندی

Composer هنوز یکی از ابزارهای ضروری برای پروژه‌های PHP است؛ اما روش نصب و استفاده از آن باید به‌روز، امن و متناسب با نسخه PHP سرور باشد. برای پروژه‌های جدید، Composer 2 را مبنا قرار دهید، نصب‌کننده را از منبع رسمی و با بررسی checksum اجرا کنید، روی production به‌جای update بی‌احتیاط از install بر اساس composer.lock استفاده کنید و قبل از هر تغییر مهم، نسخه PHP، افزونه‌ها و بکاپ را بررسی کنید. با رعایت همین چند اصل، بیشتر خطاهای رایج مثل ext-zip، memory limit، SSL certificate، platform requirements و خراب شدن vendor قابل پیشگیری هستند.