如何在Linux GCC的C语言中创build我的第一个PHP扩展?

自从20世纪80年代和90年代以来,我一直没有使用C语言进行自己的实验。 我希望能够再次拿起它,但这次通过构build小东西,然后将其加载到Linux上的PHP。

有没有人有一个非常简短的教程,让我做一个在C中的foo()函数作为一个php.ini中加载的共享对象的扩展? 我假设我需要使用GCC,但不知道我的Ubuntu Linux工作站上还有什么需要,以及如何编写这些文件。

我见过的一些例子展示了如何在C ++中实现它,或者将其展示为一个必须被编译到PHP中的静态扩展。 我不想这样做 – 我想把它做成一个C扩展,而不是C ++,并通过php.ini加载它。

我正在考虑一些我称之为foo('hello')的东西,如果它看到传入的string是'hello',它会返回'world'。

例如,如果这是用100%PHP编写的,那么function可能是:

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

扩展= 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的例子,发现需要一些小的改变:

  • zend_function_entry更改为zend_function_entry
  • RETURN_STRING("Hello World", 1)替换RETURN_STRING("Hello World", 1) RETURN_STRING("Hello World")

这是启动PHP扩展开发的一个很好的示例代码! 谢谢!