So ermitteln Sie die Ausführungszeit des Skripts in PHP. PHP-Skript-Ausführungszeit

Auf welchem ​​Server auch immer Ihr Skript arbeitet, aber das Problem seiner Geschwindigkeit betrifft alle. Die Auslastung des Servers hängt davon ab (bei einigen kostenlosen Hostings wird eine bestimmte Prozessorzeit pro Monat angegeben) und der Zeit, nach der der Benutzer die Site anzeigt (und moderne Benutzer sind sehr kritisch bezüglich der Site-Ladezeit).


  Diese Geschwindigkeit kann sehr einfach mit der Funktion microtime () bestimmt werden.
  Standardmäßig gibt die Funktion eine Zeichenfolge im Format "ms" zurück, wobei sec die Anzahl der seit dem Beginn der Unix-Epoche (The Unix Epoch, 1. Januar 1970, 00:00:00 GMT) verstrichenen Sekunden ist und ms den Bruchteil darstellt.
  Wird die Funktion jedoch mit dem optionalen Parameter microtime ([bool $ get_as_float]) aufgerufen, sofern das Argument übergeben wurde   get_as_float  ist TRUE oder 1, gibt eine reelle Zahl zurück, d. h.

Echo microtime (); // wir erhalten 0,79687900 1234083984 Echo Microtime (0); // wir erhalten 0.79687900 1234083984 echo microtime (false); // wir erhalten 0,79687900 1234083984 Echo Microtime (1); // wir bekommen 1234083984.79 echo microtime (true); // wir bekommen 1234083984.79
  Daraus folgt, dass die folgende Zeile ganz am Anfang des PHP-Skripts geschrieben wurde:
  $ time_start_script = microtime (1);
  und am Ende des Skripts:
  $ time_stop_script = microtime (1); $ time_script_work = $ time_stop_script - $ time_start_script; echo $ time_script_work;

wir erhalten die Laufzeit des Skripts, die ausreicht, um die Geschwindigkeit seiner Ausführung ausreichend einzuschätzen.

Wenn Sie sich an das "Fahrrad" erinnern, können Sie Zeit mit einer Genauigkeit von bis zu 10-15 Dezimalstellen erhalten (zumindest habe ich dies je nach Ausführungszeit des Skripts getan), aber dies wirkt sich stärker auf die Ausführungszeit des Skripts aus. Im Gegensatz zum obigen Beispiel erfahren Sie jedoch eine weitere nützliche Funktion.
  Schreiben wir ganz am Anfang des PHP-Skripts eine Zeile:
  $ time_start_script = microtime (); $ time_start_script = explode ("", $ time_start_script); $ time_start_script = $ time_start_script ["0"] + $ time_start_script ["1"];
  und am Ende des Skripts:
  $ time_stop_script = microtime (); $ time_stop_script = explodieren ("", $ time_stop_script); $ time_stop_script = $ time_stop_script ["0"] + $ time_stop_script ["1"]; $ time_script_work = $ time_stop_script - $ time_start_script; echo $ time_script_work. "sec";
Dieses Beispiel brachte in meinem Fall 0.000353097915649 sek.
  Nun wollen wir sehen, was diese seltsame Funktion explode () ist.
  Array-Explosion (Zeichenfolge $ separator, Zeichenfolge $ string [, int $ limit])
  Die Funktion gibt ein Array von Strings zurück, das durch Aufteilen des Strings mit Trennzeichen als Trennzeichen erhalten wird. Wenn das Limit-Argument angegeben ist, enthält das Array ein Maximum an Limit-Elementen, wobei das letzte Element den Rest der Zeichenfolge enthält.
  Wenn separator eine leere Zeichenfolge ("") ist, gibt explode () FALSE zurück. Wenn das Trennzeichen nicht in einer Zeichenfolge enthalten ist, gibt explode () ein Array mit einem Zeichenfolgenelement zurück.
  Anwendungsbeispiel: $ pizza = "stück1 stück2 stück3 stück4 stück5 stück6"; $ pieces = explodieren ("", $ pizza); Echo $ Stücke; // piece1 echo $ pieces; // piece2
  Das ist im Grunde alles. Jetzt können Sie die Geschwindigkeit der von Ihnen geschriebenen Skripte auswerten.
  Die angehängte Datei enthält die Quellcodes der hier aufgelisteten Skripte. Damit das Skript länger ausgeführt werden kann, enthält es eine leere Schleife, die millionenfach ausgeführt wird :).
  Viel Glück!

10. Februar 2012 13 Rubrik :,

Manchmal müssen Sie die Geschwindigkeit der Ausführung eines Skripts (oder eines Teils des Skripts) genau beachten, nicht nur Ihre kurzen, geschulten Augen. Das ist der Moment, an dem PHP-Funktionen zur Messung der Download-Geschwindigkeit zur Rettung kommen. Sie haben sie wahrscheinlich benutzt, und im Allgemeinen wissen Sie, wie es geht. Nur für den Fall, für diejenigen, die nicht wissen, wie es geht, sowie für den Abschnitt "Wichtige Kleinigkeiten", gebe ich den einfachsten Code, der dieses Problem löst.

$ start = microtime (true);
// Skriptkörper
echo "Skriptausführungszeit:" (microtime (true) - $ start). "sec.";

Alles ist verrückt. In der ersten Zeile erstellen wir eine Variable mit einer Startzeit. Es wird durch die Funktion erreicht mikrotime  with übergeben true - Damit können Sie die Anzahl der Sekunden mit einer großen Anzahl von Dezimalstellen ermitteln. Zeit übrigens im Unix-Format.

Als nächstes kommt der gesamte Skriptcode. Danach ziehen wir in der dritten Zeile den Start des Skripts und der voila von der aktuellen Uhrzeit ab - Sie haben die Zeit, das PHP-Skript mit der Genauigkeit des Dezimalzeichens auszuführen.


Wie lange funktionieren "schwere" Skripts weiterhin, wenn nicht auf das Ende ihrer Arbeit gewartet wird, um den Browser zu schließen? Und werden sie ihre Arbeit fortsetzen? Wie die Beobachtungen gezeigt haben, leben sie weiter und versuchen, die ihnen zugewiesene Arbeit zu erledigen. Viele, um diese Art von Zeit zu kontrollieren, greifen das "dunkle" Leben der Skripte auf Schreibanweisungen zurück

ignore_user_abort (boolescher Modus)

Wenn diese Anweisung mit aufgerufen wird falsch  Parameter entspricht es seiner Abwesenheit. Normalerweise wird es mit dem Parameter angegeben wahr - ignore_user_abort (true). Dies ist in Fällen erforderlich, in denen Sie das Skript fortsetzen müssen, auch wenn der Browser die Verbindung getrennt hat. Im Allgemeinen kann PHP den Verbindungsstatus verfolgen. Ich interessierte mich für die Situation mit der Fortsetzung des Skripts, auch nachdem das Browserfenster geschlossen wurde. Es ist sehr einfach zu überprüfen: Schreiben Sie ein Skript, das für eine Weile ausgeführt wird, starten Sie es und schließen Sie das Browserfenster, bevor das Skript beendet wird. Vergessen Sie nicht, eine Abschaltmarkierung im Skript hinzuzufügen, beispielsweise eine Datei zu erstellen. So können Sie die Leistung Ihres Skripts nachverfolgen. Nach Abschluss der Sitzung des Agenten (Browsers) sollte das Skript generell beendet werden. Wie Sie jedoch sehen können, ist dies nicht ganz der Fall: Es versucht immer noch, länger zu leben. In diesem Fall ist es sinnvoll, ihn in die Hintergrundausführung (cron) zu übertragen. Es war jedoch immer noch interessant, diese Funktion zu analysieren. Die Anweisung wird verwendet, um den Verbindungsstatus zu verfolgen. verbindungsstatus (). Für weitere Manipulationen wurden Wrapper geschrieben:

// Rückgabecode des Verbindungsstatus
function getConnectStatus () (
  return Verbindungsstatus ();
}

// Rückgabetyp des Verbindungsstatus anhand des Codes
funktion getConnectStatusByCode ($ connectionStatus) (
  Schalter ($ connectionStatus) (
  case CONNECTION_NORMAL:
  $ status = "Normal";
  brechen;
  case CONNECTION_ABORTED:
  $ status = "Benutzerabbruch";
  brechen;
  case CONNECTION_TIMEOUT:

  $ status = "Maximale Ausführungszeit überschritten";
  brechen;
  case (CONNECTION_ABORTED & CONNECTION_TIMEOUT):
  $ status = "Abgebrochen und abgelaufen";
  brechen;
  Standard:
  $ status = "unbekannt";
  brechen;
}
  $ status zurückgeben;
}



}

Jetzt können Sie eine Funktion schreiben, die jede lange Arbeit simuliert

// Nachahmung eines langen Skripts
funktion scriptImitation () (

  $ start = time ();

  $ limitIteration = 1.000.000;
  für ($ i = 0; checkConnectionStatus () && ($ i< $limitIteration); $i++) {
  // etwas lange arbeit ...
}

  $ end = time ();
  $ runTime = $ end - $ start;

If ($ i === $ limitIteration ||! CheckConnectionStatus ()) (
  $ connectStatus = getConnectStatusByCode (getConnectStatus ());
  $ scriptImitationLog = "Verbindungsstatus: $ connectStatus";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "Iteration: $ i";
  $ scriptImitationLog. = ";";
  $ scriptImitationLog. = "Laufzeit: $ runTime second";

File_put_contents ("scriptImitationLog.txt", $ scriptImitationLog);
}

Eigentlich beginnen wir regelmäßig damit, die Arbeit an unserem Skript einzustellen. Egal wie schnell ich versuchte, das Agentenfenster zu schließen, das Skript funktionierte immer noch erfolgreich und an der Ausgabe wurde ein Protokoll erstellt. Vergiss das nicht max_execution_time, länger als diese Zeit wird das Skript einfach nicht leben. In unserem Fall wurde er erhöht. Schauen wir uns das Protokoll an:

Verbindungsstatus: Normal; Iteration: 1.000.000; Laufzeit: 5 Sekunden

Wie Sie sehen, ist die Verbindung normal, der Zyklus hat bis zum Ende funktioniert. Also, was ist der Deal? In diesem Artikel über stackoverflow  Ich habe diese Lösung gefunden - http://stackoverflow.com/questions/2389035/php-connection-status. Und es wurde mit dem Ausgabepuffer verbunden: In regelmäßigen Abständen wird ein kleiner Teil der Daten (z. B. ein leeres Zeichen) in den Ausgabepuffer des Skripts geschrieben und dann zurückgesetzt (normalerweise bedeutet PHP, dass der gesamte Inhalt gesendet und anschließend gelöscht wird). Hierzu wird vorgeschlagen, die gemeinsame Nutzung von Funktionen zu nutzen. ob_flush  und spülung. Und da zum Zurücksetzen eine Verbindung impliziert wird (der Puffer ist so ausgebildet, dass er in Richtung Browser - Initiator gesendet wird), wird beim nächsten Zurücksetzen, wenn keine normale Verbindung besteht, sein Status in einen anderen Status übertragen ( Benutzer abgebrochen). Und wenn das Skript keine Anweisungen enthält oder im Formular angegeben ist

ignore_user_abort (false);

Wenn sich der normale Verbindungsstatus ändert, wird das Skript sofort beendet, wenn eine Anweisung vorliegt

ignore_user_abort (true);

Selbst wenn sich der Verbindungsstatus ändert, wird das Skript bis zum Ende weiter ausgeführt. In diesem Fall kann der Verbindungsstatus jedoch überwacht werden. In diesem Sinne modifizieren wir eine der Umhüllungen geringfügig.

// den Verbindungsstatus überprüfen (true - normal, false - abnormal)
funktion checkConnectionStatus () (
  print "";
  ob_flush ();
  Flush ();
  return connection_status () === 0;
}

Jetzt ist alles unter Kontrolle und in Fällen, in denen wir unseren Browser schließen, wird das Skript ausgesetzt oder ein anderes Verhalten kann organisiert werden.
  Zum Schluss werde ich die Ergebnisse einer weiteren Beobachtung geben. Wenn Sie die Laufzeit des Skripts in den Protokollen vergleichen, bevor Sie Änderungen vornehmen, und später im Wrapper - checkConnectionStatus,
  Daraus kann geschlossen werden, dass das Zurücksetzen des Ausgabepuffers sehr lange dauert. Die Zeit für eine Iteration im Testskript ohne Zurücksetzen des Puffers dauerte also durchschnittlich - 0,005 msmit Reset - 0,028 msd. h. eine durchschnittliche Pufferbereinigung dauerte 0,023 msdas in 4,6 mal mehr als eine Iteration. Dies zeigt, dass das obige Verfahren zum Nachverfolgen der Lebensdauer von "schweren" Skripten die Hauptzeit verlängern kann. Dieser Test wurde mit Firefox Version 29.0.1 durchgeführt. Alles Erfolg.

Beim Debuggen von Skripten ist ein zwingender Faktor, der in erster Linie berücksichtigt werden muss skriptausführungszeit. Und in diesem kurzen Artikel zeige ich Ihnen einen sehr guten und einfachen Weg. so ermitteln Sie die Ausführungszeit des Skripts.

Es basiert auf Funktionen zum Arbeiten mit Datum und Uhrzeit. Ich schlage vor, ein Beispiel zu betrachten, damit Sie verstehen, wie es geschieht. skriptausführungszeit:

   $ start = microtime (true);
   $ summe = 0;
   für ($ i = 0; $ i< 100000; $i++) $sum += $i;
   echo "Skriptausführungszeit:" (microtime (true) - $ start);
?>

Als Ergebnis werden wir das sehen skriptausführungszeit  zum Beispiel wird sein: " 0.014652967453 ". Wenn Sie es abrunden, dann diese 0.015   Sekunden Dies ist die Ausführungszeit des Skripts.

Nun wie es funktioniert. Funktion microtime ()  mit übertragenem Wert wahr  gibt die Anzahl der Sekunden seit Mitternacht zurück 01.01.1970 und dieser Wert wird auf Hundertstelsekunden berechnet.

Als nächstes kommt das übliche Skript, das wir überprüfen. Stattdessen wird es sicherlich Ihr Skript sein. Die letzte Zeile ist die Differenz zwischen der aktuellen Uhrzeit (nachdem das Skript ausgeführt wurde) und der Zeit, die wir zu Beginn des Skripts aufgezeichnet haben. Der Zeitunterschied nach der Ausführung des Skripts und die Zeit vor dem Start des Skripts skriptausführungszeit.

Ich denke hier ist alles einfach. Ich empfehle jedoch dringend, dass Sie diese Methode zur Zeitberechnung verwenden. Als ich zum Beispiel die Arbeit meiner Engine debuggen konnte, auf der diese Site steht, beschleunigte ich seine Arbeit fast 2   mal

Unabhängig davon, wie viel wir PHP verwenden, tauchen immer noch einige Funktionen auf, von denen wir noch nicht einmal gehört haben. Einige davon wären für uns sehr nützlich. Ich habe eine kleine Liste von nützlichen Funktionen erstellt, die jedem PHP-Programmierer zur Verfügung stehen sollten.

1. Erstellen von Funktionen mit einer variablen Anzahl von Argumenten

Höchstwahrscheinlich wissen Sie bereits, dass wir mit PHP Funktionen mit optionalen Argumenten erstellen können. Nun werde ich eine Funktion zeigen, bei der die Anzahl der Argumente von Fall zu Fall variieren kann.

Aber zunächst wollen wir uns daran erinnern, wie wir Funktionen auf die übliche Weise erstellen:

  // Funktion mit zwei optionalen Parametern function foo ($ arg1 = "", $ arg2 = "") (echo "arg1: $ arg1 \\ n"; echo "arg2: $ arg2 \\ n";) foo ("hallo", "Welt"); / * wird ausgegeben: arg1: hallo arg2: world * / foo (); / * gibt aus: arg1: arg2: * /

Schauen wir uns nun an, wie Sie eine Funktion mit einer unbegrenzten Anzahl von Argumenten schreiben können. Verwenden Sie dazu die Methode func_get_args ():

  // Keine Argumente angeben function foo () (// gibt ein Array der übergebenen Argumente zurück $ args = func_get_args (); foreach ($ args als $ k =\u003e $ v) (Echo "arg". ($ k + 1). " : $ v \\ n ";)) foo (); / * gibt nichts aus * / foo ("hallo"); / * druckt arg1: hallo * / foo ("hallo", "world", "again"); / * druckt arg1: hallo arg2: world arg3: wieder * /

2. Suchen Sie mit Glob () nach Dateien.

Oft sprechen die Funktionsnamen für sich. Dies kann nicht über die Funktion glob () gesagt werden.

Ohne auf Details einzugehen, ähnelt seine Funktionalität der scandir () -Methode. Es ermöglicht Ihnen zu finden benötigte Datei  nach Muster:

  // Finde alle php-Dateien $ files = glob ("*. php"); print_r ($ files); / * wird ausgegeben: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php) * /

Um Dateien verschiedener Typen zu finden, schreiben Sie Folgendes:

  // Finde alle php- und txt-Dateien $ files = glob ("*. (php, txt)", GLOB_BRACE); print_r ($ files); / * output: Array (=\u003e phptest.php =\u003e pi.php =\u003e post_output.php =\u003e test.php =\u003e log.txt =\u003e test.txt) * /

Sie können den Pfad auch in der Vorlage angeben:

  $ files = glob ("../ images / a * .jpg"); print_r ($ files); / * output: Array (=\u003e ../images/apple.jpg =\u003e ../images/art.jpg) * /

Um den vollständigen Pfad zum Dokument zu erhalten, verwenden Sie die Methode realpath ():

  $ files = glob ("../ images / a * .jpg"); // Wende die Funktion "realpath" auf jedes Element des Arrays an $ files = array_map ("realpath", $ files); print_r ($ files); / * zeigt an: Array (=\u003e C: \\ wamp \\ www \\ images \\ apple.jpg =\u003e C: \\ wamp \\ www \\ images \\ art.jpg) * /

3. Informationen zum verwendeten Speicher

Wenn Sie den Speicherplatz nachverfolgen, der durch die Arbeit Ihrer Skripts verbraucht wird, werden Sie sie wahrscheinlich öfter optimieren.

In PHP gibt es ein leistungsfähiges Werkzeug zur Speicherüberwachung. In verschiedenen Teilen des Skripts kann das Laden unterschiedlich sein. Um den Wert des momentan verwendeten Speichers abzurufen, müssen Sie die memory_get_usage () -Methode verwenden. Zur Festlegung der maximal verwendeten Speichergröße memory_get_peak_usage ()

Echo "Initial:" .memory_get_usage (). "Bytes \\ n"; / * Initial: 361400 Bytes * / // geben eine kleine Last für ($ i = 0; $ i< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Prozessorinformationen

Verwenden Sie dazu die getrusage () -Methode. Beachten Sie jedoch, dass diese Funktion unter Windows nicht funktioniert.

Print_r (getrusage ()); / * druckt Array (=\u003e 0 =\u003e 0 =\u003e 2 =\u003e 3 =\u003e 12692 =\u003e 764 =\u003e 3864 =\u003e 94 =\u003e 0 =\u003e 1 =\u003e 67 =\u003e 4 =\u003e 0 =\u003e 0 =\u003e 0 =\u003e 6269 =\u003e 0) * /

Das oben umrissene Bild wird denjenigen klar sein, die Erfahrung in der Systemadministration haben. Für alle anderen bieten wir Dekodierung an:

  • ru_oublock: Die Anzahl der Blockschreibvorgänge
  • ru_inblock: Die Anzahl der Blockleseoperationen
  • ru_msgsnd: die Anzahl der gesendeten Nachrichten
  • ru_msgrcv: Anzahl der empfangenen Nachrichten
  • ru_maxrss: Die maximale Größe einer nicht-paggierten Menge
  • ru_ixrss: Gesamter gemeinsam genutzter Speicher
  • ru_idrss: Gesamtmenge der nicht gemeinsam genutzten Daten
  • ru_minflt: Die Anzahl der verwendeten Speicherseiten
  • ru_majflt: Anzahl der fehlenden Seiten
  • ru_nsignals: die Anzahl der empfangenen Signale
  • ru_nvcsw: Anzahl der Kontextwechsel nach Prozess
  • ru_nivcsw: Die Anzahl der erzwungenen Kontextwechsel
  • ru_nswap: Die Anzahl der Festplattenzugriffe beim Paging
  • ru_utime.tv_usec: Benutzermoduszeit (Mikrosekunden)
  • ru_utime.tv_sec: Benutzermodus (Sekunden)
  • ru_stime.tv_usec: Zeit im privilegierten Modus (Mikrosekunden)
  • ru_stime.tv_sec: Zeit im privilegierten Modus (Sekunden)

Um herauszufinden, welche Ressourcen Ihr Prozessor das Skript verwendet, benötigen Sie den Wert "Benutzerzeit" (Zeit im Benutzermodus) und "Systemzeit" (Zeit im privilegierten Modus). Sie können das Ergebnis in Sekunden und Mikrosekunden erhalten. Um die Gesamtzahl der Sekunden in eine Dezimalzahl umzuwandeln, müssen Sie den Wert in Mikrosekunden durch 1 Million teilen und zum zweiten Wert addieren.

Irgendwie verwirrt. Hier ist ein Beispiel:

  // Pause 3 Sekunden schlafen (3); $ data = getrusage (); echo "Benutzerzeit:". ($ data ["de_utime.tv_sec"] + $ data ["de_utime.tv_usec"] / 1.000.000); Echo "Systemzeit:". ($ data ["ru_stime.tv_sec"] + $ data ["ru_stime.tv_usec"] / 1.000.000); / * zeigt Benutzerzeit: 0.011552 Systemzeit: 0 * /

Obwohl das Skript ungefähr 3 Sekunden benötigte, war der Prozessor nicht stark ausgelastet. Tatsache ist, dass das Skript beim Aufruf (sleep) fast keine CPU-Ressourcen verbraucht. Im Allgemeinen gibt es viele Aufgaben, die viel Zeit in Anspruch nehmen, jedoch keinen Prozessor verwenden. Zum Beispiel: Warten auf Vorgänge, die der Festplatte zugeordnet sind. Daher verwenden Sie in Ihren Skripten nicht immer CPU-Zeit.

Hier ist ein anderes Beispiel:

  // 10 Millionen Mal laufen 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); /* выводит User time: 1.424592 System time: 0.004204 */

Das Skript benötigte 1,4 Sekunden CPU-Zeit. In diesem Fall ist die Systemaufrufzeit im Allgemeinen niedrig.

Die Betriebszeit im privilegierten Modus (System Time) ist die Zeit, die der Prozessor für die Ausführung von Systemanforderungen an den Kernel im Auftrag des Programms aufbringt. Beispiel:

  $ start = microtime (true); // alle 3 Sekunden microtime aufrufen, 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); /* выводит User time: 1.088171 System time: 1.675315 */

Nun wurde die Systemzeit viel mehr aufgewendet als im vorherigen Beispiel. Alles dank der Methode microtime (), die Systemressourcen verwendet.

Es ist jedoch zu beachten, dass die angezeigte Zeit möglicherweise nicht genau ist, weil Zu diesem Zeitpunkt werden CPU-Ressourcen von anderen Programmen verwendet, was zu einem kleinen Fehler führen kann.

5. Magiekonstanten

Es gibt viele magische Konstanten in PHP, z. B. die aktuelle Zeilennummer (__LINE__), den Dateipfad (__FILE__), den Verzeichnispfad (__DIR__), den Funktionsnamen (__FUNCTION__), den Klassennamen (__CLASS__), den Methodennamen (__METHOD__) und den Namespace (__NAMESPACE__).

Wir werden sie alle nicht berücksichtigen. Lass uns nur ein paar sehen:

  // Dieses Skript hängt vom aktuellen Speicherort der Datei ab und // kann Probleme verursachen, wenn es aus verschiedenen Verzeichnissen verwendet wird. requir_once ("config / database.php"); // Dieses Skript verursacht keine Probleme. requir_once (dirname (__ FILE__). "/config/database.php");

Verwenden Sie __LINE__, um Skripte zu debuggen:

  // code // ... mein_debug ("einige debug-nachricht", __LINE__); / * gibt Zeile 4 aus: einige Debug-Nachricht * / // ein anderer Code // ... my_debug ("eine andere Debug-Nachricht", __LINE__); / * gibt Zeile 11 aus: eine andere Debug-Nachricht * / function my_debug ($ msg, $ line) (Echo "Line $ line: $ msg \\ n";)

6. Generieren von eindeutigen IDs

Es kann vorkommen, dass Sie eine eindeutige Zeichenfolge generieren müssen. Ich habe oft gesehen, dass die Funktion md5 () verwendet wird, um dieses Problem zu lösen:

  // ein zufälliges String-Echo erzeugen md5 (time (). mt_rand (1.1000000));

Tatsächlich gibt es in PHP jedoch eine spezielle Funktion uniqid ().

  // einen zufälligen String erzeugen echo uniqid (); / * druckt 4bd67c947233e * / // noch einmal echo uniqid (); / * gibt 4bd67c9472340 aus * /

Mit dem bloßen Auge können Sie sehen, dass die ersten Zeichen leicht ähnlich ausgedrückt sind ... Dies liegt daran, dass diese Methode Serverzeit verwendet, um Zeichen zu generieren. Es ist sogar nützlich, weil Alle generierten Werte werden in alphabetischer Reihenfolge abgerufen, so dass sie schnell sortiert werden können.

Um die Wahrscheinlichkeit eines Duplikats zu verringern, können Sie ein Präfix hinzufügen oder den zweiten Parameter verwenden (erhöhen Sie die Anzahl der Zeichen):

  // mit dem Präfix echo uniqid ("foo_"); / * wird foo_4bd67d6cd8b8f * / // mit dem zweiten Parameter echo uniqid ("", true) ausgeben. / * gibt 4bd67d6cd8b926.12135106 aus * / // beide echo uniqid ("bar _", true); / * druckt bar_4bd67da367b650.43684647 * /

Diese Methode erzeugt Zeilen, die kleiner als MD5 sind, und spart so Platz.

7. Serialisierung

Haben Sie schon einmal komplexe Daten in einer Datenbank oder in einer Datei gespeichert? Um ein Objekt in PHP in einen String zu konvertieren, wird eine spezielle Funktion bereitgestellt.

Im Allgemeinen sind diese Methoden 2: serialize () und unserialize ()

  // komplexes Array $ myvar = Array ("Hallo", 42, Array (1, "Zwei"), "Apfel"); // in String konvertieren $ string = serialize ($ myvar); echo $ string; / * zeigt 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";) * / // wir erhalten den Ausgangswert $ newvar = unserialize ($ string); print_r ($ newvar); / * zeigt Array an (=\u003e Hallo =\u003e 42 =\u003e Array (=\u003e 1 =\u003e zwei) =\u003e Apfel) * /

So funktionieren diese Funktionen. Aufgrund des schnellen Wachstums der Popularität von JSON wurden PHP 2 jedoch um 2 PHP-Methoden json_encode () und json_decode () erweitert. Ihre Arbeit ist ähnlich zu serialize ():

  // komplexes Array $ myvar = Array ("Hallo", 42, Array (1, "Zwei"), "Apfel"); // in String konvertieren $ string = json_encode ($ myvar); echo $ string; / * gibt ["Hallo", 42 ,, "Apfel"] * / // den ursprünglichen Wert aus. $ newvar = json_decode ($ string); print_r ($ newvar); / * druckt Array (=\u003e Hallo =\u003e 42 =\u003e Array (=\u003e 1 =\u003e zwei) =\u003e Apfel) * /

Diese Option ist kompakter und mit anderen Sprachen wie JavaScript kompatibel. Bei sehr gehäuften Objekten kann es jedoch zu Datenverlust kommen.

8. Zeilen komprimieren

Wenn wir über Komprimierung sprechen, fallen mir sofort ZIP-Archivdateien ein. PHP bietet die Möglichkeit, lange Zeilen ohne Dateien zu komprimieren.

Im folgenden Beispiel wird die Funktionsweise der Funktionen gzcompress () und gzuncompress () veranschaulicht:

$ string = "Lorem ipsum dolor sitzt amet, consectetur adipiscing elit. Nunc ut elit mi ultricies adipiscing. Nulla facilisi. Präsentieren Sie Pulvinar, Vestibulum sapien vel feugiat, Nulla dui pretium orci, nicht ultrlines elite lius quis ante, anethyte. Adipiscing elit.Aliquam pretium ullamcorper urna quis iaculis, Etiam ac massa sed turpis tempor luctus, curabitur sed nibh eu elit mollis congue. ornare in mollis, ornare in mollis, ornare in mollis, mienis inn, motten inn, mienis inn, miriusis inn eutomi, ud malesuada lacus ein nulla in neutet eup metus hendreritescelerisque eu non enim. . "; $ compress = gzcompress ($ string); Echo "Originalgröße:". strlen ($ string). "\\ n"; / * zeigt Originalgröße: 800 * / Echo "Komprimierte Größe:". strlen ($ komprimiert). "\\ n"; / * print Komprimierte Größe: 418 * / // return $ original = gzuncompress ($ komprimiert);

Wir können die Textmenge um 50% reduzieren. Zu demselben Zweck können Sie die Methoden gzencode () und gzdecode () verwenden, die einen anderen Kompressionsalgorithmus verwenden.

9. Führen Sie vor dem Abschluss aus

In PHP gibt es eine register_shutdown_function () - Funktion, mit der Sie vor dem Beenden des Skripts Code ausführen können.

Angenommen, Sie möchten einige Informationen herausfinden ... Skriptlaufzeit:

  // Holen Sie sich die Startzeit $ start_time = microtime (true); // einige Operationen // ... // Anzeige des Laufzeitechos "Ausführung nahm an:". (microtime (true) - $ start_time). "Sekunden".

Auf den ersten Blick mag dies eine triviale Aufgabe sein. Zu diesem Zweck können Sie den Code am Ende der Datei einfügen. Wenn jedoch vorher die exit () - Funktion irgendwo funktioniert, wird dieser Code niemals funktionieren. Es funktioniert auch nicht, wenn auf der Seite ein Fehler auftritt oder der Benutzer das Laden der Seite unterbricht (durch Klicken auf die entsprechende Schaltfläche in Ihrem Browser).

Bei Verwendung der register_shutdown_function () -Methode wird der Code trotzdem ausgeführt:

  $ start_time = microtime (true); register_shutdown_function ("my_shutdown"); Funktion my_shutdown () (global $ start_time; Echo "Ausführung dauerte:". (microtime (true) - $ start_time). "Sekunden".);

Fazit

PHP ist ein ganzer Planet, der uns immer wieder mit seinem Inhalt überrascht. Was denkst du über diese Funktionen?

Fortsetzung des Themas:
Geräte

Die vielleicht peinlichste Falle, die ein zukünftiger Tablet-Benutzer beim Kauf befriedigen kann, ist eine Fälschung. Eines der beliebtesten Modelle zum Kopieren ...