...

понедельник, 23 сентября 2013 г.

[recovery mode] Расширение для PHP или все будет в Zephir'e

imageНаверное у каждого PHP разработчика (и не только PHP) есть мечта — написать своё расширение для PHP, которое по определению работает быстрее интерпретируемого кода, при этом не вникая в тонкости Zend Engine, а еще лучше — не зная C++. И вот близится тот день, когда мечта станет явью. Хочу вам рассказать об очень интересном языке программирования, который называется Zephir. Кому лень читать, проходите на сайт и следуйте инструкциям, а я расскажу о том, как написать свое расширение и о подводных камнях, которые встречаются на сием пути.



Что же такое Zephir? Zephir — это высокоуровневый язык программирования с открытым исходным кодом для быстрого и простого создания расширения для PHP с акцентом на типы(типизированность) и безоопасность. Его синтаксис очень похож на сам PHP.

И так начнем. Для начала нам необходимо установить недостающие компоненты:

$ sudo php5-dev apt-get install re2c libjson0-dev libpcre3-dev





  • php5-dev — пакет с файлами для разработки расширений

  • re2c — компилятор регулярных выражений

  • libjson0-dev — заголовки библиотеки, json-c пакета для работы с json форматом

  • libpcre3-dev — заголовки библиотеки, которая предоставляет функции для работы с регулярными выражениями




Затем сделаем клон из репозитория:

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




Версия в репозитории не всегда стабильная, я использовал commit 6eda047f512b6600cf8afc79348381c64198fcb5.

Переходим в директорию с Zephir'ом и настроим все для своего расширение. Сейчас в репозитории есть тестовое расширение «test» — оно нам мешать не будет особо.

$ cd zephir
$ cp -r ext/ .ext/
$ mkdir app




создадим класс версии нашего расширения

$ nano app/version.zep



namespace App;

class Version
{
public static function get()
{
return "0.0.1 super beta";
}
}




и подправим конфигурационный файл config.json

$ nano config.json



{"namespace":"app"}




Внимание!


  • Нэймспэйс в конфиге — это ловеркейс нэймспэйса в классе и он же имя директории с сорсами расширения.

  • Классы в расширении должны начинаться с нэймспэйса расширения (например Test\TestCase — неверно)

  • Каждый нэймспэйс должен быть представлен директорией, а класс предаставляется файлом с расширением .zep

  • Все файлы и директории расширения в ловеркейсе




Теперь настало время испробовать наше творение. Напминаю, что мы все еще находимся в корневой директории zephir. Сейчас необходимо развернуть zephir, а затем скомпилировать наше расширение.

$ sudo ./install
$ sudo ./bin/zephir compile




В результате у нас появится в директории /usr/lib/php5/20121212/ (в зависимости от версии PHP) библиотека app.so. Ее необходимо подключить к нашему PHP. Для этого сделаем следующее (пример для cli, но вы сами сможете воспроизвести эти действия и для вашего конкретного случая):

$ sudo nano /etc/php5/mods-available/app.ini




Вставим строки

; configuration for php Our Awesome App module
; priority=50
extension=app.so




И залинкуем

$ sudo ln -s ../../mods-available/app.ini /etc/php5/cli/conf.d/50-app.ini




Теперь настало время проверить наше первое расширение:

$ php -r "echo App\Version::get() . PHP_EOL;"




И мы видим эти замечательные строки:

0.0.1 super beta




Во время компиляции расширения вы можете увидеть сообщение об отсутсвующих тестах. Zephir имеет возможность запускать тесты перед компиляцией. Примеры тестов вы найдете в директории unit-tests.

P.S. Тортик настоящий

P.S.S. Пожалуйста, все замечания и поправки в ПМ.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий