php_command_line_interface_tutorial_cli_refrence

ساخت CLI (خط فرمان) برای پروژه های PHP

اگه با فریمورک های مختلف مثلا لاراول (laravel) یا سیمفونی (symfony) کار کرده باشید حتما میدونید این فریمورک ها از رابط خط فرمان (command line interface) که مخفف CLI هست توسط CMD توی ویندوز یا shell توی لینوکس استفاده میکنن تا کار برنامه نویسی رو راحت تر کنن! برای مثال شما توی لاراول میتونید دستور php artisan help رو بزنید تا لیست فرمان ها بیاد! در اینجا میخوایم به شما دوستان عزیز اموزش بدیم که چجوری با استفاده از PHP برای پروژه های خودتون رابط خط فرمان یا CLI (command line interface) بسازید 😀 این رابط خط فرمان که توسط شما ساخته میشه میتونه کارهای پروژه ی شما رو اتوماسیون کنه! مثلا یه کدی بزنید فایل های کنترلر شما ساخته بشه (مثل لاراول) و یا اینکه ساختار دیتابیس تغییر کنه و یا اینکه اطلاعاتی راجب دیتابیس و یا ساختار سایت به شما بده!

ما میتونیم یه فایل PHP بسازیم و یه سری دستورات براش تعریف کنیم , حالا این دستورات رو بیایم با خط فرمان ویندوز یا لینوکس فراخوانی کنیم! نحوه ی کار رو با چندتا مثال ساده به شما دوستان عزیز اموزش میدم. برای شروع مراحل زیر رو انجام بدید:

۱-مرحله ی اول : یه فایل php بسازید (با نام دلخواه) , برای مثال من یه فایل با نام index.php توی مسیر C:/xampp/htdocs/cli/index.php میسازم , بعدش کدهای زیر رو درون این فایل قرار بدید :

بعد از اینکه دستورات بالا رو درون فایل php که ایجاد کردیم قرار دادید فایل رو ذخیره کنید.

۲-مرحله ی دوم : خط فرمان رو باز کنید , اگه ویندوز دارید توی run کلمه ی cmd رو تایپ کنید و اینتر بزنید تا باز بشه! حالا با استفاده از دستور cd به مسیر فایل index.php که در مرحله ی قبلی ایجاد کردیم میریم! و سپس با دستور php index.php فایل خودمون رو اجرا میکنیم! نتیجه به صورت تصویر زیر خواهد بود :

php_cli_tutorial_how_to_create_command_line_interfaceهمونطور که توی تصویر بالا میبینید ابتدا با دستور cd به مسیری که فایل php خودمون رو ایجاد کردیم رفتیم و سپس با استفاده از php index.php فایل خودمون رو اجرا کردیم . در اینجا index.php نام فایل ما هست! بعد از اینکه فایل رو اجرا کردیم نتیجه ی حاصل از اجرا شدن فایل توی صفحه نمایش داده شد! این دقیقا همون چیزی هست که ما echo کردیم 😀 خب تا اینجا با نحوه ی کار ساخت CLI یا command line interface اشنا شدید!

شما میتونید یک سری ارگومان (ورودی) به فایل php خودتون بفرستید و بعد از دریافت ارگومان ها توسط فایل کارهای خاصی رو انجام بدید! تعداد ارگومان هایی که به فایل ارسال میشن رو میتونید با متغیر argc دریافت کنید همچنین خود ارگومان های ارسالی رو میتونید با دستور argv دریافت کنید. به مثال زیر دقت کنید :

در دستورات بالا توی خط اول میایم یه متن رو نمایش میدیم بعدش اگه ارگومان های ارسالی تعدادش بیشتر از ۰ باشه (یعنی اگه ارگومانی ارسال شده باشه) میایم و ارگومان رو نشون میدیم. اگه ارگومانی ارسال بشه درون متغیر argv قرار میگیره. این متغیر یک ارایه هست که شامل نام فایل و ارگومان های ارسالی هست. اگه فایل بالا رو با cmd توسط دستور php index.php name=mahdi اجرا کنیم چیزی شبیه تصویر زیر خواهیم داشت :

creating_cli_using_php_tutorial_get_arguments_inputهمونطور که در تصویر بالا میبینید مقداری که به صورت ارگومان ارسال کردیم اندیس یکم ارایه ی argv قرار گرفته! ارگومان ارسالی name=mahdi هست که میتونیم اون رو به دو قسمت تقسیم کنیم! قسمت قبل از علامت = که name و قسمت بعد از علامت = که mahdi هست. میتونیم از این مقدار استفاده کنیم و یه کار خاصی رو انجام بدیم.

شما میتونید بعد از اینکه فایل php رو اجرا کردید نیز مقادیر رو دریافت کنید و یا نمایش بدید! برای این کار از دستورات fgetc برای گرفتن کاراکترها , fread برای خواندن یک خط و از fgets برای خواندن یک رشته کاراکتر (یک خط کاراکتر) استفاده میکنیم. توسط این توابع باید داده رو از ورودی خط فرمان دریافت کنیم. ورودی خط فرمان به صورت php://stdin یا ثابت STDIN است. شما با استفاده از php://stdin و یا STDIN میتونید داده ها رو از خط فرمان بخونید! همچنین برای نمایش دادن یک عبارت درون خط فرمان دیدید که از دستور echo استفاده کردیم اما میتونید از دستور fwrite نیز استفاده کنید. در این حالت برای ارسال مقدار به خط فرمان میتونید از php://stdout یا STDOUT برای ارسال داده به خروجی و از php://strerr یا STDERR برای ارسال یک عبارت به عنوان خطا (متن خطا) به خط فرمان استفاده کنید! اگه متوجه نشدید نگران نباشید , با یک مثال ساده موارد بالا رو بررسی میکنیم. به مثال زیر دقت کنید :

دستورات بالا نحوه ی کار با گرفتن ورودی بعد از استارت کردن CLI رو نمایش میدن! همچنین ارسال داده ها به خروجی و دریافت داده ها از کاربر رو با دستورات fwrite و fgetc انجام میدیم. در مثال بالا ابتدا یک ارایه برای میوه های خودمون تعریف میکنیم. بعدش لیست میوه ها رو توی صفحه نمایش میدیم و به کاربر میگیم با انتخاب یکی از کلید های a , b یا c یک میوه انتخاب کن یا اینکه کلید q رو برای خارج شدن از واسط خط فرمان بزن. در صورتی که یکی از کلید های a یا b یا c رو بزنید میوه ی انتخابی به شما نمایش داده میشود! در صورتی که کلید q رو بزنید از حلقه ی CLI خارج میشید و به cmd یا shell خود سیستم عامل برمیگردید. شکل کلی اجرای برنامه به صورت تصویر زیر خواهد بود:

php_using_cli_inputs_php_tutorialهمونطور که میبینید ابتدا با دستور php index.php فایل php خودمون رو اجرا کردیم و بعدش کلید a رو زدیم و میوه ی apple یا سیب رو انتخاب کردیم. 😀 برای خروج میتونید کلید q رو بزنید.

خب تا اینجا با دریافت ورودی ها در هنگام شروع رابط خط فرمان (argv) و بعد از اجرای خط فرمان (fgetc , fread ,fgets) اشنا شدیم. همونطور که میدونید مشکل ارایه ی argv در این است که ورودی ها رو به صورت یک رشته نمایش میده و باید خودمون ورودی ها رو از هم جدا کنیم! اما شما میتونید از کلاس Console_Getopt نیز استفاده کنید این کلاس ۳ متد استاتیک به ما ارائه میده , شما با استفاده از این متد ها میتونید ورودی ها رو در هنگام اجرا شدن برنامه کنترل کنید. متدها به صورت زیر هستند :

  • readPHPArgv : این متد کاری همانند ارایه ی argv رو انجام میده با این تفاوت که در سیستم عامل های مختلف عملکرد بهتری داره.
  • getOpt : این متد ورودی ها رو به صورت یک ارایه در اختیار ما قرار میدهد بدین صورت که اگه شما تایپ کنید user=mahdi در این صورت user کلید ارایه و mahdi مقدار خواهد بود. 😀 به همین راحتی دیگه نیازی نیست داده ها (به مثال اول این اموزش دقت کنید) تجزیه تحلیل کنید.
  • getOpt2 : این تابع دقیقا مثل تابع getOpt عمل میکند اما یک تفاوت در ارگومان های دریافتی دارد که در طول اموزش به شما دوستان عزیز توضیح میدیم.

برای اینکه بتونید از متدهای بالا استفاده کنید باید کتابخونه ی PEAR روی php شما نصب باشه همچنین باید کلاس Console_GetOpt رو داشته باشید! این کلاس رو میتونید از انتهای همین پست دانلود کنید و یا اینکه همیشه میتونید از گیتاب(کلیک کنید) اخرین ورژنش رو بگیرید. بعد از اینکه دانلودش کردید به پوشه ی console برید و فایل Getopt.php رو بردارید و به صفحه ی خودتون include کنید. بریم سراغ توضیح کامل ۳ متدی که در این کلاس وجود دارد:

کار با متد readPHPArgv : این متد دقیقا کاری مثل argv رو انجام میده. در php متغیر argv یک متغیر گلوبال یا همگانی است و تنها در بیرون از توابع قابل استفاده است یعنی اینکه اگه شما یک تابع تعریف کنید و بخواید درون اون تابع از متغیر argv استفاده کنید با خطا مواجه خواهید شد اما در همه جای برنامه میتونید از ارایه ی SERVER به صورت زیر استفاده کنید:

در دستورات بالا اومدیم ابتدا بررسی کردیم که اگه تعداد ورودی های ارسالی موجود بود و یا بیشتر از ۰ بود ورودی ها رو نمایش بدیم. شما اگه از argv و یا ارایه ی SERVER استفاده کنید  ورودی های ارسال شده به صورت یک رشته ی متنی به شما داده میشه , دستور readPHPArgv نیز دقیقا همین کار رو انجام میده با این تفاوت که در سیستم عامل های مختلف عملکرد بهتری از خودش نشون میده.

کار با متد getOpt : این متد میاد یه داده های ورودی از reaPHPArgv رو دریافت میکنه و به صورت ارایه ی کلید و مقدار به ما میده مثلا اگه شما ورودی خودتون رو به صورت password=123 وارد کنید , کلید password دارای مقدار ۱۲۳ در ارایه خواهد بود. شکل کلی این متد به صورت زیر است :

دستور بالا شکل کلی متدgetOpt که یکی از متدهای استاتیک کلاس Console_GetOpt است را نمایش میدهد. این تابع سه مقدار به عنوان پارامتر دریافت میکنه که پارامتر اول اون واجب است و دو پارامتر بعدی دلخواه هستند.

پارامتر اول همون ورودی های دریافتی از argv و یا readPHPArgv است , مقدار حاصل از argv یا readPHPArgv رو میتونیم به عنوان پارامتر اول استفاده کنیم. اما پارامتر دوم که یکی از پارامترها ی دلخواه است تنظیمات مربوط به short options یا تنظیمات کوچک رو انجام میده! حالا این تنظیمات چی هست؟ این تنظیمات میتواند دارای دو کاراکتر : به معنی واجب بودن و یا :: به معنای واجب نبودن (اپشنال بودن یا optional) است. حالا این تنظیمات : یا :: چیکار میکنن؟ اگه ارگومان دوم رو به صورت lt وارد کنید به حالت های زیر میتونید فایل php خودتون رو اجرا کنید :

هرکدوم از خطوط بالا یک حالت رو نمایش میده. حالا اگه ارگومان دوم متد getOpt به صورت :lt باشد یعنی اینکه بعد از کاراکتر t در یکی از حالت های بالا حتما باید یک کاراکتر (فضای خالی یا space کاراکتر مورد قبول نیست) به عنوان داده ی ورودی بیاید. برای مثال اگه به صورت زیر فایل php خودتون رو اجرا کنید :

پس از اجرا شدن دستور بالا مقدار ‘t’ = ‘v’ به صورت کلید = مقدار درون ارایه ی برگشتی از متد getOpt قرار میگیره (این متد بعد از اجرا شدن ورودی رو میگیره و به صورت ارایه به ما میده).

شما میتونید از :: به معنای واجب نبودن استفاده کنید یعنی اینکه مثلا اگه ارگومان دوم متد getOpt به صورت ::lt باشه کاربر میتونه بعد از کاراکتر t یک مقدار وارد کنه و یا نکنه (دلخواه).

ارگومان سوم متد getOpt مربوط به تنظیمات long options میشه . در این تنظیمات واجب بودن رو با = و دلخواه بودن رو با == نمایش میدیم و به صورت ارایه به ارگومان سوم میدیم. این تنظیمات مربوط به داده هایی میشن که با علامت های – یا — همراه هستند مثلا اگه ارگومان سوم رو به صورت زیر بدیم:

در این حالت کاربر میتونه ورودی رو به صورت php index.php –user=mahdi وارد کنه که در اینجا درون ارایه ی خروجی از متد getOpt کلید user دارای مقدار mahdi خواهد بود 😀 امیدوارم که متوجه شده باشید.

کار با متد getOpt2 : این متد دقیقا کاری مثل متد getOpt انجام میده با این تفاوت که در ارگومان اول این متد یعنی همون argv (یا readPHPArgv) درون متد getOpt در کلید ۰ از ارایه باید نام اسکریپت باشه اما در متد getOpt2 در ارگومان اول یعنی همون argv (یا readPHPArgv) درون ارایه در کلید ۰ نباید نام اسکریپت باشه. 😀 به همین راحتی.

یه نکته ای که باقی میمونه این است که برای بررسی خطاهای موجود در هنگام استفاده از کلاس  Console_GetOpt میتونید از متد استاتیک isError که درون پکیج PEAR هست استفاده کنید (PEAR::isError) , برای اینکه تمامی توضیحات داده شده رو بهتر درک کنید بیاید یه مثال بزنیم :

دستورات بالا ورودی رو دریافت میکنن و به صورت ارایه به ما نشون میدن. مثلا اگه php index.php -ltr –user=harryf –pass=secret arg1 arg2 رو اجرا کنیم مقدار چیزی که توی خط فرمان به ما نشون میده به صورت زیر خواهد بود:

حالا شما میتونید از ارایه ی بالا استفاده کنید و مقادیر رو دریافت کنید و یه کاری که مورد نظرتون است رو انجام بدید مثلا توی یه سیستم لاگین کنید یا یوزر پسوورد دیتابیس رو عوض کنید و یا…

امیدوارم که از این اموزش لذت برده باشید. مثال اخر این اموزش به همراه کلاس Console_GetOpt رو میتونید از انتهای همین اموزش دانلود کنید و مورد استفاده قرار بدید.

دوستانی که سوال یا مشکلی دارند از فرم پایین همین پست مطرح کنند تا پاسخ بگیرند. موفق و پیروز باشییییییییید.

به اشتراک بگذارید:Email this to someoneShare on FacebookTweet about this on TwitterShare on Google+Digg thisShare on LinkedInPin on PinterestShare on StumbleUponFlattr the authorShare on RedditBuffer this pageShare on TumblrPrint this pageShare on YummlyShare on VK
مثال اخر این اموزش به همراه کلاس Console_GetOpt
3.8 KiB
0 Downloads
اطلاعات بیشتر
کلاس Console Getopt
کلاس Console Getopt
Console_Getopt.zip
Version: 2016
53.6 KiB
0 Downloads
اطلاعات بیشتر

می‌خواهید دیدگاهتان را بیان کنید؟