Как создать первый PHP-расширение в C на Linux GCC?

Я не использовал C с 1980-х и 1990-х годов со своими собственными экспериментами. Я бы хотел получить его снова, но на этот раз, создав в нем небольшие вещи, а затем загрузив его в PHP на Linux.

Кто-нибудь имеет очень короткий учебник для меня, чтобы сделать функцию foo () в C как расширение общего объекта, загруженное в php.ini? Я предполагаю, что мне нужно использовать GCC, но не знаю, что еще мне нужно на моей рабочей станции Ubuntu Linux, чтобы это произошло или как составлять файлы.

Некоторые из примеров, которые я видел, показали, как это сделать на C ++ или показать как статическое расширение, которое должно быть скомпилировано в PHP. Я не хочу этого – я хочу сделать это как расширение C, а не C ++, и загрузить его через php.ini.

Я думаю о чем-то, где я называю foo («hello»), и он возвращает «мир», если видит входящую строку «hello».

Например, если это было написано на 100% PHP, функция может быть:

function foo($s) { switch ($s) case 'hello': return 'world'; break; default: return $s; } } 

Solutions Collecting From Web of "Как создать первый PHP-расширение в C на Linux GCC?"

расширение для этого примера.

 <?php function hello_world() { return 'Hello World'; } ?> 

### config.m4

 PHP_ARG_ENABLE(hello, whether to enable Hello World support, [ --enable-hello Enable Hello World support]) if test "$PHP_HELLO" = "yes"; then AC_DEFINE(HAVE_HELLO, 1, [Whether you have Hello World]) PHP_NEW_EXTENSION(hello, hello.c, $ext_shared) fi 

### php_hello.h

 #ifndef PHP_HELLO_H #define PHP_HELLO_H 1 #define PHP_HELLO_WORLD_VERSION "1.0" #define PHP_HELLO_WORLD_EXTNAME "hello" PHP_FUNCTION(hello_world); extern zend_module_entry hello_module_entry; #define phpext_hello_ptr &hello_module_entry #endif 

#### Привет

 #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_hello.h" static function_entry hello_functions[] = { PHP_FE(hello_world, NULL) {NULL, NULL, NULL} }; zend_module_entry hello_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_HELLO_WORLD_EXTNAME, hello_functions, NULL, NULL, NULL, NULL, NULL, #if ZEND_MODULE_API_NO >= 20010901 PHP_HELLO_WORLD_VERSION, #endif STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_HELLO ZEND_GET_MODULE(hello) #endif PHP_FUNCTION(hello_world) { RETURN_STRING("Hello World", 1); } 

Создание вашего расширения $ phpize $ ./configure –enable-hello $ make

После выполнения каждой из этих команд вы должны иметь hello.so

extension = hello.so для вашего php.ini, чтобы вызвать его.

  php -r 'echo hello_world();' 

вы сделали .;-)

подробнее здесь

для простого способа просто попробовать zephir-lang для создания расширения php с меньшим знанием

 namespace Test; /** * This is a sample class */ class Hello { /** * This is a sample method */ public function say() { echo "Hello World!"; } } 

скомпилируйте его с помощью zephir и получите тестовое расширение

Попробовал пример Saurabh с PHP 7.1.6 и нашел некоторые незначительные изменения:

  • Измените function_entry на zend_function_entry
  • Замените RETURN_STRING("Hello World", 1) с RETURN_STRING("Hello World")

Это отличный пример кода для запуска разработки PHP-расширений! Спасибо!