Я не использовал 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; } }
расширение для этого примера.
<?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-расширений! Спасибо!