自1980年代和1990年代以来,我一直没有使用C进行自己的实验。我希望能够再次使用它,但这一次是在其中构建一些小东西,然后将其加载到Linux上的PHP中。
有谁对我有一个非常简短的教程,让我在C中创建foo()函数作为加载在php.ini中的共享对象扩展?我以为我需要使用GCC,但不知道在我的Ubuntu Linux工作站上还需要什么才能完成此工作,或者如何编写文件。
我所见过的一些示例已经展示了如何在C 中进行操作,或者将其显示为必须被编译为PHP的静态扩展。我不需要-我想将其作为C扩展而不是C 进行,并通过php.ini加载它。
我在想我在哪里调用foo(’hello’),如果看到传入的字符串是’hello’,它将返回’world’。
例如,如果这是用100%PHP编写的,则函数可能是:
function foo($s) { switch ($s) case 'hello': return 'world'; break; default: return $s; } }
此示例的扩展名。
<?php function hello_world() { return 'Hello World'; } ?>
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
#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进行编译并获得测试扩展