Heim  >  Artikel  >  Backend-Entwicklung  >  So schreiben Sie eine PHP-Erweiterung

So schreiben Sie eine PHP-Erweiterung

(*-*)浩
(*-*)浩Original
2019-05-13 14:34:184551Durchsuche

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.

So schreiben Sie eine PHP-Erweiterung

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!

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