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

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

Что же такое Zephir? Zephir — это высокоуровневый язык программирования с открытым исходным кодом для быстрого и простого создания расширения для PHP с акцентом на типы(типизированность) и безоопасность. Его синтаксис очень похож на сам PHP.
И так начнем. Для начала нам необходимо установить недостающие компоненты:
$ sudo apt-get install php5-dev 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. Пожалуйста, все замечания и поправки в ПМ.
Метки:
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 37
  • +1
    А в чем смысл-то? Зачем заменять с++, на другой, очень-очень специфический язык?
    • +1
      http://zephir-lang.com/motivation.html#if-you-are-a-c-programmer

      А если в двух словах, в Zephir не реализована работа с указателями и ручное управлением памятью, но зато можно быстрее(по сравнению с C) написать большое приложение, если вы не являетесь опытным разработчиком.
      • 0
        Ну а вообще, для людей, которые не знакомы или мало знакомы с С, но много писали на PHP — будет намного проще изучить синтаксис Zephir и написать на нём расширение.

        Ведь если подумать то получается такой простой способ защиты исходников :) И порог вхождения довольно низок и бесплатно.
        • +8
          если вы не являетесь опытным разработчиком


          Мало говнокода на самом PHP, а теперь ещё поощрять его уже на уровне расширений PHP? Куда катится мир… PHP сам по себе очень гибкий язык, но вот как раз благодаря своей гибкости, и отсутствию требований к структуре программ, а также лёгкости изучения, он и приобрёл себе репутацию основного говнокодерского языка.
          • +5
            Как показывает практика говнокода полно и на C/C++ и на Java.
            Мир не идеален.
            • 0
              Это совершенно не мешает писать на нём действительно потрясающие вещи.
              • 0
                Например :)?
                • +1
                  Алена даст
                • 0
                  Хм. Например, на РНР (в той или иной его форме) написан Фейсбук, ВК.
                  Если брать более локально, то у нас (в Казани) сервис, позволяющий отслеживать выполнение заявок по ЖКХ в риал-тайме, и действительно удобный, тоже написан на РНР. Я поковырявшись в сети, могу найти ещё пару тысяч примеров, но если вам на самом деле интересно — поищите, пожалуйста, сами.
                  • 0
                    Вы не поняли вопроса. Даю подсказку: на чём написан данный сайт?
                    • 0
                      Я извиняюсь, но какого вопроса?
                    • 0
                      Простите, но как-то ни в фейсбуке ни в ВК, ни в других сайтиках на PHP я ничего потрясающего не вижу :), поэтому и задал этот вопрос. На PHP можно сделать работающий сайт, но ИМХО, для чего-то потрясающего он не годится. Например, почти все гугловые продукты, как то Gmail, поиск, Google Wave стороны значительно более впечатляют, чем подавляющее большинство сайтов на PHP.

                      P.S. Сам пишу на PHP для хайлоад-проекта, есличо :)
                      • 0
                        Например, почти все гугловые продукты

                        Именно — «почти». Это немного не честно закрывать глаза на уг на цветном асфальте — оно от этого не перестаёт быть уг (: правда?

                        Например,… значительно более впечатляют, чем подавляющее большинство сайтов на PHP

                        Вы опять за своё (: Я повторяю, что обилие говносайтов на РНР никак не мешает писать на нём интересные и полезные вещи. Я знаю работающую ERP систему, написанную на РНР. Т.е. надеюсь, вы понимаете, что говносайтов полно на любом подходящем для этого (для сайтостроения) языке — и количество этого web-уг никак не влияет на возможности языка.

                        К слову, покопайтесь в популярных (т.е. зарабатывающих большие деньги) сервисах (на любом языке) — уверяю, вы там столько го**а найдёте, что печально станет. Поэтому не вините язык, если у кого-то не получается писать на нём шедевры.
                • 0
                  Не холивара ради.
                  Скажите, а вот вы лично сами видели упоминаемый «говнокод на php»?
                  Сходу отличите говнокод от неговнокода?
                  • 0
                    Говнокод — неэффективное и небезопасное использование языка.

                    Банальный пример:
                    if($_GET['login'] == 'admin') { ... // Показываем админ-панель\Показываем список пользователей\меняем пароль\т.п. }
                    Или
                    // $day = '29.09.2013'
                    $nextDay = date('d.m.Y', strtotime($day) + 24*60*60);
                    • 0
                      И что мешает написать так же на плюсах например? или яве? Или другом более мощном, чем php язык?
              • 0
                Разработка больших приложений на С++ может занять гораздо больше времени, по сравнению с PHP или Zephir и некоторые ошибки может быть будет сложно найти, если вы не являетесь опытным разработчиком. Zephir был разработан, чтобы быть безопасным во-первых, так как он не реализует указателей или ручное управление памятью, так что если вы программист C, вы ощутите то, что Zephir менее мощный, но более чистый, чем C. И поверьте, далеко не все знают C++ и даже из тех кто хорошо знаком с ним, мог даже и не слышать о Zend Engine.
                • +1
                  >Разработка больших приложений на С++ может занять гораздо больше времени, по сравнению с PHP
                  при достаточном опыте — не на много больше… процентов на 10-25%
                  • 0
                    Речь в статье как раз об отсутствии «достаточного опыта» в С++.
                • 0
                  команда Falcon поняла, что их продукт малорасширяем, так как мало народу знают Си,
                  по этому выдумали простой Си подобный язык, чтоб можно было просто и без боли расширить функциональность Falcon
                  • +1
                    C++ никто не заменял, его не использовали для экстеншенов.
                    Использовали C.
                    Посмотрите на проекты на этих двух языках, чтобы понять между ними разницу.
                    Потом сравните с кодом на Zephir и ответьте на свой вопрос.
                  • +2
                    ловеркейс и нэймспейс режут слух. Либо по-английски, либо нормально переведите.
                    Вообще, интересно. может попробую на досуге накатать что-нибудь
                    • +5
                      Я же попросил, не ужели так сложно?

                      P.S.S. Пожалуйста, все замечания и поправки в ПМ.
                    • +1
                      Хочу сразу предупредить о нестабильности текущей реализации Zephir, версия очень ранняя использовать созданные расширения кроме как для экспериментов не рекомендуется.

                      Сам же Zephir создан как основа для новых версий Phalcon, и разрабатывается той же командой.
                      • +1
                        Коротко и по делу, спасибо что без воды и рабочий пример!
                        • 0
                          расскажите пожалуйста как отлаживать такие расширения?
                          • 0
                            Согласно диаграмме:

                            В процессе построения расширения имеются исходники на С, по умолчанию они расположены в директории ext. А как дебажить их уж читайте документацию по gcc например, смотря какой компилятор используете.
                            • +4
                              при этом не вникая в тонкости Zend Engine, а еще лучше — не зная C++

                              Как это согласуется с вашим комментарием?
                              • –5
                                Вы хотите поспорить, придраться или вам просто скучно?
                                Во-первых это не комментарий, во-вторых .zep файл, можно получить путем преобразования php файла и процесс написания, скорее является переносом готового php кода в zep код, следовательно лучше отладить свой код, а потом переносить, ну и в-третьих товарищ boston в своем комментарии ясно написал о текущем состоянии проекта и я искренне надеюсь на то, что эта замечательная команда энтузиастов реализует и эту возможность.
                          • +3
                            Немного напоминает мой дохлый проект Toxen
                            • 0
                              Судя по описанию — классный проект, надо доделать и внедрить!
                              yeld — довольно специфичная вещь… как и eval и магик __anymore__
                              так что и без них, цены не будет вашему проекту…
                              доделайте его пожалуйста, а я смогу выступить тестером на живых проектах
                              • 0
                                да, я как раз планирую вернуться к проекту и не один
                            • 0
                              А есть у проекта примеры success-story, когда приложения на зефире реально работали быстрее, чем аналогичный код на самом PHP?
                              • 0
                                Создалось ощущение, что продукт слишком молод, чтобы иметь реальные success-story. Попробуйте: возможно вы будете автором одной такой истории (:
                              • 0
                                Сделали бы лучше HHVM обязательным и из коробки.
                                • 0
                                  $ cp -r ext/ .ext/

                                  Вот это действие совсем понятно

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.