پیکل (PECL) خسته!
همونطور که میدونیم PECL یه ریپازیتوری (Repository) برای نصب، ارتقا، و به طور کلی مدیریت اکستنشنهای (Extensions) PHP هست که تمام امور مربوط به مدیریت (توسعه و دانلود) این اکستنشنها در سطح سیستمعامل رو در خودش میزبانی میکنه. پیکل (PECL) شامل اکستنشنهای کامپایلشدهی C هست که برای PHP توسعه و قابلاستفاده هستن. برای مثال، اگه شما نیاز داشته باشین که از امکانات CURL در پروژههای PHP خودتون استفاده کنین نیاز داریم که اکستنشن پروتوکلهای CURL برای استفادهی PHP روی سیستمعامل شما تعریف شده باشه. به طور معمول و روی یه سیستم Ubuntu اکستنشنهای PHP در مسیر /usr/lib/php/ قرار میگیرن و به طور مثال اگه ورژن PHP شما 8.0 باشه مسیر کامل اون /usr/lib/php/20200930 میشه. با نگاهی به فایلهای so، که در واقع Shared Library هستن، در این مسیر متوجه حضور نامهای آشنایی مثل apcu.so، curl.so، یا mysqli.so میشیم (اگه هم این اسامی رو نمیبینین نگران نباشین چون احتمالا هنوز نصبشون نکردین)، و میدونیم که اکثر اونها برای توسعهی یه اسکریپت ساده در PHP مورد نیاز هست. اما اگه شما نیاز به اکستنشنی دارین که تو لیست مذکور وجود نداره کمی صبر کنین چون به زودی به اون بخش هم میرسیم.
کامپوزر (Composer) تازهنفس!
از طرف دیگه، خیلی از ما به عنوان توسعهدهندهی PHP خیلی بیشتر با Composer آشنا هستیم و میدونیم Composer ابزاری برای مدیریت وابستگیها درPHP هست. به طور دقیقتر، Composer برای هر پروژهی PHP ساختاری رو ایجاد میکنه که وابستگیهای اون پروژه به دیگر پروژههای از پیشنوشتهشده با PHP که مورد نیاز پروژهی فعلی هستن رو مدیریت و ساختاربندی میکنه. البته میدونیم که خلاصهای از هر آنچه کامپوزر قرار هست مدیریت کنه رو در فایل composer.json در root پروژه میتونیم مشاهده کنیم، که شامل تنظیمات خیلی زیاد و ساختار به شدت مدرنتری نسبت به PECL هست. با پوشهی vendor هم در پروژههای مثلا Laravel یا Symfony آشنا هستیم. هر آنچه در این پوشه وجود داره شامل کتابخانههایی هستن که توسط Composer برای استفاده در پروژهی فعلی PHPمون مدیریت میشن. و البته میدونیم که Composer اونها رو در سطح پروژه مدیریت میکنه و هیچچیز خارج از اسکوپ پروژه و یا به طور global در سطح سیستم قابل کنترل نیست.
الان تفاوت PECL و Composer رو به طور خیلی خلاصه میدونیم!
تا اینجا خیلی کلی بخوایم بگیم میدونیم PECL برای مدیریت اکستنشنهای C برای استفاده در PHP در سطح سیستم عامله و Composer برای مدیریت وابستگیهای نوشتهشده به زبان PHP در پروژه PHP فعلیمون و در اسکوپ فعلی. این رو میدونیم که ماهیت ایجاد هر کدوم از این دو مختص وجودیت خودشون هستن، و کاری که برای ما انجام میدن کاملا از هم متفاوت هستن و با هم تداخل (overlap) ندارن.
بریم برای یه مثال واقعی! gRPC!
در خیلی از موارد در نصب و استفاده از خیلی از کتابخونههای PHP دچار مشکلاتی میشیم که به طور خلاصه و مشخص من یکی از وابستگیها رو برای نصب انتخاب کردم که نیاز به استفادهی هم PECL و هم Composer داره، و اون پکیج gRPC برای استفاده از امکانات RPC تحت پروتوکلهای Google هست. gRPC یه فریموورک (Framework) متنباز (Open Source) و مدرن برای استفاده از امکانات Remote Procedure Call هست که در تقریبا در هر پلتفرمی قابل استفاده هست. gRPC میتونه سرویسهای شما در دیتاسنترهای مختلف رو با پشتیبانی از Load Balancing و Tracing و احراز هویت به طور موثری متصل کنه، و وظیفهی ارتباط میون اونها رو به طور کامل به عهده بگیره. برای استفاده از امکانات این سرویس نیاز داریم که Extension مربوط به gRPC برای استفاده در PHP رو روی سیستم مورد نظرمون نصب کنیم. من از سیستم عامل 20.04 Ubuntu و PHP 8.0 استفاده می کنم، پس اگه از macOS یا توزیعهای دیگهی Linux استفاده میکنین دنبال دستورهای مشابه باشین.
ابتدا خود PECL رو باید نصب کنیم که به راحتی با دستور زیر و از طریق ابزار توسعه PHP و PEAR انجام میشه:
sudo apt-get install php-dev php-pear
نکتهی اصلی در مورد اکستنشنهایی مثل gRPC اینه که شما دقیقا باید همون ورژنی رو تحت PECL نصب کنین که قرار هست در Composer اون رو نصب و ازش استفاده کنین. برای مثال اگه قرار هست از ورژن 1.42.0 سرویس gRPC (که در زمان نوشتن این مقاله آخرین نسخه Stable از gRPC هست) رو استفاده کنین حتما به طور خاص در نصب PECL اون رو ذکر کنید. و همینطور اگه قرار هست تو پروژه فعلی که میخواین توسعه بدین از ورژن 8.0 برای PHP استفاده کنین این رو هم حتما در نصب gRPC توسط PECL ذکر کنید. به طور خلاصه:
sudo pecl -d php_suffix=8.0 install grpc-1.42.0
با دستور بالا و همونطور که گفته شد در کنار نصب اکستنشن gRPC از دو نکتهی دیگه هم اطمینان حاصل میکنیم. مورد اول اینکه اکستنشن gRPC رو به طور مشخص برای PHP 8.0 در سطح سیستم عامل نصب میکنیم و مورد دوم اینکه از ورژن مشخص 1.42.0 این اکستنشن که به C کامپایل شده قرار هست برای پروژههای PHPمون استفاده کنیم. بعد از اجرای موفقیتآمیز این دستور، اول باید مطمئن بشیم که فایل so مربوط (grpc.so) در مسیر /usr/lib/php/20200930 ایجاد شده. همونطور که قبلا هم گفته شد این مسیر مختص اکستنشنهای ورژن مشخص 8.0 برای اسکریپتهای PHP هست. و مسالهی بعدی ارجاعدادن مسیر این فایل به PHP برای مطلعبودن PHP از مسیر این اکستنشن هست. بنابرین وارد فایل php.ini ورژن مربوط میشیم (/etc/php/8.0/cli/php.ini) و عبارت extension=grpc.so رو به این فایل اضافه میکنیم. تمام کاری که برای مطلع کردن PHP از اکستنشن مربوطه باید انجام میدادیم همین بود.
تو مرحلهی بعد باید کامپوزر رو هم آپدیت کنیم و وابستگی (Dependency) مربوط به gRPC رو اونجا هم نصب کنیم. در مسیر روت (Root) پروژه قرار میگیریم و دستور زیر رو اجرا میکنیم:
composer require grpc/grpc:1.42.0
همونطور که مشخصه داریم به کامپوزر تاکید میکنیم که پکیج gRPC با ورژن مشخصی که قبلا اکستنشن اون رو در PECL نصب کردیم رو برای ما نصب کن. همینطور باید حواسمون باشه که کامپوزر پروژه فعلیمون داره از PHP 8.0 استفاده میکنه.
جزییات بیشتری هم بود!
این تمام کاری بود که برای ایجاد هماهنگی بین PECL و Composer برای استفاده از یه کتابخونه در دنیای واقعی PHP به اون نیاز داشتیم. شما الان به راحتی میتونید از امکانات gRPC در پروژههاتون استفاده کنید!البته جزئیات دیگهای هم وجود داشت از قبیل اینکه شما پیش از این باید Composer رو نصب کنید، و اون رو پیکربندی کنید، و همینطور اینکه برای استفاده از gRPC نیاز داریم از پروتوکل ارتباطی protobuf استفاده کنیم که نصب اون مشابه gRPC هست که با توجه به توضیحات داده شده اونا رو به خودتون واگذار میکنم. در این مقاله بیشتر سعی شد ارتباط دقیق و حساس بین PECL و Composer برای استفاده از کتابخونهها مورد برررسی قرار داده بشه.