suchen
HeimBackend-EntwicklungPHP-Tutorial编写自己的php扩展函数_PHP

Yorgo Sun 2002/01/22

php程序写的时间长了
自然对他所提供的功能了如指掌他所提供的一大堆功能真是觉得很好用但有时候会发现php也缺少一些功能自己总是会产生为php添加一些自定义的功能的想法。久而久之终于今天憋不住了开始动手研究如何添加。

下载一个php的源代码包
这里使用的是php 4.0.5版解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件打开详细阅读了一下发现了一个非常好用的工具这个工具可以帮你构建一个空的php扩展然后你向里面添加相应的代码就可以完成你自己的功能扩展了。下面我们就来介绍如何使用这个工具。



首先转移你的目录到php的目录下的ext目录
如果你只需要一个基本的扩展框架的话执行下面的命令



./ext_skel --extname=module_name



module_name是你自己可以选择的扩展模块的名字
例如我选择的my_module。执行工具后会自动在ext目录下建立你选择的module_name名字的目录里面已经生成了相关的代码这些代码中只需要调整config.m4文件中的三行注释就可以正常的编译带这个自定义扩展模块的php了。在php的根目录执行下列操作就可以得到。

.
/buildconf



.
/configure --enable-module_name



make

下面我来演示建立my_module扩展框架的全过程
为了更有效果我们来完成一个php的扩展功能在php中调用这个功能可以在web页面中显示hello world这个经典单词。



在php目录下的ext目录中
执行下面的命令



.
/ext_skel --extname=my_module



得到反馈结果




Creating directory my_module



Creating basic files
: config.m4 Makefile.in .cvsignore my_module.c php_my_module.h tests/001.phpt my_module.php [done].




To
use your new extension, you will have to execute the following steps:



1.  $ cd ..



2
.  $ vi ext/my_module/config.m4



3
.  $ ./buildconf



4
.  $ ./configure --[with|enable]-my_module



5
.  $ make



6
.  $ ./php -f ext/my_module/my_module.php



7
.  $ vi ext/my_module/my_module.c



8
.  $ make



Repeat steps 3
-6 until you are satisfied with ext/my_module/config.m4 and



step 6 confirms that your module is compiled into PHP. Then, start writing



code
and repeat the last two steps as often as necessary.



 



如果你能看懂上面的东西
那就照着去做。如果不是太明白的话按照我下面的提示来做也可以。



Cd my_module



首先进入my_module目录



vi config
.m4



使用文本编辑器打开config
.m4文件文件内容大致如下



dnl $Id$



dnl config
.m4 for extension my_module



dnl don
't forget to call PHP_EXTENSION(my_module)



 



dnl Comments in this file start with the string '
dnl'.



dnl Remove where necessary. This file will not work



dnl without editing.



 



dnl If your extension references something external, use with:



 



dnl PHP_ARG_WITH(my_module, for my_module support,



dnl Make sure that the comment is aligned:



dnl [  --with-my_module             Include my_module support])



 



dnl Otherwise use enable:



 



dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,



dnl Make sure that the comment is aligned:



dnl [  --enable-my_module           Enable my_module support])



 



if test "$PHP_MY_MODULE" != "no"; then



  dnl If you will not be testing anything external, like existence of



  dnl headers, libraries or functions in them, just uncomment the



  dnl following line and you are ready to go.



  dnl Write more examples of tests here...



  PHP_EXTENSION(my_module, $ext_shared)



Fi



 



根据你自己的选择将



dnl PHP_ARG_WITH(my_module, for my_module support,



dnl Make sure that the comment is aligned:



dnl [  --with-my_module             Include my_module support])



修改成



PHP_ARG_WITH(my_module, for my_module support,



Make sure that the comment is aligned:



[  --with-my_module             Include my_module support])



或者将



dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,



dnl Make sure that the comment is aligned:



dnl [  --enable-my_module           Enable my_module support])



修改成



PHP_ARG_ENABLE(my_module, whether to enable my_module support,



Make sure that the comment is aligned:



[  --enable-my_module           Enable my_module support])



 



一般我会选择后者然后保存退出。如果你对vi文本编辑器的操作有困难的话请参考相应的说明文章这里就不再详细描述了。



Vi my_module.c



将文件其中的下列代码进行修改



/* Every user visible function must have an entry in my_module_functions[].



*/



function_entry my_module_functions[] = {



        PHP_FE(say_hello,       NULL)  /* ß添加着一行代码 */



        PHP_FE(confirm_my_module_compiled,      NULL) /* For testing, remove later. */



        {NULL, NULL, NULL}      /* Must be the last line in my_module_functions[] */



};



 



在文件的最后添加下列代码



PHP_FUNCTION(say_hello)



{



        zend_printf("hello world\n");



}



保存文件退出



 



vi php_my_module.h



在文件中PHP_FUNCTION(confirm_my_module_compiled);一行前面添加下面的代码



PHP_FUNCTION(say_hello);



保存文件退出



 



退回到php的根目录下执行下面的命令



./buildconf



./configure --enable-my_module



make



 



如果一切顺利的话我们现在已经将扩展模块my_module编译到php里面了。我们编写下面的代码进行测试







       Say_hello();



?>



保存文件为say_hello
.php



在php的根目录下运行



.
/php –q say_hello.php



正常情况下会显示



hello world



表示我们的第一个扩展正常的运行了




 



解释一下上面做的操作
ext_skel生成一些框下文件我们需要修改以下文件



my_module
.c  扩展模块的主程序



php_my_module
.h 扩展模块的头文件



config
.m4  配置文件



 



主程序中描述了php扩展模块的声明
模块中含有多少个函数各个函数的作用在phpinfo函数中显示什么内容模块初始化做些什么结束做些什么都会在这个文件里进行描述。我们在上面只是添加了一个函数say_hello并且描述了say_hello函数的具体内容调用zend_printf系统函数在php中打印字符串。



 



在对应的头文件中声明了say_hello这个函数
从而完成了我们预期的功能。下面我们会编写一个更复杂的扩展创造一个带参数的php扩展函数根据给入的参数显示hello world, xxxx。Xxxx代表输入的字符串内容例如我的名字yorgo。



 



Vi my_module
.c



修改最后的say_hello函数内容如下




PHP_FUNCTION(say_hello)



{



        zval **yourname;



 



       
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)



        {



                WRONG_PARAM_COUNT;



        }



 



        zend_printf
("hello world, %s\n", Z_STRVAL_PP(yourname));



}



存盘退出。



退回php的根目录
运行



make



修改say_hello
.php为







       Say_hello
(“yorgo”);



?>



保存退出后运行



.
/php –q say_hello.php



得出结果



hello world
, yorgo



表示我们这次的修改也成功了
可以改变say_hello中的参数看看动态的效果。



这里主要解释上面修改的函数内容
由于say_hello函数需要有参数引入所以在my_module.c中的say_hello函数主要在进行参数的处理将php中引用say_hello时所填写的参数内容正确的传递到my_module.c中的say_hello处理函数中。为此程序中添加了这么几行。



zval
**yourname;



if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &yourname) == FAILURE)



{



WRONG_PARAM_COUNT;



}



zend_printf("hello world, %s\n", Z_STRVAL_PP(yourname));



 



代码解释如下




zval **yourname;



初始化一个参数的指针



ZEND_NUM_ARGS
()



得到传递过来得参数数量并且判断如果不为1的时候表示有问题报错。



zend_get_parameters_ex
(1, &yourname)



将刚刚初始化的指针指向传递过来的参数如果不成功则报错。



Z_STRVAL_PP
(yourname)



处理指针指向的参数并获得实际存储的值。



(待续)



欢迎网上转载但请保留作者的版权声明如需线下刊登、发表请与作者联系yorgo@163.net  http://www.ruisoft.

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
PHP vs. Python: Verständnis der UnterschiedePHP vs. Python: Verständnis der UnterschiedeApr 11, 2025 am 12:15 AM

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

PHP: Stirbt es oder passt es sich einfach an?PHP: Stirbt es oder passt es sich einfach an?Apr 11, 2025 am 12:13 AM

PHP stirbt nicht, sondern sich ständig anpasst und weiterentwickelt. 1) PHP hat seit 1994 mehreren Versionen für die Version unterzogen, um sich an neue Technologietrends anzupassen. 2) Es wird derzeit in E-Commerce, Content-Management-Systemen und anderen Bereichen häufig verwendet. 3) PHP8 führt den JIT -Compiler und andere Funktionen ein, um die Leistung und Modernisierung zu verbessern. 4) Verwenden Sie Opcache und befolgen Sie die PSR-12-Standards, um die Leistung und die Codequalität zu optimieren.

Die Zukunft von PHP: Anpassungen und InnovationenDie Zukunft von PHP: Anpassungen und InnovationenApr 11, 2025 am 12:01 AM

Die Zukunft von PHP wird erreicht, indem sich an neue Technologietrends angepasst und innovative Funktionen eingeführt werden: 1) Anpassung an Cloud Computing, Containerisierung und Microservice -Architekturen, Unterstützung von Docker und Kubernetes; 2) Einführung von JIT -Compilern und Aufzählungsarten zur Verbesserung der Leistung und der Datenverarbeitungseffizienz; 3) die Leistung kontinuierlich optimieren und Best Practices fördern.

Wann würden Sie ein Merkmal gegenüber einer abstrakten Klasse oder Schnittstelle in PHP verwenden?Wann würden Sie ein Merkmal gegenüber einer abstrakten Klasse oder Schnittstelle in PHP verwenden?Apr 10, 2025 am 09:39 AM

In PHP eignet sich das Merkmal für Situationen, in denen die Wiederverwendung von Methoden erforderlich ist, aber nicht zur Erbschaft geeignet ist. 1) Das Merkmal ermöglicht Multiplexing -Methoden in Klassen, um die Komplexität mehrerer Vererbungskomplexität zu vermeiden. 2) Bei Verwendung von Merkmalen müssen Sie auf Methodenkonflikte achten, die durch die Alternative und als Schlüsselwörter gelöst werden können. 3) Überbeanspruchte des Merkmals sollte vermieden werden und seine einzelne Verantwortung sollte beibehalten werden, um die Leistung zu optimieren und die Code -Wartbarkeit zu verbessern.

Was ist ein Abhängigkeitsinjektionsbehälter (DIC) und warum eine in PHP verwenden?Was ist ein Abhängigkeitsinjektionsbehälter (DIC) und warum eine in PHP verwenden?Apr 10, 2025 am 09:38 AM

Abhängigkeitsinjektionsbehälter (DIC) ist ein Tool, das Objektabhängigkeiten für die Verwendung in PHP -Projekten verwaltet und bereitstellt. Die Hauptvorteile von DIC sind: 1. Entkopplung, Machen von Komponenten unabhängig, und der Code ist leicht zu warten und zu testen; 2. Flexibilität, leicht zu ersetzen oder zu ändern; 3.. Testbarkeit, bequem für die Injektion von Scheinobjekten für Unit -Tests.

Erklären Sie die SPLFixedArray und seine Leistungseigenschaften im Vergleich zu regulären PHP -Arrays.Erklären Sie die SPLFixedArray und seine Leistungseigenschaften im Vergleich zu regulären PHP -Arrays.Apr 10, 2025 am 09:37 AM

SplfixedArray ist ein Array mit fester Größe in PHP, das für Szenarien geeignet ist, in denen hohe Leistung und geringe Speicherverbrauch erforderlich sind. 1) Es muss die Größe beim Erstellen angeben, um den durch dynamischen Einstellungen verursachten Overhead zu vermeiden. 2) Basierend auf C -Spracharray betreibt direkt Speicher und schnelle Zugriffsgeschwindigkeit. 3) Geeignet für eine großräumige Datenverarbeitung und speicherempfindliche Umgebungen, muss jedoch mit Vorsicht verwendet werden, da seine Größe festgelegt ist.

Wie kann PHP -Datei sicher sicher hochladen?Wie kann PHP -Datei sicher sicher hochladen?Apr 10, 2025 am 09:37 AM

PHP überlädt Datei -Hochladen über die Variable $ \ _ Dateien. Zu den Methoden zur Sicherstellung gehören: 1. Upload -Fehler, 2. Dateityp und -größe überprüfen, 3.. Dateiüberschreibung verhindern, 4. Verschieben von Dateien auf einen dauerhaften Speicherort.

Was ist der Null -Koalescing -Operator (??) und der Null -Koalescing -Zuweisungsoperator (?? =)?Was ist der Null -Koalescing -Operator (??) und der Null -Koalescing -Zuweisungsoperator (?? =)?Apr 10, 2025 am 09:33 AM

In JavaScript können Sie NullCoalescingoperator (??) und NullCoalescingAssignmentoperator (?? =) verwenden. 1.??? 2.??= Weisen Sie den Wert des rechten Operanden die Variable zu, jedoch nur, wenn die Variable null oder undefiniert ist. Diese Operatoren vereinfachen die Codelogik und verbessern die Lesbarkeit und Leistung.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software