Php-Модуль Прост

Недавно мы опубликовали мастер для VisualStudio, с помощью которого можно создать расширение за пару кликов мышкой.

Теперь с его помощью напишем наши первые два расширения: «Привет, мир» и «вытащить иконку из exe».

Сразу извиняюсь, что очень сильно задержал статью, но жизненные обстоятельства вынудили меня это сделать, но они крайне уважительны.



PHP-модуль прост



PHP-модуль прост

Итак, начнем.

1. Скачайте «мастер» для VS 2008. По ссылке из темы Мастер VS: расширение PHP Давайте установим его, это произойдет автоматически.

2. Скачайте необходимые для сборки файлы.

Все, что вам нужно, это исходники и двоичные файлы PHP. Загрузите версию 5.2.11 обоих файлов.

Разархивируйте php-5.2.11-Win32.zip в C:\PHPDEV\php-5.2.11-Win32 и php-5.2.11.tar.bz2 в C:\PHPDEV\php-5.2.11. 3. Запустите VS и создайте новый проект.

PHP-модуль прост

И введите его название.

Не нужно настраивать пути ;)

PHP-модуль прост

После этого видим главное окно студии и смотрим, что в файлах.



PHP-модуль прост

4. Создайте функции.

Как уже отмечалось, скелет полностью создан, осталось только написать функции и зарегистрировать их.

В проекте есть тестовая функция, раскомментируем ее.

Для справки: 1) Заголовок функции должен находиться в файле h. В форме PHP_FUNCTION(имя_функции).

2) Определение - в файле c. 3) Функция должна быть записана в function_entry test_functions в файле c. В форме PHP_FE(имя_функции, NULL).

Как написать саму функцию, я расскажу вам позже.

Пока ограничимся этим:

 PHP_FUNCTION(hello_world) {
     RETURN_STRING("Hello World", 1);
 }
5. Сборка и запуск.

Собираем в релиз.

Собрались.

Создайте каталог C:\PHPDEV\test. Скопируйте туда php.exe и php5ts.dll. Скопируйте собранную dll под именем test.dll. Создайте php.ini:

 PHP_FUNCTION(foo) {
     char* input;
     int inputLength;
     long multy;
     char* result;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &input, &inputLength, &multy)) {
         return;
     }
     result = (char*) emalloc(strlen(input) + sizeof(long) + 3);
     sprintf(result, "%s, %ld", input, multy);
     RETURN_STRING(result, 1);
 }
Создайте test.php со строкой и запустите его в консоли.



PHP-модуль прост

6. Создание расширенных функций.

Давайте разберемся, как брать значения из функций и передавать их.

Сложность в том, что функция принимает и возвращает разные значения разных типов.

Давайте рассмотрим пример, который принимает строку и целое число и возвращает строку.

 PHP_FUNCTION(extract_ico) {
     char *filename;
     char *filenameOut;
     int len1, len2;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &filename, &len1, &filenameOut, &len2)) {
         return;
     }
     _extract_ico(filename, filenameOut);
     RETURN_NULL();
 }
Как видите, здесь используются следующие структуры: zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, строка_формата, адреса_для_полученных_значений) ВОЗВРАЩАТЬСЯ_*; Давайте посмотрим на две таблицы: первая показывает принятые типы PHP и соответствующие форматы и типы C. Во втором — возвращаемые значения с соответствующими конструкциями.

Чтобы вас не беспокоить, прилагаю фотографии таблиц из книги, которую советую прочитать всем.



PHP-модуль прост



PHP-модуль прост

Еще раз посмотрите на примеры выше и поймете, насколько все просто.

Кстати, хотелось бы обратить ваше внимание на то, что выделение памяти осуществляется через электронные аналоги функций c (emalloc, efree, erealloc), это необходимо для того, чтобы PHP GC мог себя «очистить».

.

7. Полезный пример.

Вытащим иконку из exe. Конечно, вы можете написать это на PHP, но это будет больше работы.

И вот необходимые заголовки у нас уже есть.

Напишем код на C (написал bl4de): В файле пе.

ч.

мы видим использование кусков кода из библиотек Windows: они нам помогут, но подключить их напрямую невозможно, мы же пишем кроссплатформенное расширение, да? ;) В пе.

ц.

Мы пишем код. Как понятно, мы обернем функцию void _extract_ico(char *filename, char *filenameOut).



extension_dir = .

extension = test.dll

Ничего сложного, как видим.

Просто и понятно.

Вот какие файлы у нас получились: php_ico.c И php_ico.h .

8. Бонус: сборка для *nix Бонусом является наличие файла config.m4, поэтому для сборки вам достаточно выполнить ряд команд: phpize .

/настроить делать Естественно, в системе должны быть соответствующие пакеты.

Для сервера Ubuntu 9.10 это делается так:

sudo apt-get install build-essential php5 php5-dev

Берем собранную so-библиотеку и добавляем ее в расширения.

Готовый.

Да, *nix гораздо удобнее для веб-программиста; среди моих друзей есть смешанная группа пользователей Windows. Многие предпочитают Ubuntu или Mac =) 9. Литература и полезные ссылки.

1) Джордж Шлосснагл.

Профессиональное программирование на PHP. Вы можете купить его на книги.

ру , ИМХО это самый дешевый из популярных магазинов.

Если вы хотите меня поддержать, то нажмите эта ссылка =) 2) Написание расширений, часть I: Введение в PHP и Zend 3) PHP: внутреннее устройство: windows [PHP Wiki] P.S. И в следующий раз я расскажу вам, как интегрировать PHP в ваше приложение на C/C++.

Но я не буду обещать, что это будет «на днях».

Теги: #php #расширение #C++ #php

Вместе с данным постом часто просматривают: