چگونه برای زبان PHP اکستنشن بنویسم؟

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

برای نوشتن اکستنشن در php یه راه قدیمی و سخت هست که از آشنایی با zend-engine میگذره و همچنین برنامه نویسی به زبان C که یه کم دنگ و فنگ داره و ممکنه حتی خیلی از تازه کارها از این کار منصرف بشن! اما راهی که میخوام در ادامه بگم زبان Zephir هستش که به آسونی میتونید باهاش آشنا بشید و فلسفه ی ساختن این زبان آسون کردن ساخت اکستنشن برای برنامه نویسانphp هستش و تا حد زیادی توابع و سینتکس این زبان شبیه به خود php بامزه ی ماست!

شمای کلی کارش هم به صورت زیره

Architect

برنامه نوشته شده به زبان zephir شما پس از بررسی و بهینه سازی به یک اکستنشن C برای php تبدیل میشه و بعد از اون هم به یک اکستنشن بومی یا همون نیتیو خودمون تبدیل میشه.

نصب کامپایلر

از اونجایی که گیک ها روی لینوکس کار میکنند پس راه نصب zephir رو روی لینوکس که از سایت مرجع عیناً برداشتم رو اینجا میذارم. میتونید از بخش Installation کمک بگیرید و پیش نیازها رو نصب کنید، و در ویندوز هم میتونید با یه مشقتی سر کانفیگ کردن ویژوال استودیو خروجی بگیرید.

پیشنیازهای سیستم:

  • gcc >= 4.x/clang >= 3.x
  • re2c 0.13 or later
  • gnu make 3.81 or later
  • autoconf 2.31 or later
  • automake 1.14 or later
  • libpcre3
  • php development headers and tools
    نترسید! اینا کلاً چیز خاصی نیستن و اگر مثلا از ابونتوی آخرین نسخه استفاده میکنید اکثرش رو خواهید داشت. اول به سیستم یه آپدیت میدیم تا حالش جا بیاد که مشکلی برامون ایجاد نکنه سر برنامه های قدیمیش و Repoهاش هم به روز بشه!
$ sudo apt-get update

نکته! همین دستورات رو در توزیع های Redhat مثل CentOs میتونید بزنید کافیه که به جای apt-get از دستور yum استفاده کنید.

خوب حالا بسته به ورژنphpتون که من اینجا 7.0 رو دارم کامپایلر زبان و پیشنیازهاش رو نصب میکنیم.

$ sudo apt-get install git gcc make php7.0 php7.0-json php7.0-dev libpcre3-dev re2c

البته اینو تذکر بدم که قبلش باید php رو روی سیستمتون داشته باشید این دستورات مربوط به نصب صرفاً رفقای زِفیر هستش

بعد از نصب پیشنیازها حالا نوبت به کلون کردن زفیر از گیتهاب هستش:

$ git clone https://github.com/phalcon/zephir

بعدشم که باید کامپایلر رو از روی سورسش نصب کنید. با دستور اول وارد پوشه ی سورس کامپایلر میشید و با دستور بعدی میگیم بهش که نصب شو!

$ cd zephir
$ ./install -c

امیدوارم هیچ ارور زبون نفهمی ندیده باشید و این مراحل رو به آسونی پشت سر گذاشته باشید. حالا چک کنیم ببینیم زفیر نصب شده!

$ zephir help

خوب اگر راهنمای استفاده چاپ شد که بهتون تبریک میگم شما الان یه اکستشن نویس زبان محبوبphp هستی :)

در ضمن اگر از Docker استفاده میکنید میتونید به راحتی از اینجا داکیومنت ایمیجش رو ببینید و یا با دستور زیر پول کنید:

docker pull phalconphp/zephir

آشنایی اولیه با سینتکس و ساخت یه پروژه ی نمونه یا همون Hello World:

تفاوت عمده ی زفیر با php در نگارش چندتا چیز ساده است:

1) تعریف متغیر قبل از استفاده از اون، یعنی اگر میخوایم از متغیر i استفاده کنیم باید ازقبل مثلاً به صورت int i; تعریفش کنیم.

2) موقع مقدار دهی به متغیرها باید از let استفاده کنیم، یعنی اگر متغیر i رو بخوایم برابر 0 قرار بدیم باید بنویسیم let i =0;

3) موقع تعریف متغیرها دیگه خبری از دلار $ معروف نیست و باید به رسم C نامگذاریها رو انجام بدید

4) اگر متغیری رو تعریف کنیم و ازش استفاده نکنیم کامپایلر بهمون اخطار میده

5) فایلهای این زبان برنامه نویسی با پسوند .zep ذخیره میشن!

البته که تفاوتهای دیگه ای هم هست ولی موارد بالا اصلی ترین اختلافات هست و برای مطالعه ی بیشتر به سایت اصلیش برید!

برنامه hello world

$ zephir init Test
$ cd Test

دستور بالا رو اجرا میکنیم تا فایلهای ابتدایی یه پروژه ایجاد بشن و اون Test که نوشتیم اسم فضای برنامه است و هر اسمی میتونه باشه! بعدش که فولدر برنامه رو با این دستور ساختید به همین نام فضای برنامه یه پوشه داخل اون هست یعنی Test/Test برای این مثالی که زدم. بعدش یه فایل همنام کلاسی که میخوام بسازم در اینجا hello.zep و داخلش مینویسیم:

namespace Test;
class Hello
{
    public static function say()
    {
        echo "Hello World!";
    }
}

تو یه پوشه بالاتر از این یعنی همون فولدر اصلی اکستنشن یه فایل هست به نام config.json اگر برنامتون نیاز به اکستنشن خاصی داره و یا دوست دارید تنظیماتش رو عوض کنید میتونید بازش کنید و تغییرش بدید.

کامپایل برنامه

در پوشه ی ریشه اکستنش کافیه این کامند رو بزنید:

$ zephir build

و صبر کنید تا کامپایل اکستنشن تموم بشه، وقتی که تموم شد یه فایل با نام test.so داخل فولدر اکستنشهای php میسازه که اگر نمیدونید کجاست میتونید داخل phpinfo(); دنبال کافیگ extension_dir بگردید.( اگر نمیخواید فایل خروجی رو کپی کنید مهم نیست بدونید اون فایل کجا ریخته میشه!) ولی باید فایل php.ini رو باز کنید و( تهش یا قسمتی که مربوط به اکستنشن هاست برای اینکه بعدا نخواهید دنبال چیزی بگردید )باید اکستنشنی که بیلد کردید رو اعلام کنید.

extension=test.so

بعد از اینکه سیو کردید نوبت اینه اگر لازمه وبسرورتون رو ریستارت کنید تا تغییرات اعمال بشه. تمام مراحلی که در این قسمت گفته شد فقط برای اولین دفعه ای که اکستنشن رو تعریف میکنید لازمه به جز ریستارت کردن وبسرور که باید بعد از هر بار بیلد اعمال بشه و اگر یه گیک باشید میدونید که با یه bash هر دو دستور رو با هم ران کنید :)

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

<?php

echo Test\Hello::say(); //Hello World

?>

اون کلاسهایی که در اکستنشن نوشتید همه جا در دسترس هستش و بدون استفاده از autoloader یا… در همه جای برنامه کار میکنه!

زفیر برای این ابداع نشده که جای C یا php رو بگیره بلکه اومده تلفیقی از مزایای این دو رو ارائه بده، فریم ورک Phalconphp این زبان رو برای توسعه فریم ورکش ساخته که کل فریم ورک فالکن به صورت کامپایل شده هست از سرعت و امکانات خوبی برخوردار هستش، که طبق یه سری تستهای نه چندان تخصصی خودم با ابزار apache abs تا 20 برابر سرعت بالاتری نسبت به فریم ورکی مثل لاراول داشت!

مزایای Zephir:

  • افزایش سرعت اجرای برنامه ، اما نه در مواقعی که الگوریتم نیاز به IO یا Memory زیاد داره!
  • کامپایل شدن که درنهایت باعث مخفی شدن کدهای شما خواهد شد بدون نیاز به انکد کردن کدها و دردسرهای ناشی از اونها

امیدوارم براتون مفید باشه منتظر فیدبک های شما هستم