Меню Рубрики

Установка расширения для php скриптов

Создание PHP расширения

Есть две основные причины для написания расширения для PHP :

  • Необходимо сделать обвязку к системной С/С++ библиотеке, чтобы использовать ее функционал в PHP сценариях
  • Необходимо оптимизировать существующий код написанный на PHP, увеличив его производительность

Создадим простое расширение, реализующие три простые функции, доступные в пользовательском пространстве.

Примеры кода, которые будут приведены в данном посте будут работать с PHP 5.3.x — 5.5.x. Скорее всего они будут работать с более поздними версиями.

Для создания расширения нам понадобится:

  • машина с ОС Linux (виртуальная или физическая) с установленными пакетами:
    • PHP >= 5.3
    • apache
    • набор компиляторов gcc или clang
    • m4
    • autoconf
    • automake
    • make
    • configure
    • php5-dev (php5-devel)
  • исходные тексты PHP
  • знание языка C

Создание скелета расширения

Начнем с создания скелета нашего расширения, воспользуемся для этого скриптом ext_skel . Данный скрипт есть в исходных текстах PHP . Скрипт создаст необходимые файлы, скелеты наших функций и функции относящиеся к жизненному циклу расширения PHP . Все это можно сделать и вручную, не прибегая к помощи скрипта, но этот процесс немного утомительный.

В системе у меня установлен PHP версии 5.4.x, используем исходные тексты соответствующей версии:

Все расширения находятся в подкаталоге ext каталога с исходными текстами. Каждое расширение имеет свой собственный подкаталог. Cкрипт ext_skel также находится в каталоге ext .

Переходим в каталог с расширениями:

Использование скрипта ext_skel :

Нас интересуют два аргумента: —extname и —proto . С помощью первого аргумента указывается название расширения, с помощью второго — файл с прототипом публичных функций, которые будет реализовывать расширение и которые будут доступны в пользовательском пространстве PHP .

Создадим файл с прототипами функций:

Каждая функция в файле — одна строка. Пример описания функции:

При описание функции мы указываем:

  • тип возвращаемых данных, если функция возвращает в пользовательское пространство PHP какие-либо данные. Указанный тип никак не влияет на генерируемый C код и используется при генерации описания функции и создании документации;
  • название функции;

если у функции есть аргументы, то:

  • тип данных,
  • название аргумента
  • при необходимости значение по умолчанию.

Аргументы мы можем указать как необязательные. Для этого их необходимо обрамить скобками [ ] . Типы данных — это PHP типы, такие как int, bool, array, float и т.д.

Формат: [тип_возвращаемых_данных] название_функции(тип_данных название_аргумента [=значение_по_умолчанию] [,необязательный_аргумент_1 [, необязательный_аргумент_2]])

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

Итак опишем функции нашего расширения, открываем в текстовом редакторе файл test_extension.def и опишем три функции:

Структура расширения

После того как скрипт отработает, у нас в каталоге ext появится директория, название которой совпадает с нашим расширением, в нашем случае — test_extension . Каталог расширения будет содержать как минимум следующие файлы:

  • config.m4 — файл конфигурации для систем сборки используемый на nix системах. Данный файл говорит системе сборки какие опции конфигурации(сборки) поддерживает расширение, какие внешние библиотеки и заголовочные файлы требуются для сборки, какие исходные файлы должны быть скомпилированы как часть расшиерния. Файл написан с использованием синтаксиса GNU Autoconf
  • config.w32 — файл конфигурации для систем сборки используемый на windows системах. Назначение такое же как и у файла config.m4
  • php_test_extension.h — заголовочный файл расширения, по соглашению, название файла — название расширения + префикс php_ . Назначение такое же как и любого заголовочного файла. Файл обычно содержит дополнительные макросы, прототипы функций, глобальные переменные и т.д.
  • test_extension.c — основной файл, содержит код расширения: декларацию структур, декларацию ini записей, реализацию функций и классов пользовательского пространства, функции относящиеся к жизненному циклу расширения и др.
  • test_extension.php — PHP скрипт для проверки расширения после сборки и установки. Скрипт выводит список всех функций расширения
Читайте также:  Установка регистрационного знака в рамку

Помимо указанных файлов в каталоге расширения будут еще и другие файлы: .svnignore , EXPERIMENTAL , CREDITS и каталог с тестами tests . Эти файлы пока нас не интересуют

Файла config.m4

Откроем и отредактируем файл config.m4 . Так как у нас простое расширение, которое не требует внешних библиотек и заголовочных файлов, то достаточно добавить поддержку опции —enable-test_extension . В файле config.m4 найдем и расскоментируем следующие строки:

комментарий начинается с dnl :

Файла php_test_extension.h

Далее откроем и посмотрим код файла php_test_extension.h :

В самом начале объявляется переменная test_extension_module_entry с типом zend_module_entry . zend_module_entry — это структура описывающая расширение. К ней вернемся чуть позже.

Следом за переменной test_extension_module_entry объявляется указатель на эту переменную: phpext_test_extension_ptr

Затем объявляется константа PHP_TEST_EXTENSION_API значение которой зависит от платформы. Данная константа используется для экспорта функций.

Если объявлена переменная ZTS , то происходит подключение заголовочного файла TSRM.h . ZTS — Zend Thread Safety, о мультипоточности поговорим в следующий раз.

Далее идет объявление прототипов функций. Сначала идут прототипы функций относящиеся к жизненному циклу расширения:

PHP_*_FUNCTION — это макросы препроцессора, с их помощью будут созданы правильные прототипы, включающие нужные аргументы. В макросы передается название расширения. Так, например, на стадии препроцессора объявление PHP_MINIT_FUNCTION(test_extension) будет развернуто в:

Более подробнее о жизненом цикле расширения в следующем посте (я надеюсь :))

После объявления функций жизненного цикла идет объявление функций расширения, функции, которые будут доступны в пользовательском пространстве PHP :

Функции объявляются с помощью макроса PHP_FUNCTION , в макрос передается название функции, под этим названием функция будет видна в пользовательском пространстве.

Вы наверное обратили внимание на объявление функции confirm_test_extension_compiled , это функция проверки расширения, которую создал скрипт ext_skel . Эту функцию можно смело удалить.

Для примера, объявление PHP_FUNCTION(test_funct1) будет развернуто при сборке в:

Все функции, конечно, можно описать и без использования макросов, но если API расширений изменится в будущих версиях, например, изменятся аргументы функций, то наш модуль перестанет собираться. Поэтому всегда используйте макросы, предоставляемые PHP API для объявления функций.

Оставшийся код в файле php_test_extension.h пока рассматривать не будем, этот код относится к глобальным переменным и мультипоточности

Файл test_extension.c

Откроем и посмотрим код файла test_extension.с :

В самом начале подключаются нужные заголовочные файлы. Затем идет закомментированный блок, относящийся к глобальным переменным:

Так как сейчас с глобальными переменными мы в нашем расширении не работаем, поэтому оставляем этот код до лучших времен.

Далее идет объявление переменной ресурса:

Далее идет массив структур zend_function_entry , каждая структура — это информация о функции доступной в пользовательском пространстве.

Для создания структуры используется макрос PHP_FE . В макрос передается название функции и структура, описывающая аргументы функции, мы пока передаем NULL.

Далее идет инициализация структуры с информацией о расширении:

Структура zend_module_entry имеет следующие объявление:

Первые шесть полей мы не инициализируем вручную, мы вызываем макрос STANDARD_MODULE_HEADER . Затем указываем функции жизненного цикла расширения, функцию информации о расширении и версию расширения. Для инициализации оставшихся полей структуры мы используем макрос STANDARD_MODULE_PROPERTIES

Следующий блок кода, до PHP_MINIT_FUNCTION(test_extension) относится к глобальным переменным и INI параметрам. Пропускаем

Оставшийся код — реализация функций. Сначала идет реализация функций жизненного цикла расширения:

Читайте также:  Установка бота на firefox

В нашем расширении эти функции ничего полезного не делают. Все функции возвращают значение макроса SUCCESS , которое приравнивается к «успеху».

Затем идет реализация функции информации о расширении:

Оставшийся код — реализация функций расширения, доступные из пользовательского пространства. Сейчас эти функции только генерирую варнинг о том что функции не реализованы.

Компиляция и установка расширения

Вот и дошли до сборки и проверки нашего тестового расширения. Переходим в каталог расширения:

И выполняем команду phpize :

После выполнения этой команды, на основе содержимого файла config.m4 , будут созданы файлы необходимые для конфигурации и компиляции расширения: скрипт configure и Makefile .

Конфигурируем и компилируем расширение:

Если сборка завершилась успешно, то вы увидите запись ‘Build complete.’

копируем скомпилированное расширение в каталог расширений PHP

Проверка расширения

После установки расширения необходимо сказать PHP, что бы он загружал наш модуль. В файле php.ini, у меня он расположен в каталоге /etc , добавим запись

и выполним скрипт test_extension.php , который находится в папке нашего расширения:

если расширение было успешно загружено, то в выводе скрипта мы увидим список функций которые предоставляет нам расширение:

источник

Как правильно подключить JS- и PHP-скрипты к вашему сайту?

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

Подключение JS-скриптов (файлы с расширением *.js) к сайту

JavaScript помогает нам во многих моментах повысить функциональность сайта. Будь то стилизация форм или, например, какая-нибудь техническая сторона вопроса.

Подключение JavaScript’а осуществляется двумя способами:

1. Первый – это непосредственно вставка кода в ваш сайт с помощью тегов:

2. Второй – с помощью файла:

Где «https://www.pandoge.com/main.js» – путь до файла скрипта. Такой вариант рекомендуется писать для файлов на удаленном (внешнем) сервере. Если же файл находится на вашем сайте, то можно просто указать относительный путь:

Это удобно, если вы вдруг захотите сменить домен или перевести сайт на другой протокол.

Что касается места подключения, то все скрипты рекомендуется подключать в секции HEAD, перед закрывающим ее тегом. Например:

Их также можно подключить в секции BODY. Например, все библиотеки рекомендуется подключать в секции HEAD, тогда как все счетчики, слайдеры, галереи и прочие скрипты – в секции BODY, также перед закрывающим тегом.

Подключение PHP-скриптов (файлы с расширением *.php) к сайту

Подключение PHP-скриптов осуществляется уже тремя способами:

1. Первый – это та же вставка кода в саму страницу сайта (обратите внимание, что если вы имеете страницу с расширением *.html – вам необходимо сменить расширение на *.php) с помощью тегов:

2. С помощью файла (в таком случае подключение можно осуществлять и на странице с *.html расширением):

Но для работы этого способа в файл .htaccess, который находится в корне вашего сайта, в самый верх, необходимо добавить эти строки:

Если такого файла нет на хостинге — создайте его через любой текстовый редактор.

3. Третье – с помощью JS-скрипта. В этом случае вы также можете получить результат выполненного PHP-скрипта на сервере.

Реализация будет следующая:

Где «.result» – это класс, куда будут грузиться данные, а «/main.php», соответственно, адрес до PHP-скрипта.

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

Читайте также:  Установка лобовых стекол для иномарок

Здесь правила абсолютно те же: полный адрес к файлу, если он находится на внешнем сервере, относительный – если на вашем.

Обратите внимание! Если вы хотите подключить PHP-скрипт к вашему сайту, то на сервере должна быть поддержка PHP. О том, есть ли у вас такая возможность – узнайте у своего хостинг-провайдера.

Если вы осуществляете подключение скриптов первый раз – попробуйте подключить скрипты из архива, который прикреплен в конце статьи. Если в обоих случаях вы получили сообщение «Hello World!» – значит, вы все сделали правильно.

источник

Как установить расширение PHP: из репозитория и исходников

В большинстве случаев расширение можно установить из репозитория. В репозитории включаются все популярные расширения.

Выяснить, что доступно для установки можно так:

php7.0-mbstring — MBSTRING module for PHP
php7.0-mcrypt — libmcrypt module for PHP
php7.0-mysql — MySQL module for PHP
php7.0-odbc — ODBC module for PHP
php7.0-opcache — Zend OpCache module for PHP
php7.0-pgsql — PostgreSQL module for PHP
php7.0-phpdbg — server-side, HTML-embedded scripting language (PHPDBG binary)
php7.0-pspell — pspell module for PHP

Производится поиск по маске, среди результатов непосредственно php7.0 и все расширения.

Так, если планируется работа с PostgreSQL, то нужно установить php7.0-pgsql.

Любая установка — потенциально опасная операция, поэтому сначала ее следует проводить с ключем —dry-run. В этом случае будут проверены зависимости, но изменений в систему фактически не вносится.

Если ошибок не возникло, но расширение можно устанавливать

Теперь расширение php7.0-pgsql установлено, осталось его подключить.

Сборка расширений PHP

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

Компиляция нужна для расширений, отсутствующих в репозитрии и встречающихся реже.

Исходники расширений можно найти на сайте https://pecl.php.net/

Допустим, что требуется stomp (https://pecl.php.net/package/stomp)

И перейти в каталог с файлами расширения

Далее при условии, что на сервере используется одна версия PHP:

Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100412
Zend Extension Api No: 20100412

Если больше одной версии — потребуется указывать phpize под конкретную версию и phpconfig. Это бинарные файлы, использующиеся для сборки.

Ошибки в логах после сборки появляются про разные версии PHP Api Version и Zend Extension Api No говорят о не тех использованных phpize и phpconfig.

При отсутствии phpize устанавливается пакет php5-dev

configure: creating ./config.status
config.status: creating config.h
config.status: executing libtool commands

Build complete.
Don’t forget to run ‘make test’.

Installing shared extensions: /usr/lib/php7.1.21/20160303/

В результате получаем файл /usr/lib/php7.1.21/20160303/stomp.so, который нужно подключить в php.ini

При условии, что используется php той версии, для которой собрано расширение и конфигурационный файл размещается по пути /etc/php/php.ini:

Далее все процессы можно завершить, чтобы быстрее увидеть результат

Поиск

Последние статьи

Рубрики

  • Apache (20)
  • AWS (10)
  • Bash (13)
  • CRON (5)
  • CSS / изображения (6)
  • DNS (8)
  • ELK (1)
  • FastCGI (4)
  • JS (6)
  • Memcached (1)
  • MongoDB (3)
  • MySQL (52)
  • Networking (44)
  • Nginx (39)
  • NodeJS (1)
  • PHP (13)
  • Python (28)
  • Ruby (6)
  • Search (1)
  • Uncategorized (1)
  • Virtualization / Containers (27)
  • Базы данных (12)
  • Безопасность (25)
  • Высокие нагрузки (23)
  • Контроль версий (14)
  • Мониторинг (17)
  • Обзоры сервисов (23)
  • Оптимизация (1)
  • Ошибки (24)
  • Почтовые серверы (10)
  • Работа сайтов (17)
  • Распределенные системы (8)
  • Телефония (10)
  • Типовые задачи (57)
  • Ядро и ОС (23)
Подключить мониторинг

Уведомления позволят узнать о проблемах на вашем сайте вперед клиентов

источник

Добавить комментарий

Adblock
detector