Недавно мы опубликовали мастер для VisualStudio, с помощью которого можно создать расширение за пару кликов мышкой.
Теперь с его помощью напишем наши первые два расширения: «Привет, мир» и «вытащить иконку из exe».
Сразу извиняюсь, что очень сильно задержал статью, но жизненные обстоятельства вынудили меня это сделать, но они крайне уважительны.
Итак, начнем.
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 и создайте новый проект.
И введите его название.
Не нужно настраивать пути ;)
После этого видим главное окно студии и смотрим, что в файлах.
4. Создайте функции.
Как уже отмечалось, скелет полностью создан, осталось только написать функции и зарегистрировать их.
В проекте есть тестовая функция, раскомментируем ее.
Для справки: 1) Заголовок функции должен находиться в файле h. В форме PHP_FUNCTION(имя_функции).
2) Определение - в файле c. 3) Функция должна быть записана в function_entry test_functions в файле c. В форме PHP_FE(имя_функции, NULL).
Как написать саму функцию, я расскажу вам позже.
Пока ограничимся этим:
5. Сборка и запуск.PHP_FUNCTION(hello_world) { RETURN_STRING("Hello World", 1); }
Собираем в релиз.
Собрались.
Создайте каталог 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 со строкой и запустите его в консоли.
6. Создание расширенных функций.
Давайте разберемся, как брать значения из функций и передавать их.
Сложность в том, что функция принимает и возвращает разные значения разных типов.
Давайте рассмотрим пример, который принимает строку и целое число и возвращает строку.
Как видите, здесь используются следующие структуры: zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, строка_формата, адреса_для_полученных_значений) ВОЗВРАЩАТЬСЯ_*; Давайте посмотрим на две таблицы: первая показывает принятые типы PHP и соответствующие форматы и типы C. Во втором — возвращаемые значения с соответствующими конструкциями.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(); }
Чтобы вас не беспокоить, прилагаю фотографии таблиц из книги, которую советую прочитать всем.
Еще раз посмотрите на примеры выше и поймете, насколько все просто.
Кстати, хотелось бы обратить ваше внимание на то, что выделение памяти осуществляется через электронные аналоги функций 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
-
Геймификация В Продукте
19 Oct, 24 -
Cisco Cli В Bash
19 Oct, 24