Zweimal im Monat besuchen wir einige der Lieblingsbeiträge unserer Leser aus der gesamten Geschichte von Nettuts+.
Selbst nach jahrelangem Einsatz von PHP stoßen wir auf Funktionen und Funktionen, die uns nicht bekannt waren. Einige davon können sehr nützlich sein, werden jedoch nicht genutzt. Aus diesem Grund habe ich eine Liste von neun unglaublich nützlichen PHP-Funktionen und -Funktionen zusammengestellt, die Sie kennen sollten.
Möglicherweise wissen Sie bereits, dass Sie in PHP Funktionen mit optionalen Argumenten definieren können. Es gibt aber auch eine Methode, um eine beliebige Anzahl von Funktionsargumenten zuzulassen.
Zunächst ein Beispiel mit nur optionalen Argumenten:
// Funktion mit 2 optionalen Argumenten Funktion foo ($ arg1 = ", $ arg2 =") echo "arg1: $ arg1 \ n"; echo "arg2: $ arg2 \ n"; foo ('Hallo', 'Welt'); / * druckt: arg1: hallo arg2: world * / foo (); / * druckt: arg1: arg2: * /
Nun wollen wir sehen, wie wir eine Funktion erstellen können, die eine beliebige Anzahl von Argumenten akzeptiert. Dieses Mal werden wir func_get_args () verwenden:
// Ja, die Argumentliste kann leer sein. Funktion foo () // gibt ein Array aller übergebenen Argumente zurück. $ args = func_get_args (); foreach ($ args as $ k => $ v) echo "arg" ($ k + 1). ": $ v \ n"; foo (); / * druckt nichts * / foo ('hallo'); / * druckt arg1: hallo * / foo ('hallo', 'welt', 'wieder'); / * druckt arg1: hallo arg2: world arg3: wieder * /
Viele PHP-Funktionen haben lange und beschreibende Namen. Es ist jedoch möglicherweise schwer zu erkennen, was eine Funktion namens glob () tut, wenn Sie diesen Begriff nicht bereits an anderer Stelle kennen.
Betrachten Sie es als eine fähigere Version der scandir () - Funktion. Mit Hilfe von Mustern können Sie nach Dateien suchen.
// Holen Sie sich alle PHP-Dateien $ files = glob ('*. php'); print_r ($ files); / * Die Ausgabe sieht folgendermaßen aus: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php) * /
Sie können mehrere Dateitypen wie folgt abrufen:
// alle php-Dateien und txt-Dateien abrufen $ files = glob ('*. php, txt', GLOB_BRACE); print_r ($ files); Die Ausgabe von / * sieht folgendermaßen aus: Array ([0] => phptest.php [1] => pi.php [2] => post_output.php [3] => test.php [4] => log.txt [5 ] => test.txt) * /
Beachten Sie, dass die Dateien je nach Abfrage tatsächlich mit einem Pfad zurückgegeben werden können:
$ files = glob ('? /images/a*.jpg'); print_r ($ files); / * Die Ausgabe sieht folgendermaßen aus: Array ([0] =>? /images/apple.jpg [1] =>? /images/art.jpg) * /
Wenn Sie den vollständigen Pfad zu jeder Datei abrufen möchten, rufen Sie einfach die Funktion realpath () für die zurückgegebenen Werte auf:
$ files = glob ('? /images/a*.jpg'); // wendet die Funktion auf jedes Array-Element an $ files = array_map ('realpath', $ files); print_r ($ files); / * Die Ausgabe sieht folgendermaßen aus: Array ([0] => C: \ wamp \ www \ images \ apple.jpg [1] => C: \ wamp \ www \ images \ art.jpg) * /
Wenn Sie die Speicherauslastung Ihrer Skripts beobachten, können Sie Ihren Code möglicherweise besser optimieren.
PHP hat einen Garbage Collector und einen ziemlich komplexen Speichermanager. Die Menge an Speicher, die von Ihrem Skript verwendet wird. kann während der Ausführung eines Skripts auf und ab gehen. Um die aktuelle Speichernutzung zu erhalten, können Sie die Funktion memory_get_usage () verwenden. Um an jedem Punkt den höchsten Speicherplatz zu erhalten, können Sie die Funktion memory_get_peak_usage () verwenden.
echo "Initial:" .memory_get_usage (). "Bytes \ n"; / * druckt Initiale: 361400 Byte * / // Lassen Sie uns etwas Speicherplatz für ($ i = 0; $ i) verbrauchen < 100000; $i++) $array []= md5($i); // let's remove half of the array for ($i = 0; $i < 100000; $i++) unset($array[$i]); echo "Final: ".memory_get_usage()." bytes \n"; /* prints Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* prints Peak: 13687072 bytes */
Dazu verwenden wir die getrusage () - Funktion. Beachten Sie, dass dies auf Windows-Plattformen nicht verfügbar ist.
print_r (getrusage ()); / * druckt Array ([ru_oublock] => 0 [ru_inblock] => 0 [ru_msgsnd] => 2 [ru_msgrcv] => 3 [ru_maxrss] => 12692 [ru_ixrss] => 764 [ru_idrss] => 3864 [ru_minflt] => 94 [ru_majflt] => 0 [ru_nsignals] => 1 [ru_nvcsw] => 67 [ru_nivcsw] => 4 [ru_nswap] => 0 [ru_utime.tv_usec] => 0 [ru_utime.tv_sec] => 0 [ ru_stime.tv_usec] => 6269 [ru_stime.tv_sec] => 0) * /
Das kann etwas kryptisch aussehen, wenn Sie nicht bereits über einen Hintergrund der Systemadministration verfügen. Hier ist die Erklärung jedes Werts (Sie müssen sich diese nicht merken):
Um zu sehen, wie viel CPU-Leistung das Skript verbraucht hat, müssen wir die Werte für "Benutzerzeit" und "Systemzeit" betrachten. Die Sekunden- und Mikrosekundenanteile werden standardmäßig separat bereitgestellt. Sie können den Wert in Mikrosekunden durch 1 Million teilen und zum Sekundenwert addieren, um die Gesamtsekunde als Dezimalzahl zu erhalten.
Sehen wir uns ein Beispiel an:
// schlaf für 3 Sekunden (nicht beschäftigt) sleep (3); $ data = getrusage (); echo "Benutzerzeit:". ($ data ['ru_utime.tv_sec'] + $ data ['ru_utime.tv_usec'] / 1000000); Echo "Systemzeit:". ($ data ['ru_stime.tv_sec'] + $ data ['ru_stime.tv_usec'] / 1000000); / * druckt Benutzerzeit: 0.011552 Systemzeit: 0 * /
Obwohl die Ausführung des Skripts ungefähr 3 Sekunden dauerte, war der CPU-Verbrauch sehr gering. Das Skript verbraucht während des Ruhezustands tatsächlich keine CPU-Ressourcen. Es gibt viele andere Tasks, die Echtzeit erfordern können, aber keine CPU-Zeit benötigen, z. B. das Warten auf Festplattenoperationen. Sie sehen also, dass die CPU-Auslastung und die tatsächliche Laufzeit der Laufzeit nicht immer gleich sind.
Hier ist ein anderes Beispiel:
// Schleife 10 Millionen Mal (beschäftigt) für ($ i = 0; $ i<10000000;$i++) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.424592 System time: 0.004204 */
Dies dauerte etwa 1,4 Sekunden an CPU-Zeit, wobei es sich fast immer um Benutzerzeit handelte, da keine Systemaufrufe stattfanden.
Die Systemzeit ist die Zeit, die die CPU im Namen des Programms für die Ausführung von Systemaufrufen für den Kernel aufbringt. Hier ist ein Beispiel dafür:
$ start = microtime (true); // Rufe die microtime etwa 3 Sekunden lang an, während (microtime (true) - $ start) < 3) $data = getrusage(); echo "User time: ". ($data['ru_utime.tv_sec'] + $data['ru_utime.tv_usec'] / 1000000); echo "System time: ". ($data['ru_stime.tv_sec'] + $data['ru_stime.tv_usec'] / 1000000); /* prints User time: 1.088171 System time: 1.675315 */
Jetzt haben wir ziemlich viel Systemzeitverbrauch. Dies liegt daran, dass das Skript die Funktion microtime () mehrmals aufruft, wodurch eine Anforderung durch das Betriebssystem zum Abrufen der Uhrzeit ausgeführt wird.
Möglicherweise stellen Sie fest, dass die Zahlen nicht ganz bis zu 3 Sekunden addieren. Dies liegt daran, dass wahrscheinlich auch andere Prozesse auf dem Server vorhanden waren und das Skript während der gesamten 3 Sekunden keine 100% ige CPU-Auslastung hatte.
PHP bietet nützliche magische Konstanten zum Abrufen der aktuellen Zeilennummer (__LINIE__
), Dateipfad (__DATEI__
), Verzeichnispfad (__DIR__
), Funktionsname (__FUNKTION__
), Klassenname (__KLASSE__
), Methodenname (__METHOD__) und Namespace (__NAMESPACE__
).
Wir werden nicht alle in diesem Artikel behandeln, aber ich werde Ihnen einige Anwendungsfälle zeigen.
Wenn Sie andere Skripte verwenden, ist es ratsam, die
__DATEI__
konstant (oder auch__DIR__
, ab PHP 5.3):
// Dies ist relativ zum Pfad des geladenen Skripts. // Es kann zu Problemen beim Ausführen von Skripts aus verschiedenen Verzeichnissen führen. requir_once ('config / database.php'); // Dies ist immer relativ zum Pfad dieser Datei // unabhängig davon, wo sie von requir_once eingeschlossen wurde (dirname (__ FILE__). '/config/database.php');
Verwenden __LINIE__
erleichtert das Debuggen. Sie können die Zeilennummern aufspüren:
// etwas code //? my_debug ("einige Debug-Nachricht", __LINE__); / * druckt Zeile 4: einige Debug-Nachricht * / // etwas mehr Code //? my_debug ("eine andere Debug-Nachricht", __LINE__); / * druckt Zeile 11: eine weitere Debug-Nachricht * / function my_debug ($ msg, $ line) echo "Zeile $ line: $ msg \ n";
Es kann Situationen geben, in denen Sie eine eindeutige Zeichenfolge generieren müssen. Ich habe gesehen, dass viele Leute das benutzen md5 ()
Funktion dafür, obwohl es nicht genau für diesen Zweck gedacht ist:
// Generiere einen eindeutigen String echo md5 (time (). mt_rand (1,1000000));
Es gibt tatsächlich eine PHP-Funktion namens uniqid (), die dafür verwendet werden soll.
// eindeutigen String erzeugen echo uniqid (); / * druckt 4bd67c947233e * / // generiert einen anderen eindeutigen String echo uniqid (); / * druckt 4bd67c9472340 * /
Möglicherweise stellen Sie fest, dass die Zeichenfolgen zwar eindeutig sind, für die ersten Zeichen jedoch ähnlich aussehen. Dies ist darauf zurückzuführen, dass sich die generierte Zeichenfolge auf die Serverzeit bezieht. Dies hat tatsächlich einen schönen Nebeneffekt, da jede neu generierte ID später in alphabetischer Reihenfolge angezeigt wird, sodass sie sortiert werden kann.
Um die Wahrscheinlichkeit eines Duplikats zu verringern, können Sie ein Präfix oder den zweiten Parameter übergeben, um die Entropie zu erhöhen:
// mit Präfix echo uniqid ('foo_'); / * druckt foo_4bd67d6cd8b8f * / // mit mehr Entropie-Echo uniqid (", true); / * druckt 4bd67d6cd8b926.12135106 * / // beide echo uniqid ('bar _', true); / * druckt bar_4bd67da367b650.436647 * /
Diese Funktion erzeugt kürzere Zeichenfolgen als md5 ()
, Dadurch sparen Sie auch etwas Platz.
Haben Sie schon einmal eine komplexe Variable in einer Datenbank oder einer Textdatei gespeichert? Sie müssen keine ausgefallene Lösung finden, um Ihre Arrays oder Objekte in formatierte Strings zu konvertieren, da PHP hierfür bereits über Funktionen verfügt.
Es gibt zwei gängige Methoden zum Serialisieren von Variablen. Hier ist ein Beispiel, das serialize () und unserialize () verwendet:
// ein komplexes Array $ myvar = array ('Hallo', 42, Array (1, 'Zwei'), 'Apfel'); // in einen String konvertieren $ string = serialize ($ myvar); echo $ string; / * druckt a: 4: i: 0; s: 5: "hallo"; i: 1; i: 42; i: 2; a: 2: i: 0; i: 1; i: 1; s : 3: "two"; i: 3; s: 5: "apple"; * / // Sie können die ursprüngliche Variable $ newvar = unserialize ($ string) reproduzieren. print_r ($ newvar); / * druckt Array ([0] => hallo [1] => 42 [2] => Array ([0] => 1 [1] => zwei) [3] => Apfel) * /
Dies war die native PHP-Serialisierungsmethode. Da JSON jedoch in den letzten Jahren so populär geworden ist, haben sie sich dazu entschlossen, Unterstützung in PHP 5.2 hinzuzufügen. Jetzt können Sie die json_encode ()
und json_decode ()
funktioniert auch:
// ein komplexes Array $ myvar = array ('Hallo', 42, Array (1, 'Zwei'), 'Apfel'); // in einen String konvertieren $ string = json_encode ($ myvar); echo $ string; / * druckt ["Hallo", 42, [1, "zwei"], "Apfel"] * / // Sie können die Originalvariable reproduzieren. $ newvar = json_decode ($ string); print_r ($ newvar); / * druckt Array ([0] => hallo [1] => 42 [2] => Array ([0] => 1 [1] => zwei) [3] => Apfel) * /
Es ist kompakter und vor allem kompatibel mit Javascript und vielen anderen Sprachen. Bei komplexen Objekten können jedoch einige Informationen verloren gehen.
Wenn wir über Komprimierung sprechen, denken wir normalerweise an Dateien wie ZIP-Archive. Es ist möglich, lange Zeichenfolgen in PHP zu komprimieren, ohne Archivdateien einzubinden.
Im folgenden Beispiel werden wir die Funktionen gzcompress () und gzuncompress () verwenden:
$ string = "Lorem ipsum dolor sitzt amet, consectetur adipiscing elit. Nunc ut elite mi ultricies adipiscing. Nulla facilisi. Präsentieren Sie Pulvinar, Vestibulum sapien vel feugiat, Nulla dui pretium orci, nicht ultrlines elite lacus quis In diesem Fall werden Sie in der Lage sein, den Adipositas zu gewinnen non mi metus, in lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc, Etiam bei justo in leo congue mollis, nullam in neque eus metus hendrerit scelerisque eu non enim.Um Malesuada lacus eu nulla bibendum id euismodurna . "; $ komprimiert = gzcompress ($ string); Echo "Originalgröße:". strlen ($ string). "\ n"; / * druckt Originalgröße: 800 * / Echo "Komprimierte Größe:". strlen ($ komprimiert). "\ n"; / * druckt komprimierte Größe: 418 * / // es zurückbekommen $ original = gzuncompress ($ komprimiert);
Wir konnten die Größe um fast 50% reduzieren. Die Funktionen gzencode () und gzdecode () erzielen ebenfalls ähnliche Ergebnisse, indem sie einen anderen Kompressionsalgorithmus verwenden.
Es gibt eine Funktion namens register_shutdown_function (), mit der Sie Code ausführen können, bevor das Skript ausgeführt wird.
Stellen Sie sich vor, Sie möchten am Ende der Skriptausführung einige Benchmark-Statistiken erfassen, z. B. wie lange es gedauert hat:
// die Startzeit erfassen $ start_time = microtime (true); // mache was // // Anzeige, wie lange das Skript benötigt hat Echo "Ausführung dauerte:". (microtime (true) - $ start_time). "Sekunden".
Das mag zunächst trivial erscheinen. Sie fügen den Code ganz unten im Skript hinzu und werden ausgeführt, bevor er fertig ist. Wenn Sie jedoch die exit () - Funktion aufrufen, wird dieser Code niemals ausgeführt. Wenn ein schwerwiegender Fehler vorliegt oder das Skript vom Benutzer beendet wird (durch Drücken der Schaltfläche Stopp im Browser), wird es möglicherweise erneut nicht ausgeführt.
Wenn Sie register_shutdown_function () verwenden, wird der Code unabhängig von der Ausführung des Skripts ausgeführt:
$ start_time = microtime (true); register_shutdown_function ('my_shutdown'); // mache was // function my_shutdown () global $ start_time; Echo "Ausführung dauerte:". (microtime (true) - $ start_time). "Sekunden".
Kennen Sie andere PHP-Funktionen, die nicht allgemein bekannt sind, aber durchaus nützlich sein können? Bitte teile es mit uns in den Kommentaren. Und danke fürs Lesen!