Warum C-Erweiterung verwenden?
C ist statisch kompiliert und seine Ausführungseffizienz ist viel höher als die von PHP-Code. Die Leistung desselben Operationscodes, der mit C entwickelt wurde, ist hunderte Male höher als die von PHP. Bei E/A-Vorgängen wie CURL hat die C-Erweiterung keinen offensichtlichen Vorteil, da der Zeitaufwand hauptsächlich auf IOWait liegt.
Außerdem wird die C-Erweiterung geladen, wenn der Prozess gestartet wird. Der PHP-Code kann nur die Daten des Anforderungslebenszyklus verarbeiten, und die C-Erweiterung kann in einem größeren Bereich betrieben werden.
Empfohlener Kurs: PHP-Tutorial.
Schritt 1
Laden Sie den Quellcode von PHP herunter, z. B. php-5.4.16. Geben Sie nach der Dekomprimierung das Verzeichnis php-5.4.16ext ein. Geben Sie ./ext_skel –extname=myext ein, myext ist der Name der Erweiterung und das myext-Verzeichnis wird nach der Ausführung generiert.
ext_skel ist ein offiziell von PHP bereitgestelltes Tool zum Generieren von PHP-Erweiterungsskelettcode.
cd myext. Sie können mehrere Dateien wie php_myext.h, myext.c, config.m4 usw. sehen. config.m4 ist die Konfigurationsdatei des AutoConf-Tools, die zum Ändern verschiedener Kompilierungsoptionen verwendet wird.
Schritt 2
Ändern Sie config.m4, ändern Sie
dnl PHP_ARG_WITH(myext, for myext support, dnl Make sure that the comment is aligned: dnl [ --with-myext Include myext support])
in
PHP_ARG_WITH(myext, for myext support, [ --with-myext Include myext support])
und darunter befindet sich ein –enable- myext bedeutet in den PHP-Kernel kompiliert. with wird als dynamische Linkbibliothek geladen.
Schritt 3
Ändern Sie php_myext.h und sehen Sie sich PHP_FUNCTION(confirm_myext_compiled) an. Dies ist der Erweiterungsfunktionsdeklarationsteil. Um die Deklaration anzuzeigen, wird eine Erweiterungsfunktion von myext_helloworld erstellt.
Ändern Sie dann myext.c, den Implementierungsteil der Erweiterungsfunktion.
const zend_function_entry myext_functions[] = { PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */ PHP_FE(myext_helloworld, NULL) PHP_FE_END /* Must be the last line in myext_functions[] */ };
Der Code hier besteht darin, den Funktionszeiger bei der Zend-Engine zu registrieren und eine Zeile PHP_FE(myext_helloworld, NULL) hinzuzufügen (danach kein Semikolon einfügen).
Schritt 4
Fügen Sie den Ausführungscode von myext_helloworld am Ende von myext.c hinzu.
PHP_FUNCTION(myext_helloworld) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } php_printf("Hello World!\n"); RETRUN_TRUE; }
zend_parse_parameters wird verwendet, um die von PHP übergebenen Parameter zu akzeptieren, und das Makro RETURN_XXX wird verwendet, um Daten an PHP zurückzugeben.
Schritt 5
Führen Sie phpize, ./configure, make und make install nacheinander im myext-Verzeichnis aus. Ändern Sie dann php.ini und fügen Sie extension=myext.so hinzu.
Führen Sie php -r "myext_helloworld('test');" aus und geben Sie hello world aus!
Das obige ist der detaillierte Inhalt vonSo schreiben Sie eine PHP-Erweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!