Как сделать расширение PHP
Я знаю, что вы можете технически сделать расширение PHP, просто создав файл PHP и используя require_once
.
Но оптимизировала бы производительность, если бы вы написали расширение на C или С++.
Если да, как бы вы сделали для этого "привет-мир"?
Ответы
Ответ 1
Вы можете включить автономную программу C/С++ в свой PHP-сайт, просто выполнив ее и передав вывод в браузер. Что касается действительно межоперационной работы, не стоит тратить время на создание библиотеки, содержащей функциональные возможности сайта. Это просто не делается, кроме как взаимодействовать с другими существующими библиотеками (MySQL, imagemagick и т.д.).
Программирование для Интернета не похоже на разработку приложений. Оптимизация битов вашего кода путем написания их на "более быстрых" языках (аналогично написанию небольших, жестких битов цикла вашей С++-программы в сборке) не стоит времени разработки. Вам лучше поддерживать ваше приложение легко поддерживаемым, поэтому языки сценариев доминируют в Интернете.
Ответ 2
Программное обеспечение, написанное на C/С++, конечно, работает быстрее, чем код в PHP. И вы можете написать расширение в C/С++ и связать его с PHP. Руководство PHP описывает это здесь: http://php.net/manual/en/internals2.php
Другие ответы содержат ссылки на другие руководства для написания расширений PHP, и вы можете google для "учебника по расширению PHP", чтобы найти больше.
Но правильно ли это в вашем приложении - это еще одна история. Большинство экспертов согласны с тем, что PHP работает очень хорошо, достаточно быстро для 98% приложений. Экземпляры, в которых PHP недостаточно быстро, в общем не связаны с языком, но неэффективная архитектура приложения, созданная программистом. Это слабость, которая не может быть устранена путем перезаписи частей вашего приложения на C/С++.
Ответ 3
Я знаю, что вы можете технически сделать расширение PHP, просто создав файл PHP и используя require_once
.
Основой этой функциональности является оператор include
, который включает и оценивает указанный файл. Расширение не является правильным термином, потому что вы просто включаете еще один файл PHP скрипт. Расширения PHP предоставляют дополнительные функции для языка в виде скомпилированного модуля.
Но оптимизировала бы производительность, если бы вы написали расширение на C или С++.
Да, он оптимизирует производительность. Вот почему расширения PHP, такие как CPhalcon или YAF.
Как создать расширение PHP Hello World?
Я опишу, как вы можете построить расширение PHP Hello World в пять шагов.
Требуется операционная система на базе Debian, потому что нам нужно получить некоторые инструменты и зависимости с помощью apt-get.
Шаг 1 - Настройка среды сборки/требования
Расширение PHP скомпилировано C-кодом. Нам нужна оболочка (она уже должна быть установлена), редактор (ваш выбор), компилятор (здесь мы будем использовать GCC), сами PHP и зависимости разработки PHP для сборки.
sudo apt-get install build-essential php7.0 php7.0-dev
Шаг 2 - Конфигурация
Нам нужно описать наше расширение и файлы, образующие его в базовом файле конфигурации:
Файл: config.m4
PHP_ARG_ENABLE(php_helloworld, Whether to enable the HelloWorldPHP extension, [ --enable-helloworld-php Enable HelloWorldPHP])
if test "$PHP_HELLOWORLD" != "no"; then
PHP_NEW_EXTENSION(php_helloworld, php_helloworld.c, $ext_shared)
fi
Как вы можете видеть, NEW_EXTENSION содержит файл C: php_helloworld.c
.
Шаг 3 - Код
Позвольте создать код C для нашего расширения.
Во-первых, мы создаем файл заголовка:
php_helloworld.h
// we define Module constants
#define PHP_HELLOWORLD_EXTNAME "php_helloworld"
#define PHP_HELLOWORLD_VERSION "0.0.1"
// then we declare the function to be exported
PHP_FUNCTION(helloworld_php);
Во-вторых, мы создаем исходный файл:
php_helloworld.c
// include the PHP API itself
#include <php.h>
// then include the header of your extension
#include "php_helloworld.h"
// register our function to the PHP API
// so that PHP knows, which functions are in this module
zend_function_entry helloworld_php_functions[] = {
PHP_FE(helloworld_php, NULL)
{NULL, NULL, NULL}
};
// some pieces of information about our module
zend_module_entry helloworld_php_module_entry = {
STANDARD_MODULE_HEADER,
PHP_HELLOWORLD_EXTNAME,
helloworld_php_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
PHP_HELLOWORLD_VERSION,
STANDARD_MODULE_PROPERTIES
};
// use a macro to output additional C code, to make ext dynamically loadable
ZEND_GET_MODULE(helloworld_php)
// Finally, we implement our "Hello World" function
// this function will be made available to PHP
// and prints to PHP stdout using printf
PHP_FUNCTION(helloworld_php) {
php_printf("Hello World! (from our extension)\n");
}
Шаг 4 - Строить
Теперь мы готовы построить расширение.
Сначала мы создаем среду сборки для расширения PHP:
phpize
Затем мы сконфигурируем сборку и включим наше расширение:
./configure --enable-php-helloworld
Наконец, мы можем его построить:
make
sudo make install
Шаг 5 - Тест
Чтобы протестировать наше расширение PHP, загрузите файл расширения helloworld_php.so
и выполните нашу функцию helloworld_php()
:
php -d extension=php_helloworld.so -r 'helloworld_php();'
Готово:)
Работа с Windows
Если вы попытаетесь создать Windows (YIKES!),
то вам нужно немного отрегулировать шаги:
Шаг 2 - Конфигурация
Файл: config.w32
ARG_ENABLE("helloworld", "helloworld support", "yes");
if (PHP_HELLOWORLD == "yes") {
EXTENSION("helloworld", "php_helloworld.c");
}
Шаг 4 - Строить
Используйте nmake
вместо make
.
Список полезных ресурсов:
Ответ 4
Здесь учебник по расширениям PHP. Будет ли он оптимизировать производительность или нет, это зависит от того, что вы пытаетесь обернуть на своем расширении. Но я бы не стал писать расширение PHP просто для целей оптимизации. Я бы написал один, если у меня нет выбора. И.Е. Обтекание общей библиотеки C, чтобы сделать ее доступной непосредственно в PHP...