Dieser Artikel führt Sie hauptsächlich in das Schreiben von PHP-Erweiterungen ein. Wir beginnen mit der Erstellung einer PHP-Erweiterung.
PHP ist in der Sprache C geschrieben. Bei jedem PHPer gibt es einen inneren Drang, Erweiterungen zu schreiben. Allerdings fehlt ein guter Einstiegspunkt. Bei der Suche nach PHP-Erweiterungsentwicklung bei Google handelt es sich meist um kopierte Artikel, und einige Leute haben sie sogar in ihren Blogs gepostet, ohne sie überhaupt zu bedienen. Es gibt zwar einige gute Tutorials, diese sind jedoch allesamt Produkte aus der PHP 5-Ära und weisen viele versteckte Fallstricke auf. Ich werde den Vorgang des langsamen Betretens der Grube aufzeichnen, und vielleicht wird dies zu einem „Tutorial“ für andere.
Erstellen Sie eine Erweiterung
Ich glaube, viele Leute haben viele Online-Tutorials gesehen. Die meisten von ihnen lehren uns, diesen Befehl auszuführen: $./ext_skel--extname=extname. Wenn Sie jedoch den PHP-Quellcode klonen, werden Sie feststellen, dass sich unter dem Master-Zweig keine ext/ext_skel-Datei befindet. Also habe ich es zusammengefasst:
Wenn Sie den Quellcode von PHP direkt oder unter der veröffentlichten Version herunterladen, können Sie diesen Befehl ausführen
$ cd ext $ ./ext_skel --extname=extname
Wenn Sie direkt herunterladen Unter dem Hauptzweig , es gibt nur die Datei ext_skel.php. Zu diesem Zeitpunkt können Sie diese PHP-Datei direkt ausführen
$ cd ext $ php ext_skel.php --ext extname
Da ich sie direkt unter dem Master-Zweig entwickelt habe, befinden sich die folgenden standardmäßig alle im Master-Zweig . Operationen unten.
Nachdem die Erweiterung generiert wurde, sehen wir vier Dateien und einen Ordner. Zu diesem Zeitpunkt müssen wir nur zwei Dateien verwenden, die .c-Datei und die .h-Datei.
Eine kleine Grube
Nachdem wir die Erweiterung generiert haben, können wir versuchen, sie zu kompilieren
$ phpize $ ./configure $ make &&make test
Wir werden überrascht sein, dass beim Kompilieren eine Warnung angezeigt wird .
warning:implicitdeclaration of function 'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration] ZEND_PARSE_PARAMETERS_NONE(); ^
1 Warnung wurde generiert.
Dann führen Sie make test aus und stellen fest, dass ein Test fehlgeschlagen ist. Das stimmt, die vom Skript für uns generierten Dateien haben unsere eigenen Tests tatsächlich nicht bestanden. Findest du es seltsam? Schauen wir uns die spezifischen Informationen der Warnung an. Funktion ZEND_PARSE_PARAMETERS_NONE nicht gefunden. Ich habe mir die Datei angesehen und sie in Zeile 15 gefunden. Sie können wahrscheinlich erraten, was es bedeutet, wenn Sie sich den Funktionsnamen ansehen. Also habe ich den PHP-Quellcode durchsucht. Aber wir haben eine solche Makrodefinition gefunden.
#ifndefzend_parse_parameters_none #definezend_parse_parameters_none() zend_parse_parameters(ZEND_NUM_ARGS(),"") #endif
Nach dem Ersetzen der ursprünglichen Großbuchstaben erfolgt keine Warnung. Dies kann als das offizielle Graben eines kleinen Lochs für uns angesehen werden. Obwohl es Makrodefinitionen in Großbuchstaben gibt, bin ich mir nicht sicher, warum ein Fehler gemeldet wird.
Definieren Sie eine Funktion
Ich denke, wenn die meisten Leute Erweiterungen schreiben, hoffen sie auf jeden Fall, mindestens eine Funktion zu implementieren. Sie brauchen nicht nur ein paar globale Variablen, um eine Erweiterung zu schreiben (Fog
Hier stellt uns PHP ein nützliches Makro PHP_FUNCTION zur Verfügung. Im generierten Code sind auch zwei Funktionen definiert. Dieses Makro wird schließlich in eine Funktion übersetzt ). Es wird schließlich in voidzif_name(zend_execute_data*execute_data,zval*return_value) übersetzt.
Gleichzeitig sehen wir, dass ein solches Array definiert ist
constzend_function_entry cesium_functions[]={ PHP_FE(cesium_test1,arginfo_cesium_test1) PHP_FE(cesium_test2,arginfo_cesium_test2) PHP_FE_END }; constzend_function_entry cesium_functions[]={ PHP_FE(cesium_test1,arginfo_cesium_test1) PHP_FE(cesium_test2,arginfo_cesium_test2) PHP_FE(name,NULL) PHP_FE_END };
Denken Sie daran, dies nicht zu tun Fügen Sie am Ende ein Semikolon oder Komma hinzu. Schließlich können wir diese Funktion ausgeben
PHP_FUNCTION(name) { php_printf("Hellon"); }
Nach der Kompilierung und Installation können wir diese Funktion verwenden
Verwandte Empfehlungen:
PHP. Kompilierung der Erweiterung Tencent CMEM
Automatische Generierung des Erweiterungsframeworks für PHP-Erweiterung
So schreiben Sie eine PHP-Erweiterung
Das obige ist der detaillierte Inhalt vonGrundlegendes Erlernen der PHP-Erweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!