PHP拓展开发
痛定思痛: 开始了解 PHP 拓展开发,下面这篇文章不错!照着文章讲的,终于实现了!
m.php的代码
浏览器访问 m.php 文件!(备注:在linux 命令行中 php -r 'cthulhu();' 是错误的)
但在浏览器访问是可以的!!
说明: 测试 成功!!
这个链接不错: https://www.simonholywell.com/post/2010/09/15-excellent-resources-for-php-extension-development/
----------------------------------------------------------------------------------------------
https://www.kchodorow.com/blog/2011/08/11/php-extensions-made-eldrich-hello-world/
PHP Extensions Made Eldrich: Hello, World!
This is part 2 of a 4-part tutorial on writing PHP extensions:
- Setting Up PHP – compiling PHP for extension development
- Hello, world! – your first extension
- Working with the API – the PHP C API
- Classes – creating PHP objects in C
First we need to think of a name for our extension. I’ve been reading some H.P. Lovecraft, so let’s call it “rlyeh”.
For our first extension, we’ll create a new function, cthulhu()
. When we call cthulhu()
(tee hee), PHP will print “In his house at R’lyeh dead Cthulhu waits dreaming.”
Cheat Sheet
If you don’t want to copy/paste all of the code, you can clone the Github repo for this tutorial and check out sections as you go.
$ git clone git://github.com/kchodorow/rlyeh.git
This part of the tutorial (Hello, world!) is the master branch. Stating in part 3, each “unit” has a branch: <branchname> at the beginning of the section. You can checkout this branch if you want to see the code example in context.
For example, if you see branch: oop, you’d do:
$ git checkout -b oop origin/oop
Then you can compare what you’re doing to the “ideal” example code.
Setting Up
Create a directory for your PHP extension, named “rlyeh”. This is where all of the source code for your extension will live.
$ mkdir rlyeh $ cd rlyeh
A PHP extension consists of at least three files:
- “config.m4”, which contains compilation instructions for PHP
- “php_extname.c”: source code
- “php_extname.h”: a header file
Creating a config.m4 file is wholly lacking in interest, so just cut/paste the one below.
dnl lines starting with "dnl" are comments PHP_ARG_ENABLE(rlyeh, whether to enable Rlyeh extension, [ --enable-rlyeh Enable Rlyeh extension]) if test "$PHP_RLYEH" != "no"; then dnl this defines the extension PHP_NEW_EXTENSION(rlyeh, php_rlyeh.c, $ext_shared) dnl this is boilerplate to make the extension work on OS X case $build_os in darwin1*.*.*) AC_MSG_CHECKING([whether to compile for recent osx architectures]) CFLAGS="$CFLAGS -arch i386 -arch x86_64 -mmacosx-version-min=10.5" AC_MSG_RESULT([yes]) ;; darwin*) AC_MSG_CHECKING([whether to compile for every osx architecture ever]) CFLAGS="$CFLAGS -arch i386 -arch x86_64 -arch ppc -arch ppc64" AC_MSG_RESULT([yes]) ;; esac fi
If you want to call your extension something else, global replace “rlyeh” with your extension’s name.
Now for the actual extension: create a file called php_rlyeh.c with the following content:
// include PHP API #include <php.h> // header file we'll create below #include "php_rlyeh.h" // define the function(s) we want to add zend_function_entry rlyeh_functions[] = { PHP_FE(cthulhu, NULL) { NULL, NULL, NULL } }; // "rlyeh_functions" refers to the struct defined above // we'll be filling in more of this later: you can use this to specify // globals, php.ini info, startup and teardown functions, etc. zend_module_entry rlyeh_module_entry = { STANDARD_MODULE_HEADER, PHP_RLYEH_EXTNAME, rlyeh_functions, NULL, NULL, NULL, NULL, NULL, PHP_RLYEH_VERSION, STANDARD_MODULE_PROPERTIES }; // install module ZEND_GET_MODULE(rlyeh) // actual non-template code! PHP_FUNCTION(cthulhu) { // php_printf is PHP's version of printf, it's essentially "echo" from C php_printf("In his house at R'lyeh dead Cthulhu waits dreaming.\n"); } |
That’s a whole lotta template, but it’ll make more sense as you go along.
Learning PHP extension programming is sort of like learning Java as your first programming language: “type ‘public static void main’.” “Why? What does that even mean?” “It doesn’t matter, you’ll learn about it later.”
You also have to make a header file, to declare the cthulhu
function as well as the two extension info macros used in php_rlyeh.c (PHP_RLYEH_EXTNAME
and PHP_RLYEH_VERSION
).
Create a new file, php_rlyeh.h, and add a couple of lines:
#define PHP_RLYEH_EXTNAME "rlyeh" #define PHP_RLYEH_VERSION "0.01" PHP_FUNCTION(cthulhu); |
You can change the version whenever you do a new release. It can be any string. It’s displayed when you do:
$ php --ri rlyeh
(once the extension is installed).
Speaking of, now all that’s left is to compile and install. Make sure that your custom-compiled-PHP is first in your PATH. If it isn’t, put it there before doing the rest of the install.
$ echo $PATH $PHPDIR/install-debug-zts/bin:/usr/local/bin:/usr/bin $ phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 $ $ ./configure # lots of checks... $ $ make # compile... Build complete. Don't forget to run 'make test'. $ make install $ Installing shared extensions: $PHPDIR/install-debug-zts/lib/php/extensions/debug-zts-20090626/
Now, add your extension to your php.ini file. PHP is probably expecting a php.ini file in the lib/ subdirectory of your install directory ($PHPDIR/install-debug-zts/lib/php.ini). It probably doesn’t exist yet, so create a new php.ini file with one line:
extension=rlyeh.so
Now you should be able to use your function from PHP without importing, loading, or requiring anything. Do:
$ php -r 'cthulhu();' In his house at R'lyeh dead Cthulhu waits dreaming.
Your first PHP extension is working!
Next up: a deep dive into the PHP API.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现