نصب و پیکربندی Laravel با Nginx در اوبونتو 20.04

Laravel یک چارچوب منبع باز PHP است که مجموعه ای از ابزارها و منابع را برای ساخت برنامه های کاربردی مدرن PHP فراهم می کند. محبوبیت Laravel به واسطه اکوسیستم کامل ویژگی های داخلی اش ، در چند سال گذشته به سرعت در حال رشد است و بسیاری از توسعه دهندگان آن را به عنوان چارچوب انتخاب خود برای یک فرایند توسعه کارآمد پذیرفته اند.در این راهنما ، یک برنامه جدید Laravel را روی یک سرور مجازی Ubuntu 20.04 نصب و پیکربندی می کنید ، از Composer برای دانلود و مدیریت متعلقات چارچوب استفاده میکنید. پس از پایان کار ، یک برنامه آزمایشی کاربردی Laravel دارید که محتوا را از یک پایگاه داده MySQL بیرون می کشد.پیش نیازهابرای تکمیل این راهنما ، ابتدا لازم است کارهای زیر را در سرور مجازی Ubuntu 20.04 خود انجام دهید:⦁ یک کاربر Sudo ایجاد کنید و ufw را فعال کنید. برای انجام این کار ، می توانید راهنمای راه اندازی اولیه سرور مجازی در اوبونتو 20.04 را دنبال کنید.⦁ یک پشته LEMP با MySQL 8 نصب کنید. اگر هنوز این کار را انجام نداده اید ، می توانید مراحل 1 تا 3 راهنمای ما درباره نحوه نصب Nginx ، MySQL و PHP را در اوبونتو 20.04 دنبال کنید.⦁ composer را نصب کنید. برای نصب Laravel و متعلقات آن از Composer استفاده خواهیم کرد. می توانید Composer را با پیروی از راهنمای ما در مورد نحوه نصب Composer در اوبونتو 20.04 نصب کنید.مرحله 1 – نصب ماژول های PHP مورد نیازقبل از نصب Laravel ، باید چند ماژول PHP را که مورد نیاز چارچوب است ، نصب کنید. ما برای نصب ماژول های php-mbstring ، php-xml و php-bcmath از PHP استفاده می کنیم. این پسوندهای PHP پشتیبانی بیشتری را برای مقابله با رمزگذاری کاراکترها ، XML و ریاضیات دقیق ارائه می دهند.اگر اولین بار است که از apt در این بخش استفاده می کنید ، ابتدا باید دستور update را برای به روزرسانی حافظه نهان مدیر بسته اجرا کنید:⦁ $ sudo apt update⦁اکنون می توانید بسته های مورد نیاز را با این دستور نصب کنید:⦁ $ sudo apt install php-mbstring php-xml php-bcmathاکنون سیستم شما آماده اجرای نصب Laravel از طریق Composer است ، اما قبل از انجام این کار ، به یک بانک اطلاعاتی برای برنامه خود نیاز دارید.مرحله 2 – ایجاد یک بانک اطلاعاتی برای برنامهبرای نشان دادن نصب و به کارگیری ساده Laravel ، یک برنامه لیست سفر ایجاد می کنیم تا لیستی از مکانهایی را که کاربر می خواهد به آن سفر کند و لیستی از مکانهایی که قبلاً بازدید کرده است ، نشان دهیم. این کار می تواند در یک جدول places ساده با یک فیلد برای مکان هایی که نام را قرار میدهیم و یک فیلد دیگر برای ذخیره آنها به عنوان بازدید شده یا بازدید نشده ذخیره شود ، که ما آن را بازدید شده مینامیم. علاوه بر این ، ما یک فیلد id برای شناسایی منحصر به فرد هر ورودی وارد خواهیم کرد.برای اتصال به بانک اطلاعاتی از برنامه Laravel ، یک کاربر اختصاصی MySQL ایجاد خواهیم کرد و به این کاربر امتیازات کاملی نسبت به بانک اطلاعاتی travellist اعطا می کنیم.در زمان نوشتن این مقاله، باینری MySQL PHP یعنی mysqlnd از caching_sha2_authentication، روش تایید هویت پیش فرض برای MySQL 8 پشتیابی نمیکند. لازم است کاربر دیتابیس را با روش احراز هویت mysql_native_password تنظیم کنیم تا بتوانیم از PHP به پایگاه داده MySQL متصل شویم.برای شروع کار ، با دستور زیر به عنوان کاربر اصلی پایگاه داده به کنسول MySQL وارد شوید:⦁ $ sudo mysql⦁برای ایجاد یک پایگاه داده جدید ، دستور زیر را از کنسول MySQL خود اجرا کنید:⦁ Mysql> CREATE DATABASE travellist;اکنون می توانید یک کاربر جدید ایجاد کنید و در پایگاه داده سفارشی که اخیراً ایجاد کرده اید ، به آنها امتیاز بدهید. در این مثال ، ما یک کاربر با نام Travelist_user و رمز عبور password ایجاد می کنیم ، اگرچه باید آن را با یک رمز عبور ایمن به انتخاب خود عوض کنید:⦁ Mysql> CREATE USER ‘travellist_user’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’;⦁اکنون باید به این کاربر روی دیتابیس travellist مجوز اعطا کنیم:⦁ Mysql> GRANT ALL ON travellist.* TO ‘travellist_user’@’%’;⦁این کار به کاربر Travelist_user امتیازات کامل نسبت به پایگاه داده Travellist می دهد ، ضمن اینکه از ایجاد یا تغییر سایر پایگاه های داده دیگر روی سرور مجازی شما جلوگیری می کند.پس از این ، از پوسته MySQL خارج شوید:⦁ Mysql> exit⦁اکنون می توانید با ورود دوباره به کنسول MySQL ، این بار با استفاده از اعتبارات کاربر سفارشی ، آزمایش کنید که آیا کاربر جدید دارای مجوزهای مناسب است:⦁ $ mysql -u travellist_user -p⦁در این دستور ، به پرچم -p دقت کنید ، که پسورد استفاده شده هنگام ایجاد کاربر travel_userرا از شما میخواهد. پس از ورود به کنسول MySQL ، تأیید کنید که به بانک اطلاعاتی Travellist دسترسی دارید:⦁ Mysql> SHOW DATABASES;⦁خروجی زیر را به شما می دهد:Output+——————–+| Database |+——————–+| information_schema || travellist |+——————–+2 rows in set (0.01 sec)در مرحله بعدی ، یک جدول با نام places در بانک اطلاعاتی Travellist ایجاد کنید. از کنسول MySQL عبارت زیر را اجرا کنید:⦁ Mysql> CREATE TABLE travellist.places (⦁⦁ Mysql> id INT AUTO_INCREMENT,⦁⦁ Mysql> name VARCHAR(255),⦁⦁ Mysql> visited BOOLEAN,⦁⦁ Mysql> PRIMARY KEY(id)⦁⦁ Mysql> );⦁اکنون ، جدول places را با داده های نمونه ای پر کنید:⦁ Mysql> INSERT INTO travellist.places (name, visited)⦁⦁ Mysql>VALUES (“Tokyo”, false),⦁⦁ Mysql> (“Budapest”, true),⦁⦁ Mysql> (“Nairobi”, false),⦁⦁ Mysql> (“Berlin”, true),⦁⦁ Mysql> (“Lisbon”, true),⦁⦁ Mysql> (“Denver”, false),⦁⦁ Mysql> (“Moscow”, false),⦁⦁ Mysql> (“Olso”, false),⦁⦁ Mysql> (“Rio”, true),⦁⦁ Mysql> (“Cincinnati”, false),⦁⦁ Mysql> (“Helsinki”, false);⦁⦁⦁برای اینکه تأیید کنید داده ها با موفقیت در جدول شما ذخیره شده اند ، این دستور اجرا کنید:⦁ Mysql> SELECT * FROM travellist.places;⦁خروجی مشابه این را مشاهده خواهید کرد:Output+—-+———–+———+| id | name | visited |+—-+———–+———+| 1 | Tokyo | 0 || 2 | Budapest | 1 || 3 | Nairobi | 0 || 4 | Berlin | 1 || 5 | Lisbon | 1 || 6 | Denver | 0 || 7 | Moscow | 0 || 8 | Oslo | 0 || 9 | Rio | 1 || 10 | Cincinnati| 0 || 11 | Helsinki | 0 |+—-+———–+———+11 rows in set (0.00 sec)پس از تأیید اینکه داده های معتبری در جدول آزمون خود دارید ، می توانید از کنسول MySQL خارج شوید:⦁ Mysql> exit⦁اکنون برای ایجاد برنامه و پیکربندی آن برای اتصال به پایگاه داده جدید آماده هستید.مرحله 3 – ایجاد یک برنامه جدید Laravelاکنون با استفاده از دستور composer create-project، یک برنامه جدید Laravel ایجاد خواهید کرد. این دستور Composer معمولاً برای راه اندازی برنامه های جدید بر اساس چارچوب های موجود و سیستم های مدیریت محتوا استفاده می شود.در طول این راهنما ، از Travellist به عنوان یک برنامه نمونه استفاده خواهیم کرد ، اما میتوانید این را به چیز دیگری تغییر دهید. برنامه travellist لیستی از مکانهای دریافتی از یک سرور مجازی محلی MySQL را نشان می دهد ، که قصد دارد پیکربندی اساسی Laravel را توصیف کند و تأیید کند که شما قادر به اتصال به پایگاه داده هستید.ابتدا به دیرکتوری هوم کاربر خود بروید:⦁ $ cd ~⦁دستور زیر یک دیرکتوری جدید Travellist را که شامل یک برنامه مختصر Laravel است بر اساس تنظیمات پیش فرض ایجاد می کند:⦁ $ composer create-project –prefer-dist laravel/laravel travellistخروجی مشابه این را مشاهده خواهید کرد:… OutputInstalling laravel/laravel (v5.8.17)– Installing laravel/laravel (v5.8.17): Downloading (100%)Created project in travellist> @php -r “file_exists(‘.env’) || copy(‘.env.example’, ‘.env’);”Loading composer repositories with package informationUpdating dependencies (including require-dev)Package operations: 80 installs, 0 updates, 0 removals– Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%)– Installing phpoption/phpoption (1.5.0): Downloading (100%)– Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)– Installing symfony/css-selector (v4.3.2): Downloading (100%)…پس از اتمام نصب ، به دیرکتوری برنامه دسترسی پیدا کنید و دستور artisan Laravel را اجرا کنید تا تأیید کنید که همه مؤلفه ها با موفقیت نصب شده اند:⦁ $ cd travellist⦁⦁ $ php artisanخروجی مشابه این را مشاهده خواهید کرد:OutputLaravel Framework 7.11.0Usage:command [options] [arguments]Options:-h, –help Display this help message-q, –quiet Do not output any message-V, –version Display this application version–ansi Force ANSI output–no-ansi Disable ANSI output-n, –no-interaction Do not ask any interactive question–env[=ENV] The environment the command should run under-v|vv|vvv, –verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug…این خروجی تأیید می کند که فایل های برنامه در دسترس هستند و ابزارهای خط فرمان Laravel همانطور که انتظار می رود کار می کنند. با این حال ، هنوز نیاز به پیکربندی برنامه برای تنظیم پایگاه داده و چند جزئیات دیگر داریم.مرحله 4 – پیکربندی Laravelفایل های پیکربندی Laravel در پوشه ای به نام config ، در دیرکتوری اصلی برنامه قرار دارند. علاوه بر این ، وقتی Laravel را با Composer نصب می کنید ، یک فایل محیط ایجاد می کند. این فایل شامل تنظیمات خاص برای محیط فعلی است که برنامه در آن اجرا می شود و بر مقادیر تعیین شده در فایل های پیکربندی منظم واقع در دیرکتوری پیکربندی تقدم می یابد. هر نصب بر روی یک محیط جدید نیاز به یک فایل متناسب با محیط دارد تا مواردی از قبیل تنظیمات اتصال بانک اطلاعاتی ، گزینه های اشکال زدایی ، URL برنامه را در میان موارد دیگر که ممکن است بسته به محیطی که برنامه اجرا میشود متفاوت باشد، تعریف کند.هشدار: فایل پیکربندی محیط شامل اطلاعات حساس در مورد سرور مجازی، از جمله اطلاعات پایگاه داده و کلیدهای امنیتی است. به همین دلیل ، شما هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.اکنون برای سفارشی کردن گزینه های پیکربندی محیط برنامه فعلی ، فایل .env را ویرایش خواهیم کرد.فایل .env را با استفاده از ویرایشگر خط فرمان خود انتخاب کنید. در اینجا ما از nano استفاده خواهیم کرد:⦁ $ nano .env⦁حتی اگر متغیرهای پیکربندی زیادی در این فایل وجود داشته باشد ، لازم نیست اکنون همه آنها را تنظیم کنید. لیست زیر شامل نمای کلی از متغیرهایی است که نیاز به توجه فوری دارند:⦁ APP_NAME: نام برنامه ، که برای اعلان ها و پیام ها استفاده می شود.⦁ APP_ENV: محیط برنامه فعلی.⦁ APP_KEY: برای تولید salts و hashes استفاده میشود، این کلید منحصر به فرد هنگام نصب Laravel از طریق Composer به طور خودکار ایجاد می شود ، بنابراین نیازی به تغییر آن نیست.⦁ APP_DEBUG: این که آیا اطلاعات اشکال زدایی را در سمت کلاینت نشان دهد یا خیر.⦁ APP_URL: URL پایه برای برنامه ، که برای تولید لینک های برنامه کاربردی استفاده می شود.⦁ DB_DATABASE: نام بانک اطلاعاتی⦁ DB_USERNAME: نام کاربری برای اتصال به بانک اطلاعاتی.⦁ DB_PASSWORD: رمز عبور برای اتصال به پایگاه داده.به طور پیش فرض ، این مقادیر برای یک محیط توسعه محلی که از Homestead استفاده می کند ، (یک جعبه بسته بندی شده Vagrant ارائه شده توسط Laravel ) تنظیم شده است. ما این مقادیر را تغییر خواهیم داد تا منعکس کننده تنظیمات محیط فعلی برنامه مثال ما باشد.در صورت نصب Laravel در یک محیط توسعه یا آزمایش ، می توانید گزینه APP_DEBUG را فعال کنید زیرا این کار هنگام آزمایش برنامه از یک مرورگر ، اطلاعات اشکال زدایی مهم را به شما می دهد. متغیر APP_ENV باید در این حالت روی development یا testing تنظیم شود.در صورت نصب Laravel در یک محیط تولید ، باید گزینه APP_DEBUG را غیرفعال کنید ، زیرا اطلاعات حساس کاربر نهایی را درباره برنامه شما نشان می دهد. APP_ENV در این حالت باید روی production تنظیم شود.فایل های .env زیر برنامه نمونه ما را برای development تنظیم می کند:توجه: متغیر APP_KEY حاوی یک کلید منحصر به فرد است که هنگام نصب Laravel از طریق Composer به صورت خودکار ایجاد شد. نیازی نیست این مقدار را تغییر دهید. اگر می خواهید یک کلید ایمن جدید تولید کنید ، می توانید از فرمان php artisan key:generate استفاده کنید./var/www/travellist/.envAPP_NAME=TravelListAPP_ENV=developmentAPP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPYAPP_DEBUG=trueAPP_URL=http://domain_or_IPLOG_CHANNEL=stackDB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=travellistDB_USERNAME=travellist_userDB_PASSWORD=password…متغیرهای خود را بر این اساس تنظیم کنید. وقتی ویرایش به پایان رسید ، فایل را ذخیره کنید و ببندید تا تغییرات خود را حفظ کنید. اگر از nano استفاده می کنید ، می توانید این کار را با CTRL + X انجام دهید ، سپس Y و Enter انجام دهید.برنامه Laravel شما اکنون تنظیم شده است ، اما ما هنوز باید سرور مجازی وب را پیکربندی کنیم تا بتوانیم از یک مرورگر به آن دسترسی پیدا کنیم. در مرحله بعدی ، Nginx را برای ارائه برنامه Laravel شما پیکربندی می کنیم.مرحله 5 – راه اندازی NginxLaravel را در یک پوشه محلی در دیرکتوری اصلی کاربر از راه دور شما نصب کرده ایم ، و اگرچه این کار برای محیط های محلی توسعه مناسب است ، یک سرویس توصیه شده برای سرور مجازی های وب نیست که برای اینترنت عمومی باز باشد. پوشه برنامه را به / var / www که مکان معمول برنامه های وب است که در Nginx در حال اجرا هستند منتقل می کنیم.ابتدا ، از دستور mv برای انتقال پوشه برنامه با تمام محتویات آن به / var / www / travellist استفاده کنید:⦁ $ sudo mv ~/travellist /var/www/travellist⦁حال باید به کاربر سرور مجازی وب به پوشه های storage و cache دسترسی دهیم ، یعنی جایی که Laravel فایل های تولید شده توسط برنامه را ذخیره می کند:⦁ $ sudo chown -R www-data.www-data /var/www/travellist/storage⦁⦁ $ sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cacheاکنون فایل های برنامه به ترتیب هستند ، اما برای ارائه محتوا هنوز باید پیکربندی Nginx را انجام دهیم. برای این کار ، یک فایل پیکربندی هاست مجازی جدید را در /etc/nginx/sites-available ایجاد خواهیم کرد:⦁ $ sudo nano /etc/nginx/sites-available/travellist⦁فایل پیکربندی زیر شامل تنظیمات پیشنهادی برای برنامه های Laravel در Nginx است:/etc/nginx/sites-available/travellistserver {listen 80;server_name server_domain_or_IP;root /var/www/travellist/public;add_header X-Frame-Options “SAMEORIGIN”;add_header X-XSS-Protection “1; mode=block”;add_header X-Content-Type-Options “nosniff”;index index.html index.htm index.php;charset utf-8;location / {try_files $uri $uri/ /index.php?$query_string;}location = /favicon.ico { access_log off; log_not_found off; }location = /robots.txt { access_log off; log_not_found off; }error_page 404 /index.php;location ~ \.php$ {fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;include fastcgi_params;}location ~ /\.(?!well-known).* {deny all;}}این محتوا را در فایل / etc / nginx / sites-available / travellist خود کپی کنید و در صورت لزوم مقادیر هایلایت شده را تنظیم کنید تا با پیکربندی شما مطابقت داشته باشد. پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.برای فعال کردن فایل پیکربندی میزبان مجازی جدید ، پیوندی نمادین به travellist در sites-enabled بدهید:⦁ $ sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/⦁توجه: اگر فایل میزبان مجازی دیگری دارید که قبلاً برای همان server_name استفاده شده در میزبان مجازی travellist پیکربندی شده است ، ممکن است نیاز به غیرفعال کردن تنظیمات قدیمی با حذف پیوند نمادین مربوطه در داخل /etc/nginx/sites-enabled/ داشته باشید.برای تأیید اینکه پیکربندی شامل هیچ خطای نحوی نیست ، می توانید از این دستور استفاده کنید:⦁ $ sudo nginx -t⦁باید خروجی مانند این را مشاهده کنید:Output⦁ $ nginx: the configuration file /etc/nginx/nginx.conf syntax is ok⦁⦁ $ nginx: configuration file /etc/nginx/nginx.conf test is successfulبرای اعمال تغییرات ، دوباره Nginx را با دستور زیر لود کنید:⦁ $ sudo systemctl reload nginx⦁اکنون به مرورگر خود بروید و با استفاده از نام دامنه یا آدرس IP سرور مجازی ، مطابق با دستور server_name در فایل تنظیمات خود ، به مرورگر خود بروید و به برنامه دسترسی پیدا کنید:http://server_domain_or_IPصفحه ای مانند این را مشاهده خواهید کرد:این صفحه تأیید می کند که سرور مجازی Nginx شما به درستی پیکربندی شده است تا Laravel را ارائه کند. از این مرحله ، می توانید برنامه خود را روی اسکلت ارائه شده توسط نصب پیش فرض شروع کنید.در مرحله بعدی ، مسیر اصلی برنامه را برای جستجوی داده ها در پایگاه داده با استفاده از نمای DB Laravel اصلاح خواهیم کرد.مرحله 6 – شخصی سازی صفحه اصلیبا فرض اینکه شما تاکنون تمامی مراحل این راهنما را رعایت کرده اید ، باید یک برنامه کاربردی Laravel و یک جدول بانک اطلاعاتی به نام palces داشته باشید که حاوی برخی از داده های نمونه است.اکنون مسیر اصلی برنامه را برای جستجوی پایگاه داده ویرایش می کنیم و محتویات را به نمای برنامه باز می گردانیم.فایل مسیر اصلی ، یعنی routes/web.php را باز کنید:⦁ $ nano routes/web.php⦁این فایل به طور پیش فرض با محتوای زیر ارائه می شود:routes/web.php<?php/*|————————————————————————–| Web Routes|————————————————————————–|| Here is where you can register web routes for your application. These| routes are loaded by the RouteServiceProvider within a group which| contains the “web” middleware group. Now create something great!|*/Route::get(‘/’, function () {return view(‘welcome’);});مسیرها با استفاده از روش Route::get استاتیک تعریف می شوند که یک مسیر و یک عملکرد برگشتی را به عنوان آرگومان دریافت می کند.کد زیر جایگزین عملکرد برگشتی مسیر اصلی است. با استفاده از پرچم visited برای فیلتر نتایج ، 2 جستار به دیتابیس فرستاده میشود. این کار، نتایج را به نمایی به نام travellist باز می گرداند ، که می خواهیم بعدا آن را ایجاد کنیم. این محتوا را در فایل routes/web.php خود کپی کنید و کدی را که قبلاً در آنجا قرار دارد جایگزین کنید:routes/web.php<?phpuse Illuminate\Support\Facades\DB;Route::get(‘/’, function () {$visited = DB::select(‘select * from places where visited = ?’, [1]);$togo = DB::select(‘select * from places where visited = ?’, [0]);return view(‘travellist’, [‘visited’ => $visited, ‘togo’ => $togo ] );});پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید. اکنون نمایی را ایجاد می کنیم که نتایج دیتابیس را به کاربر ارائه می دهد. یک فایل نمای جدید در داخل resources/views ایجاد کنید:⦁ $ nano resources/views/travellist.blade.php⦁الگوی زیر بر اساس متغیرهای visited و togo ، دو لیست از مکان ها ایجاد می کند. این محتوا را در فایل نمای جدید خود کپی کنید:resources/views/travellist/blade.php<html><head><title>Travel List</title></head><body><h1>My Travel Bucket List</h1><h2>Places I’d Like to Visit</h2><ul>@foreach ($togo as $newplace)<li>{{ $newplace->name }}</li>@endforeach</ul><h2>Places I’ve Already Been To</h2><ul>@foreach ($visited as $place)<li>{{ $place->name }}</li>@endforeach</ul></body></html>پس از پایان کار ، فایل را ذخیره کنید و ببندید. اکنون به مرورگر خود بروید و برنامه را مجدد لود کنید. صفحه ای را به این شکل مشاهده خواهید کرد:اکنون یک برنامه کاربردی Laravel در حال دریافت محتوا از یک پایگاه داده MySQL دارید.نتیجهدر این آموزش ، یک برنامه جدید Laravel را روی پشته LEMP (Linux ، Nginx ، MySQL و PHP) تنظیم کرده اید که روی یک سرور مجازی اوبونتو 20.04 اجرا می شود. همچنین مسیر پیش فرض خود را برای جستجوی محتوای پایگاه داده تنظیم کرده اید و نتایج را در نمای سفارشی به نمایش می گذارید.از اینجا ، می توانید مسیرها و نماهای جدیدی را برای هر صفحه دیگری که برنامه شما به آن نیاز دارد ایجاد کنید. برای اطلاعات بیشتر در مورد مسیرها ، نماها و پشتیبانی از پایگاه داده ، مطالب رسمی Laravel را بررسی کنید. اگر به استقرار تولید مشغول هستید ، باید بخش بهینه سازی را نیز به چند روش مختلف بررسی کنید تا بتوانید عملکرد برنامه خود را بهبود بخشید.