
Teilen Sie:
Als ausgebildeter Schauspieler mit einer Dissertation in Standup-Comedy bin ich über die Meetup-Szene zur PHP-Entwicklung gekommen. Man findet mich, wenn ich über Technik spreche oder schreibe, oder wenn ich seltsame Platten aus meiner Vinylsammlung spiele oder kaufe.
Die Verwaltung von PHP-Erweiterungen ist so einfach wie PIE
Lesedauer: 8 Minuten
Ich denke, es gab nie eine bessere Zeit, um PHP-Entwickler zu sein. Vielleicht habe ich eine rosarote Brille auf, oder vielleicht habe ich einfach noch nicht genug historischen Schmerz erlebt, aber FrankenPHP hat der Sprache eine neue, blitzschnelle Laufzeitumgebung gegeben, und PHP-Applikationen können jetzt kostenlos für Android- und iOS-Geräte entwickelt werden mit NativePHP.
In diesem Artikel werden wir uns mit dem PHP-Installationsprogramm für Erweiterungen (PIE) und erstellen eine benutzerdefinierte PHP-Erweiterung.
Paket- und Erweiterungsverwaltung in PHP
Ich erlebe oft ein wissendes Nicken, wenn das Thema Komponist zur Sprache kommt. Dies wird gewöhnlich von der Aussage begleitet, dass "PHP den besten Paketmanager hat". Aufgrund der robusten Funktionen von Composer habe ich, glaube ich, noch nie jemals Schwierigkeiten mit ihm gehabt. Ich dachte: "Unter welchen Umständen gibt uns das Ökosystem solche Werkzeuge?" Nicht um die immense Arbeit von Nils und Jordi die das möglich gemacht haben, aber mir ist auch aufgefallen, dass PHP dazu neigt, viele De-facto-Werkzeuge zu haben, dass weniger mehr ist. Composer ist unser De-facto-Paketmanager. Vergleichen Sie das mit, sagen wir, Node oder Python, wo die Entwickler ihren Finger am Puls haben müssen, um zu sehen, was als nächstes kommt und was die Gemeinschaft entscheidet, was "das Beste" ist. Neue Werkzeuge erscheinen in dem Versuch, die Einschränkungen der aktuellen Situation zu beheben.
Which JavaScript manager is it this week?Komponist ersetzt PEAR. Aber für C-Erweiterungen auf PHP war das schon immer PECL. Im gleichen Lebenszyklus scheint es, dass wir jetzt unsere neue "de-facto Erweiterung Manager" in der Form von PIE. Bevor ich darauf eingehe, wie man ihn benutzt und was er alles kann, hielt ich es für das Beste, dem Autor einige brennende Fragen zu stellen, James Titcumb.
Von PEAR zu PECL zu PIE: Die Perspektive des Autors
Zwischen PECL und PEAR besteht eine etwas verwirrende Beziehung. Wie und wann ist PECL entstanden?
PEAR - das PHP Extension and Application Repository - wurde 1999 als Werkzeug und Distributionssystem für PHP-Code gegründet. Funktionell entspricht es dem, was Composer heute tut, allerdings mit einem etwas anderen Ansatz. PECL war ein Ableger davon; ein eigenständiges Tool, um sich mit PEAR-Kanälen zu verbinden und Erweiterungen zu erstellen. Dieses Zeug ist extrem veraltet, und während PEAR von Composer fast in den Schatten gestellt wurde, war PECL bis vor kurzem noch die Standardmethode zur Installation von PHP-Erweiterungen.
Angesichts der Tatsache, dass es PECL schon ewig gibt, warum gerade jetzt für PIE?
Das PIE-Projekt wird zum Teil von der Sovereign Tech Agency finanziert, einem Programm der deutschen Regierung zur Förderung und Sicherung der langfristigen Nachhaltigkeit von Open-Source-Technologien. PECL war in der Vergangenheit schwer zu warten, ist im Vergleich zu Composer in Bezug auf die Verwaltung von Abhängigkeiten weit unterlegen und erfordert die Wartung der Infrastruktur. Die Zahl der Personen, die wissen, wie diese Infrastruktur funktioniert, ist beunruhigend gering. Im Einklang mit dem Ziel der PHP Foundation, den "Bus-Faktor" für PECL und die dazugehörige Infrastruktur zu verringern, wurde PIE ins Leben gerufen, um diese Probleme zu lösen.
Aus vertraulichen Quellen weiß ich, dass Sie für die "PHP Foundation" arbeiten. Was ist das, und was machen Sie dort?
Die PHP Foundation ist eine Organisation, die ursprünglich gegründet wurde, weil sich eine Gruppe von Leuten zusammenfand, die feststellten, dass die Zahl derer, die aktiv an PHP arbeiteten, so gering war, nämlich zwei, und dann irgendwann auf einen reduziert wurde. Das Ziel ist es, die langfristige Nachhaltigkeit der Programmiersprache PHP zu gewährleisten, was wichtig ist, wenn man bedenkt, wie viel im Web auf PHP-Systemen läuft! Eine der Aufgaben der Stiftung ist es, Entwickler einzustellen, die an PHP und dem dazugehörigen Ökosystem arbeiten. auf der Suche nach Sponsoren.
Welche neuen Funktionen können wir im Jahr 2026 erwarten?
Ein großer Schritt in der aktuellen PIE 1.4-Entwicklungsreihe ist es, sicherzustellen, dass PIE besser mit bestehenden Erweiterungs-Installationssystemen zusammenarbeitet, die zuvor PECL umhüllten oder ihre eigene Vorgehensweise hatten (wie z.B. Docker), sowie den Endbenutzern die Installation von Voraussetzungen (wie Build-Tools, Systembibliotheken usw.) zu ersparen. Wir werden auch experimentell vorgefertigte ausführbare Binärdateien von PIE selbst mit einem Tool namens Static PHP bereitstellen. Und es ist noch viel mehr in Planung. Das Endziel ist, dass PIE PECL vollständig ersetzt, und darauf arbeiten wir hin.
Tutorial: PIE zum Verwalten von Erweiterungen verwenden
Dieses Tutorial besteht also aus zwei Teilen. Zunächst installieren wir PIE und verwenden es, um eine Beispiel-Erweiterung abzurufen. Dann gehen wir zu den komplexeren Dingen über, indem wir unsere eigene Erweiterung schreiben und PIE dazu bringen, sie zu kompilieren.
Wie geht es Ihrem C?
Das ist richtig. C. Ich habe oft mit Entwicklern in anderen Sprachgemeinschaften gesprochen, und sie sind oft ziemlich überrascht, wenn sie zum ersten Mal erfahren, dass Rasmus Lerdorf PHP als eine aus C kompilierte Sprache entwickelt hat. Um eine PHP-Erweiterung zu schreiben, die von PIE verwendet werden soll? Ja, es wird in C sein.
Installation von PIE
PIE ist eine ausführbare Datei PHAR (Applaus für Davey Shafik für seine großartige Arbeit, dieses Programm in PHP zu integrieren). Sie können die PHAR herunterladen von hierherunterladen und dann in den PATH der Kommandozeile des von Ihnen verwendeten Betriebssystems einfügen.
Sobald Sie entweder einen Alias in Ihrer Shell-RC-Datei gesetzt oder PIE zu Ihrem Pfad hinzugefügt haben, können Sie damit eine Beispiel-Erweiterung installieren. Wir werden dies zuerst tun, bevor wir unsere eigene Erweiterung erstellen.
pie install asgrim/example_pie_extension
Composer, but slightly different!Fantastisch, es ist installiert. Zeit zu überprüfen, ob es funktioniert: Erstellen Sie eine neue PHP-Datei und fügen Sie Folgendes hinzu:
test.php
<?php
example_pie_extension_test();
Ausgänge:
php test.php
Hello, world!
Ah, der alte Klassiker. Wir kochen jetzt.
Unsere eigene PHP-Erweiterung schreiben
Diejenigen, die mit dem Laravel Welt vertraut sind, kennen den berüchtigten dd() Hilfsprogramm. Er führt sowohl var_dump()und dann die(). Dieser Code befindet sich im Laravel-Kern, aber was wäre, wenn wir uns entschließen würden, unsere eigene Erweiterung zu programmieren, um diese Funktion nativ zur PHP-Laufzeit zu haben? Das ist genau das, was wir tun werden!
Beginnen Sie damit, einen Projektordner anzulegen. Zum Beispiel:
mkdir native_dd
cd native_dd && touch native_dd.cIch hoffe, Sie haben Ihre C-Spracherweiterungen in Ihrer IDE installiert!
Wir haben geschaffen native_dd.c. Da wir uns nun im C-Land befinden, ist es an der Zeit, mit der Zend-Engine zu programmieren!
#include "php.h"
#include <ext/standard/php_var.h>
#include "php_native_dd.h"
PHP_FUNCTION(native_dd)
{
zval *value;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_ZVAL(value)
ZEND_PARSE_PARAMETERS_END();
php_var_dump(value, 0);
php_printf("\n");
php_output_flush();
zend_bailout();
}
ZEND_BEGIN_ARG_INFO(arginfo_native_dd_test, 0)
ZEND_END_ARG_INFO()
static const zend_function_entry native_dd_functions[] = {
PHP_FE(native_dd, arginfo_native_dd_test)
PHP_FE_END
};
zend_module_entry native_dd_module_entry = {
STANDARD_MODULE_HEADER,
"native_dd",
native_dd_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
"0.1.0",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(native_dd)
Hier gibt es mehrere Dinge zu beachten. Erstens, um eine PHP-Funktion zu programmieren, müssen Sie sich an die Struktur halten, die von der Zend Engine verwendet wird. Sie können mehr über diese Anforderungen hier lesen: https://www.phpinternalsbook.com/php5/build_system/building_extensions.html.
Wenn wir alle benötigten Dateien haben, sollte die Dateistruktur Ihres Projekts wie folgt aussehen:
pietest/
composer.json
composer.lock
config.m4
native_dd.c
php_native_dd.h
test.php
Machen Sie sich keine Sorgen, wenn Sie zu diesem Zeitpunkt noch Dateien vermissen; wir werden sie nachholen.
Die TLDR hier ist dies:
Sie müssen PHP zuerstda die Reihenfolge der Einbindung in C wichtig ist
Dieses Modul verwendet einen Teil der Standardbibliothek (
php_var_dump()), die importiert werden muss:#include <ext/standard/php_var.h>Sie müssen eine Header-Datei für die Funktion einfügen, mehr dazu in Kürze
Die für die API-Schicht von PHP in C verwendete Benennung lautet
PHP_FUNCTION()für die Definition,ZEND_BEGIN_ARG_INFO()undZEND_END_ARG_INFO()für weitere Details in den Argumenten.zend_function_entry <your-module-name>mit Suffix<your-module-name>_functions[]wird mit einem Makro verwendet,PHP_FEverwendet, welches die eigene Funktion zu einer Zend Interne Funktion. Die letzten Schritte sind die Definition der Funktion als ein Modul mitzend_module_entryundZEND_GET_MODULE.php_var_dumpwird die gleiche zugrundeliegende Funktion, die von PHPsvar_dumpwird importiert und verwendetEin Äquivalent von
die()wird verwendet, das istzend_bailout()
Verständlicherweise mag das meiste davon für PHP-Entwickler wie mich fremd erscheinen. Sich mit den Eigenheiten der Zend Engine und den API-Definitionen vertraut zu machen, ist nichts für schwache Nerven, aber das wirklich Schöne kommt mit PIE.
Das Modul benötigt eine Header-Datei und eine Konfigurationsdatei, also erstellen Sie eine config.m4 Datei und eine php_native_dd.h Datei.
config.m4
PHP_ARG_ENABLE(native_dd, whether to enable native_dd,
[ --enable-native-dd Enable native_dd])
if test "$PHP_NATIVE_DD" != "no"; then
PHP_NEW_EXTENSION(native_dd, native_dd.c, $ext_shared)
fi
php_native_dd.h
#ifndef PHP_NATIVE_DD_H
#define PHP_NATIVE_DD_H
extern zend_module_entry native_dd_module_entry;
#define phpext_native_dd_ptr &native_dd_module_entry
#endifIch erinnere mich, dass ich vor Jahren versucht habe, mein eigenes Modul zu kompilieren und dabei kläglich an der Plattform gescheitert bin, auf der ich es erstellen wollte. Ich glaube, ich wusste damals nicht einmal, wie Dinge wie GCC und MAKEFILEs funktionieren.
Raten Sie mal, was wir jetzt tun werden? Richtig, wir verwenden PIE, damit es die ganze harte Arbeit macht.
Das schockierend einfache Kompilieren ...
... wenn Sie alles richtig eingestellt haben.
PIE benötigt verschiedene Bibliotheken auf der Ebene des Betriebssystems, also stellen Sie sicher, dass Sie alles Notwendige haben.
Als Autor einer Erweiterung behandeln Sie Ihren C-Code wie jede andere Abhängigkeit - mit Composer. Unser Code composer.json sieht so aus:
{
"name": "jimseconde/nativedd",
"description": "A Native dd() helper for core PHP to be installed with PIE",
"authors": [
{
"name": "jimseconde",
"email": "jim.seconde@googlemail.com"
}
],
"require": {
"php": "^8.3"
},
"type": "php-ext",
"php-ext": {
"extension-name": "native_dd"
},
"license": "MIT"
}
Der wichtige Teil hier ist typeder Composer mitteilt, dass es sich nicht um eine PHP-Abhängigkeit handelt, sondern php-ext definiert es als eine Erweiterung. Sie müssen dies mit dem Zusatz php-ext Schlüssel, der die extension-name. Wenn Sie PIE mit pie installausgeführt wird, schaut der PIE-Code in der composer.json und baut ihn dann von dort aus:
pie install
Built, enabled, and loaded!Erstellen Sie nun eine PHP-Testdatei und verwenden Sie diese.
<?php
$myVariable = "test string";
native_dd($myVariable);Führen Sie es aus, und:
php test.php
string(11) "test string"Erledigt.
Schlussfolgerung
Ich gebe zu, dass ich nie gedacht hätte, dass ich den Tag erleben würde, an dem ich tatsächlich meine eigenen PHP-Funktionen programmieren kann. Wenn Sie PIE starten, werden Sie am Build-Prozess sehen (Sie können der Kommandozeile Verbosity-Filter mit -v -vv usw. hinzufügen, um mehr Protokolle zu erhalten), dass es sich um eine Menge um viele Dinge kümmert, um es so einfach zu machen, entweder auf bestehende Erweiterungen zurückzugreifen oder eigene zu erstellen. Für andere spannende Anwendungen kann ich mir (zum Beispiel) benutzerdefinierte Erweiterungen für NativePHP-Builds vorstellen, die den Zugriff auf alle Arten von nativen APIs innerhalb eines Geräts oder einer Maschine ermöglichen.
Haben Sie eine Frage oder möchten Sie uns mitteilen, was Sie gerade bauen?
Beteiligen Sie sich am Gespräch auf dem Vonage Community Slack
Abonnieren Sie den Entwickler-Newsletter
Folgen Sie uns auf X (früher Twitter) für Updates
Sehen Sie sich die Tutorials auf unserem YouTube-Kanal
Verbinden Sie sich mit uns auf der Vonage Entwickler-Seite auf LinkedIn
Bleiben Sie auf dem Laufenden und halten Sie sich über die neuesten Nachrichten, Tipps und Veranstaltungen für Entwickler auf dem Laufenden.
Teilen Sie:
Als ausgebildeter Schauspieler mit einer Dissertation in Standup-Comedy bin ich über die Meetup-Szene zur PHP-Entwicklung gekommen. Man findet mich, wenn ich über Technik spreche oder schreibe, oder wenn ich seltsame Platten aus meiner Vinylsammlung spiele oder kaufe.