Как сделать расширение 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...