Heim > Backend-Entwicklung > PHP-Tutorial > Es wird empfohlen, include_once (require_once) so oft wie möglich nicht zu verwenden

Es wird empfohlen, include_once (require_once) so oft wie möglich nicht zu verwenden

黄舟
Freigeben: 2023-03-11 12:32:02
Original
2175 Leute haben es durchsucht

Dieser Artikel ist eine detaillierte Analyse und Einführung in die Gründe, warum Sie (include/require)_once nicht verwenden sollten. Freunde in Not können sich auf

beziehen Über die Verwendung von Include oder include_once (im Folgenden: alle include require_once) Diese Diskussion war lang und die Schlussfolgerung war immer, dass include anstelle von include_once verwendet werden sollte Der häufigste Grund war, dass include_once die geladene Dateiliste abfragen, bestätigen, ob sie existiert, und sie dann erneut laden muss.

Zugegebenermaßen ist dieser Grund richtig, aber worüber ich sprechen möchte Heute ist ein weiterer Grund.

Wir wissen, dass PHP den open_path der Datei abrufen muss, um festzustellen, ob eine Datei geladen ist, was zum Beispiel bedeutet:

Code kopieren Der Code lautet wie folgt:

<?php
set_include_path
("/tmp/:/tmp2/");
include_once("2.php");
?>
Nach dem Login kopieren


Wenn PHP include_once „2.php“ sieht, weiß es nicht, was der tatsächliche Pfad dieser Datei ist, und Es kann nicht aus der geladenen Dateiliste abgerufen werden, um festzustellen, ob sie geladen wurde. Daher wird bei der Implementierung von include_once zunächst versucht, den tatsächlichen Pfad der Datei zu analysieren (bei normalen Dateien ähnelt diese Analyse der Überprüfung von getcwd und der Dateipfad, wenn es sich also um einen relativen Pfad handelt, ist dies im Allgemeinen nicht möglich. Wenn die Analyse erfolgreich ist, suchen Sie nach EG (include_files). file, um den open_path der Datei abzurufen. Im obigen Beispiel existiert diese Datei beispielsweise in „/tmp2/2.php“.

Dann geht PHP nach dem Abrufen des open_path zur Liste der geladenen Dateien Um herauszufinden, ob es enthalten ist, kompilieren Sie es direkt und es ist nicht mehr erforderlich, die Datei zu öffnen.

1 Versuchen Sie, den absoluten Pfad der Datei zu analysieren. Wenn das Parsen erfolgreich ist, überprüfen Sie EG (included_files), kehren Sie zurück, wenn es nicht existiert.
Öffnen Sie die Datei und rufen Sie den offenen Pfad ab.
3 an EG (included_files), um herauszufinden, ob sie existiert. Wenn sie nicht existiert, fahren Sie mit der Kompilierung der Datei (compile_file) fort.

Dies wird in den meisten Fällen verwendet Als nächstes ist es kein Problem, aber das Problem liegt bei der Verwendung von APC...

Bei der Verwendung von APC entführt APC den Compile_File-Zeiger der kompilierten Datei und erhält so das Kompilierungsergebnis direkt aus dem Cache Die Notwendigkeit, die eigentliche Datei zu öffnen, vermeidet den Systemaufruf zum Öffnen.

Wenn Sie jedoch include_once im Code verwenden, hat PHP vor der Kompilierung der Datei bereits versucht, die Datei zu öffnen, und ist dann in den entführten Prozess eingetreten Durch die Kompilierung der APC-Datei wird ein zusätzlicher Öffnungsvorgang generiert. Wenn include_once_override aktiviert ist, übernimmt APC den ZEND_INCLUDE_OR_EVAL-Opcode-Handler und ermittelt den absoluten Pfad der Datei Wenn festgestellt wird, dass es nicht geladen wurde, schreiben Sie den Opcode neu, um ihn einzuschließen, und finden Sie eine knifflige Lösung.

Aber leider war die include_once_override-Implementierung von APC, wie gesagt, nicht gut, daher wird es einige undefinierte geben Probleme wie:


Code kopierenDer Code lautet wie folgt:

<?php
set_include_path("/tmp");
function a($arg = array()) {
    include_once("b.php");
}
a();
a();
?>
Nach dem Login kopieren

Dann wird unser b.php in „ /tmp/b.php“, der Inhalt lautet wie folgt:

Der Code lautet wie folgt:

<?php
  class B {}
?>
Nach dem Login kopieren

Wenn dann apc.include_once_override aktiviert ist, Bei kontinuierlichem Zugriff erhalte ich die folgende Fehlermeldung:

Fatal error - include() : Cannot redeclare class b

Abgesehen von diesen technischen Faktoren habe ich immer gedacht, dass wir include anstelle von include_once verwenden sollten. weil wir die Planung vollständig selbst durchführen können und eine Datei nur einmal geladen wird. Sie können dazu auch

automatisches Laden verwenden.

Wenn Sie include_once verwenden, beweist dies nur, dass Sie dies getan haben Keine Kontrolle über Ihren Code.

Daher empfehle ich Ihnen, include_once nicht zu verwenden

Das obige ist der detaillierte Inhalt vonEs wird empfohlen, include_once (require_once) so oft wie möglich nicht zu verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage