Статьи

Начало работы с разработкой расширений PHP через Zephir

В этом руководстве объясняется, как создать расширение PHP с использованием нового языка: Zephir, который похож на C и Fortran. Вы можете скачать полный исходный код с GitHub . Мы уже затронули концепцию Zephir, поэтому, если вы заинтересованы в получении широкого обзора, посмотрите наши предыдущие статьи .

Zephir можно рассматривать как гибридный язык, который позволяет вам писать код, который выглядит как PHP, но затем компилируется в нативный C, то есть вы можете создать расширение из него и получить очень эффективный код.

Установка

Для создания расширения PHP и использования Zephir вам понадобится следующее:

  • gcc> = 4.x / clang> = 3.x / vc ++ 9
  • GNU Make 3.81 или позже
  • Заголовки и инструменты разработки php
  • re2c 0,13 или позже
  • JSON-с

Инструкции по установке различаются для каждой платформы, поэтому я надеюсь, что вы будете знать, как их получить, если читаете статью с такой продвинутой темой, как эта. Для справки — я рекомендую использовать систему на основе Linux для разработки приложений Zephir.

Как только вы получите все необходимое программное обеспечение, загрузите последнюю версию Zephir с Github, затем запустите установщик Zephir, например, так:

git clone https :// github . com / phalcon / zephir cd zephir &&   ./ install - c 

Он должен быть установлен автоматически — попробуйте набрать команду zephir help . Если он не работает, добавьте каталог «bin» в переменную окружения PATH. В моем случае: /home/duythien/app/zephir/bin , вот так:

 vi $HOME/.bash_profile 

Добавьте следующую команду экспорта:

 export PATH=$PATH:/home/duythien/app/zephir/bin 

Чтобы проверить параметры нового пути и проверить установку, введите:

 echo $PATH zephir help 

Вы можете узнать об основах и синтаксисе Zephir, а также о его системе набора текста и увидеть некоторые демонстрационные сценарии на их веб-сайте .

Программирование с Zephir

Теперь мы будем использовать Zephir, чтобы переработать математическое уравнение, которое C и Fortran хорошо обрабатывают. Пример довольно эзотерический и не будет объяснен в деталях, кроме как для демонстрации силы Зефира.

Зависящее от времени уравнение Шредингера, решенное с конечной разностью

Зависящее от времени уравнение Шредингера может быть решено как неявным (большая матрица), так и явным (чехарда) методами. Я буду использовать явный метод.

Во-первых, введите следующую команду, чтобы создать каркас расширения:

 zephir init myapp 

Когда эта команда завершается, в текущем рабочем каталоге создается каталог с именем myapp. Это выглядит так:

 myapp/ |-----ext/ |-----myapp/ |-----config.json 

Внутри папки «myapp» создайте файл под названием «quant.zep» (который даст нам пространство имен Myapp\Quantum ). Скопируйте и вставьте следующий код внутри:

 namespace Myapp; class Quantum{ const PI = 3.14159265358979323846; const MAX = 751; public function Harmos(double x){ int i,j,n; var psr, psi, p2, v,paramater,fp; double dt,dx,k0,item_psr,item_psi; let dx = 0.02, k0 = 3.0*Myapp\Quantum::PI, dt = dx*dx/4.0; let paramater =[dx,k0,dt,x]; let i = 0, psr = [], psi = [], p2 = [], v = [], fp = []; let fp = fopen ("harmos.txt", "w"); if (!fp) { return false; } while i <= Myapp\Quantum::MAX{ let item_psi = sin(k0*x) / exp(x*x*2.0), item_psr = cos(k0*x) / exp(x*x*2.0); let psr[i] = [item_psr], psi[i] = [item_psi], v[i] = [5.0*x*x], x = x + dx, i++; } var tmp; let i =1, j=1,tmp=[2.0]; for n in range(0, 20000){ for i in range(1,Myapp\Quantum::MAX - 1 ){ let psr[i][3] =psr[i][0] - paramater[2]*(psi[i+1][0] + psi[i - 1][0] - tmp[0]*psi[i][0]) / (paramater[0]*paramater[0]) + paramater[2]*v[i][0]*psi[i][0], p2[i] = psr[i][0]*psr[i][4] + psi[i][0]*psi[i][0]; } for j in range(1,Myapp\Quantum::MAX - 1 ) { let psr[0][5] = 0, psr[Myapp\Quantum::MAX][6]= 0 ; let psi[j][7] = psi[j][0] + paramater[2]*(psr[j+1][8] + psr[j - 1][9] - tmp[0]*psr[j][10]) / (paramater[0]*paramater[0]) - paramater[2]*v[j][0]*psr[j][11]; } //output split if (n ==0 || n % 2000 == 0) { let i =1; while i < Myapp\Quantum::MAX - 1 { fprintf(fp, "%16.8lf %16.8lf %16.8lf \n",i*dx,n*dt,p2[i]); let i = i + 10; } fprintf(fp, "\n"); } // change new->old let j = 1; while j < Myapp\Quantum::MAX - 1 { let psi[j][0] = psi[j][12], psr[j][0] = psr[j][13]; let j++; } } return true; } } 

Мы использовали много функций PHP, таких как fopen (), sin (), fprintf () и т. Д. — не стесняйтесь изучать синтаксис. Я также приведу еще один пример. В процессе работы с платформой Phalcon PHP функция Phalcon \ Tag :: friendlyTitle () недопустима, если вы работаете на вьетнамском или немецком языках. Этот пример, намного более простой, чем приведенное выше уравнение, создает файл normalizeChars.zep . Вставьте следующий код в файл:

 namespace Myapp; class NormalizeChars{ public function trans(var s) { var replace; let replace = [ "ế" : "e", "ề" : "e", "ể" : "e", "ễ" : "e", "ệ" : "e", //--------------------------------E^ "Ế" : "e", "Ề" : "e", "Ể" : "e", "Ễ" : "e", "Ệ" : "e", //--------------------------------e "é" : "e", "è" : "e", "ẻ" : "e", "ẽ" : "e", "ẹ" : "e", "ê" : "e", //--------------------------------E "É" : "e", "È" : "e", "Ẻ" : "e", "Ẽ" : "e", "Ẹ" : "e", "Ê" : "e", //--------------------------------i "í" : "i", "ì" : "i", "ỉ" : "i", "ĩ" : "i", "ị" : "i", //--------------------------------I "Í" : "i", "Ì" : "i", "Ỉ" : "i", "Ĩ" : "i", "Ị" : "i", //--------------------------------o^ "ố" : "o", "ồ" : "o", "ổ" : "o", "ỗ" : "o", "ộ" : "o", //--------------------------------O^ "Ố" : "o", "Ồ" : "o", "Ổ" : "o", "Ô" : "o", "Ộ" : "o", //--------------------------------o* "ớ" : "o", "ờ" : "o", "ở" : "o", "ỡ" : "o", "ợ" : "o", //--------------------------------O* "Ớ" : "o", "Ờ" : "o", "Ở" : "o", "Ỡ" : "o", "Ợ" : "o", //--------------------------------u* "ứ" : "u", "ừ" : "u", "ử" : "u", "ữ" : "u", "ự" : "u", //--------------------------------U* "Ứ" : "u", "Ừ" : "u", "Ử" : "u", "Ữ" : "u", "Ự" : "u", //--------------------------------y "ý" : "y", "ỳ" : "y", "ỷ" : "y", "ỹ" : "y", "ỵ" : "y", //--------------------------------Y "Ý" : "y", "Ỳ" : "y", "Ỷ" : "y", "Ỹ" : "y", "Ỵ" : "y", //--------------------------------DD "Đ" : "d", "đ" : "d", //--------------------------------o "ó" : "o", "ò" : "o", "ỏ" : "o", "õ" : "o", "ọ" : "o", "ô" : "o", "ơ" : "o", //--------------------------------O "Ó" : "o", "Ò" : "o", "Ỏ" : "o", "Õ" : "o", "Ọ" : "o", "Ô" : "o", "Ơ" : "o", //--------------------------------u "ú" : "u", "ù" : "u", "ủ" : "u", "ũ" : "u", "ụ" : "u", "ư" : "u", //--------------------------------U "Ú" : "u", "Ù" : "u", "Ủ" : "u", "Ũ" : "u", "Ụ" : "u", "Ư" : "u", //--------------------------------a^ "ấ" : "a", "ầ" : "a", "ẩ" : "a", "ẫ" : "a", "ậ" : "a", //--------------------------------A^ "Ấ" : "a", "Ầ" : "a", "Ẩ" : "a", "Ẫ" : "a", "Ậ" : "a", //--------------------------------a( "ắ" : "a", "ằ" : "a", "ẳ" : "a", "ẵ" : "a", "ặ" : "a", //--------------------------------A( "Ắ" : "a", "Ằ" : "a", "Ẳ" : "a", "Ẵ" : "a", "Ặ" : "a", //--------------------------------A "Á" : "a", "À" : "a", "Ả" : "a", "Ã" : "a", "Ạ" : "a", "Â" : "a", "Ă" : "a", //--------------------------------a "ả" : "a", "ã" : "a", "ạ" : "a", "â" : "a", "ă" : "a", "à" : "a", "á" : "a"]; return strtr(s, replace); } } 

Теперь нам нужно сообщить Zephir, что наш проект должен быть скомпилирован и сгенерировано расширение:

 cd myapp zephir build 

При первом запуске выполняется ряд внутренних команд, производящих необходимый код и конфигурации для экспорта этого класса в расширение PHP. Если все пойдет хорошо, вы увидите следующее сообщение в конце вывода:

Компиляция …
Установка …
Расширение установлено!
Добавьте расширение = myapp.so к вашему php.ini
Не забудьте перезапустить ваш веб-сервер

Обратите внимание, что поскольку Zephir находится в зачаточном состоянии, можно столкнуться с ошибками и проблемами. В первый раз, когда я попытался скомпилировать это, это не сработало. Я попробовал следующие команды и в конце концов заставил его работать:

 zephir compile cd ext/ phpize ./configure make && sudo make install 

Последняя команда установит модуль в папку расширений PHP (в моем случае: /usr/lib/php5/20121212/ ). Последний шаг — добавить это расширение в ваш php.ini, добавив следующую строку:

 extension=/usr/lib/php5/20121212/myapp.so //or extension=myapp.so 

Перезапустите Apache, и все готово.

Протестируйте код

Теперь создайте новый файл с именем zephir.php:

 $flow = new Myapp\Quantum(); $ok = $flow->Harmos(-7.5); if ($ok == true) { echo "Write data Harmos sucess <br>"; } $normalize = new Myapp\NormalizeChars(); echo $normalize->trans("Chào mừng bạn đến Sitepoint"); 

Завершите, посетив вашу страницу zephir.php . Это должно выглядеть примерно так:

test code

Если вы склонны математически, установите gnuplot и запустите его с выводом .txt, который мы получили из нашего расширения Zephir:

 gnuplot splot './harmos.txt' wl 

Эта команда нарисует изображение, используя файл данных damaos.txt, который будет выглядеть следующим образом, подтверждая, что наше уравнение было правильно рассчитано.

harmos

Защищенный код

В некоторых случаях компиляция не приводит к значительному улучшению производительности, возможно, из-за узкого места, расположенного на границе ввода / вывода приложения (вполне вероятно), а не из-за ограничений в вычислениях или памяти. Однако компиляция кода также может принести вашему приложению некоторый уровень интеллектуальной защиты. При создании собственных двоичных файлов с Zephir вы также можете скрывать код от пользователей или клиентов — Zephir позволяет писать PHP-приложения с закрытым исходным кодом.

Вывод

Эта статья дала основное руководство о том, как создавать расширения в Zephir. Помните, Zephir был создан не для того, чтобы заменить PHP или C, а как дополнение к ним, позволяющее разработчикам рисковать компиляцией кода и статической типизацией. Zephir — это попытка соединить лучшие вещи из мира C и PHP и заставить приложения работать быстрее, и поэтому конкурирует с HHVM и Hack .

Для получения дополнительной информации о Zephir ознакомьтесь с онлайн- документацией . Вам понравилась эта статья? Дай мне знать в комментариях!