Setup PHP Development Environment on WSL2


مقدمة

يفضل الكثيرون استخدام نظام التشغيل linux بديلاً عن windows خاصةً فيما يتعلق بعملية الـ Development وبناء الـ Software، ومع اهتمام شركة Microsoft مؤخراً بالـ Open Source قامت الشركة بتقديم أحد أهم التطويرات المتعلقة بـ Windows 10 وهو Windows Sublinux System أو ما يعرف اختصاراً بـ WSL.

يمكَِن WSL مستخدمى Windows من التفاعل مع Linux Terminal واستخدام معظم الـ Apps التى يمكن استخدامها من خلال Linux Terminal.

وفى هذا الشرح المبسط نستعرض كيفية استخدام WSL لبناء PHP Development Environment للحصول على مميزات كلا النظامين.

متطلبات التشغيل وتثبيت WSL2

لمعرفة مطلبات التشغيل وكيفية تثبيت WSL يمكنك مراجعة هذه الصفحة واتباع الخطوات.

تثبيت Ubuntu

قم بفتح Microsoft Store الموجود مرفقاً مع Windows 10 وابحث عن Linux من خلال مربع البحث وبعدها ستظهر لك النتائج كما موضح بالأسفل


ثم قم باختيار Ubuntu 20.04 LTS واضغط على زر Install وانتظر حتى تتم عملية التثبيت بشكل كامل.

بعد الانتهاء من عملية التثبيت يمكنك البحث عن التوزيعة التى قمت بتثبيتها من خلال Start Menu.

فى أول مره تقوم بها بفتح الـ terminal سيطلب منك انشاء مستخدم جديد وكلمة مرور وبهذا تكون قد انتهت عملية تثبيت Ubuntu.

ubuntu Update

بعد الانتهاء من تثبيت Ubuntu قم بتنفيذ الأمر الآتى لتحديث البرامج لآخر اصداراتها

sudo apt update

بعد التأكد من الانتهاء من عملية التثبيت بشكل سليم سنقوم بالبدء فى تثبيت البرامج الأخرى لبناء الـ Development Environment الخاصة بنا

تثبيت Nginx Server

لتثبيت Nginx قم بتنفيذ الأمر الآتى:

sudo apt install nginx 

قد يسألك البرنامج إن كنت تريد الاستمرار فى عملية التثبيت قم بالضغط على Enter أو ادخال حرف y ثم Enter

بعد الانتهاء من عملية التثبيت قم بتنفيذ الأمر الآتى للتأكد من تنفيذ العملية بشكل سليم

sudo service nginx status

فى حالة تم التثبيت بشكل سليم سوف ترى الجملة الآتية:

nginx is not running *

للبدء فى تشغيل Nginx قم بتنفيذ الأمر الآتى:

sudo service nginx start

وبعد التشغيل سترى الجملة الآتية:

Starting nginx nginx [ OK ] * 

للتأكد من عملية التثبيت بشكل سليم قم بفتح أحد المتصفحات لديك واذهب إلى العنوان الآتى:

http://localhost/

سنعود مره أخرى لـ Nginx حتى نقوم بشرح كيفية تسجيل المشاريع الخاصة بنا وطريقة ربطها بـ Nginx server بعد الانتهاء من تثبيت البرامج الأخرى.

تثبيت MySQL Server

للبدء فى التثبيت قم بتنفيذ الأمر الآتى:

sudo apt install mysql-server

ثم نقوم بتشغيل الـ Server لاستكمال عملية التثبيت باستخدام الأمر الآتى:

sudo service mysql start
فى حالة ظهور التحذير الآتى: su: warning: cannot change directory to /nonexistent: No such file or directory فقط قم بتجاهله

بعد ذالك قم بتنفيذ الأمر الآتى:

sudo mysql_secure_installation

هذا الأمر يستخدم لتعيين كلمة المرور للـ root user الخاص بـ MySQL Server وبعض الاعدادات الأخرى.

سيطلب منك فى البداية تفعيل Validating Passwords Plugin ولا أفضل استخدام هذه الميزة على الـ local server فقط قم بالضغط على أى زر ما عدا y للتجاهل.

قم بادخال كلمة مرور الـ root user ولبقية الخطوات قم بالموافقة عليها بادخال حرف y.

للتأكد من تثبيت MySQL بشكل سليم وبدء استخدام MySQL قم بكتابة الأمر التالى:

sudo mysql

هذا الأمر يقوم بالاتصال على السيرفر من الـ CLI ويمكنك بدء كتابة أى Query بداية من هنا.

New MySQL User

سنقوم بتسجيل user جديد بجانب الـ root الموجود مسبقاً باستخدام الـ Query الآتية:

CREATE USER 'replace-with-username'@'localhost' IDENTIFIED BY 'replace-with-password';
لا تنسى استبدال username & password فى الـ Query السابقة بالبيانات الخاصة بك.

ثم قم بمنح اليوزر الجديد الصلاحيات للتمكن من التعامل مع السيرفر

GRANT ALL PRIVILEGES ON *.* TO 'replace-with-username'@'localhost' WITH GRANT OPTION;

ثم قم بتنفيذ الـ Query الآتية:

FLUSH PRIVILEGES;

تثبيت PHP

قد تختلف الطريقة التى سنقوم بتثبيت PHP بها عن الطريقة المعتادة لتثبيتها مع Apache Server

للبدأ قم بتنفيذ الأمرين الآتيين بالتوالى:

sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php

ثم:

sudo apt update

بعد ذالك سنقوم بتثبيت PHP-FPM وهو يعتبر وسيط بين Nginx و PHP حيث لا يتوفر دعم مباشر من Nginx لملفات PHP

وللتثبيت قم بتنفيذ الأمر الآتى:

sudo apt install php8.1-fpm
الاصدار المستخدم فى هذا الشرح هو 8.1 وهو آخر اصدار متاح وقت كتابة الشرح، ويمكنك استبدال رقم الاصدار بآخر يناسبك.

قم بتأكيد عملية التثبيت بالضغط على Enter وبعد الانتهاء يمكنك الـتأكد من التثبيت بشكل سليم بتنفيذ الأمر الآتى:

sudo service php8.1-fpm status

يجب أن ترى الجملة الآتية:

* php-fpm8.1 is not running

ويمكنك أيضاً تنفيذ الأمر الآتى للتأكد من التثبيت:

php -v

هذا الأمر يقوم بطباعة الاصدار الموجود من PHP على WSL وهو 8.1 والذى يعتبر آخر اصدار من اللغة وقت كتابة هذا الشرح.

تثبيت Composer

يعتبر Composer هو الـ Dependancy Manager الرئيسى لـ PHP والخطوات التالية تشرح كيفية استخدامه

قم بتنفيذ الأمر الآتى لتثبيت الـ Extensions اللازمة:

sudo apt install php-cli unzip

بعد ذالك قم بالتوجه إلى الـ Home Directory باستخدام الأمر الآتى:

cd ~

بعد ذالك قم بتحميل ملف التثبيت الخاص بـ Composer

curl -sS https://getcomposer.org/installer -o composer-setup.php

للتأكد من صلاحية الملف الذى تم تحميله قم بتنفيذ الأوامر الآتية بالتوالى:

HASH=`curl -sS https://composer.github.io/installer.sig`
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

بعد تنفيذ الأمرين السابقين يجب أن تحصل على رسالة

Installer verified
فى حالة الحصول على رسالة خطأ قم بتكرار الخطوات السابقة

الخطوة الأخيرة للتثبيت قم بتنفيذ الأمر الآتى

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

للتأكد من عملية التثبيت بشكل صحيح قم بتنفيذ الأمر الآتى

composer

وستحصل على رسالة من composer بكيفية الاستخدام.

تثبيت NodeJs

افضل طريقة للتعامل مع nodejs على linux هى من خلال Node Version Manager أو ما يعرف اختصاراً بـ NVM

لمعرفة المزيد عن NVM من هنا

ولتثبيت NVM قم بتنفيذ الأوامر الآتية بالتوالى:

cd ~
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

لتنزيل أخر اصدار من Node و NPM قم بتنفيذ الأمر الآتى:

nvm install node

New Laravel Website

بعد اتمام الخطوات السابقة بنجاح يمكنك البدء فى بناء تطبيقات باستخدام PHP والخطوات الآتية توضح كيفية انشاء Laravel Website

يتطلب Laravel وجود بعض الـ PHP Extensions ولتثبيتها قم باستخدام الأمر الآتى:

sudo apt install libapache2-mod-php php-mbstring php-xmlrpc php-soap php-gd php-xml php-cli php-zip php-bcmath php-tokenizer php-json php-pear

ثم الأمر التالى لانشاء Directory جديد اسمه projects:

cd ~ && mkdir projects && cd projects

ولتثبيت Laravel Project قم بتنفيذ الأمر الآتى:

composer create-project laravel/laravel laravel-wsl
الأمر السابق قد يستغرق عدة دقائق انتظر حتى يتم الانتهاء.

قم بالدخول على المشروع باستخدام:

cd laravel-wsl

ثم استخدم الأمر التالى لطباعة المسار الخاص بالمشروع كاملاً حيث سنقوم باستخدامه فى الاعدادات القادمة

pwd

يجب أن يكون المسار الخاص بالمشروع كالآتى:

/home/<user>/projects/laravel-wsl

Start Required Services

حالياً يجب أن نقوم ببدء تشغيل الـ services اللتى قمنا بتثبيتها سابقاً باستخدام الأوامر التالية:

sudo service nginx start
sudo service mysql start
sudo service php8.1-fpm start

Create New Virtual Host

الغرض من استخدام الـ Virtual Host هو الدخول على الموقع باستخدام Domain وهمى مسجل فقط على الـ Local Machine الخاصة بك.

فى هذه الحالة سنقوم باستخدام laravel-wsl.test كـ Domain للدخول على المشروع الخاص بنا

لتسجيل هذا الدومين قم بفتح أى Editor فى كـ Administrator ثم فتح ملف hosts الموجود فى المسار التالى

C:\Windows\System32\drivers\etc

وقم بوضع السطر التالى فى أخر الملف

127.0.0.1 laravel-wsl.test

بعد ذالك قم ب

ربط الـ Virtual Host مع Nginx

قم بالتوجه للمسار الآتى:

cd /etc/nginx/sites-available

انشاء ملف conf جديد

sudo touch laravel-wsl.test.conf

ثم

sudo nano laravel-wsl.test.conf

قم بوضع الـ Block الآتى بداخل الملف

server {
    listen 80;
    server_name laravel-wsl.test;
    root /home/<user-name>/projects/laravel/laravel-wsl/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index 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/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

ثم الأمر التالى:

sudo ln -s /etc/nginx/sites-available/laravel-wsl.test.conf /etc/nginx/sites-enabled/laravel-wsl.test.conf

وللتأكد من الـ syntax الخاص بـ nginx يمكن من خلال الأمر التالى:

sudo nginx -t

وسوف تظهر رسالة التأكيد التالية:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

ولاستكمال العملية يجب إعادة تشغيل nginx مرة أخرى بالأمر الآتى:

sudo service nginx restart

ثم التوجه للمسار الخاص بالمشروع:

cd ~/projects/laravel/laravel-wsl

ثم تنفيذ الأوامر الآتية بالترتيب:

sudo chmod -R 777 storage/ bootstrap/cache

ثم التوجه لأى متصفح وفتح الدومين الآتى:

http://laravel-wsl.test