Heim  >  Artikel  >  Backend-Entwicklung  >  Der Fehler, den ich immer mache, wenn ich include_once anstelle von include verwende

Der Fehler, den ich immer mache, wenn ich include_once anstelle von include verwende

黄舟
黄舟Original
2017-06-25 11:47:322262Durchsuche

Ich verwende include_once, seit ich den Unterschied zwischen include und include_once gelernt habe. Ich denke, es wird nur einmal geladen und kann Vermeiden Sie wiederholtes Laden. Und es scheint, dass ich nicht feststellen kann, ob es wiederholt geladen wurde. Es stellt sich heraus, dass ich die ganze Zeit falsch lag.

Wenn das Projekt von mehreren Personen entwickelt wird, ist include_once tatsächlich besser

include_once Ausführungssequenz

Versuchen Sie, den absoluten Pfad der Datei zu analysieren. Überprüfen Sie, ob EG (included_files) vorhanden ist. Wenn vorhanden, geben Sie es zurück. Wenn nicht, fahren Sie mit der Kompilierung fort file (compile_file

In letzter Zeit hatten wir mehrere Diskussionen über die Entfernung von apc.include_once_override, und dieses APC-Konfigurationselement wurde immer nicht gut implementiert.

Hier, Ich möchte Ihnen die Gründe für dieses Problem und einige Inspirationen für uns mitteilen.

Über die Verwendung von include oder include_once (im Folgenden alle enthalten require_once) wurde diese Diskussion geführt lang, und die Schlussfolgerung war immer, dass versucht wurde, include anstelle von include_once zu verwenden. Der häufigste Grund in der Vergangenheit war, dass include_once die geladene Dateiliste abfragen, bestätigen musste, ob sie existiert, und sie dann erneut laden musste.

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

Wir wissen, dass PHP bestimmt, ob die Datei geladen wird, indem sie den open_path der Datei benötigt, was zum Beispiel bedeutet :

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

Wenn PHP include_once „2.php“ sieht, kennt es den tatsächlichen Speicherort der Datei nicht und kann nicht beurteilen, ob sie aus der geladenen Datei geladen wurde Daher wird bei der Implementierung von include_once zunächst versucht, den tatsächlichen Pfad der Datei zu analysieren (bei gewöhnlichen Dateien ähnelt diese Analyse lediglich der Überprüfung von getcwd und dem Dateipfad. Wenn es sich also um einen relativen Pfad handelt, wird dies im Allgemeinen nicht der Fall sein Wenn das Parsen erfolgreich ist, suchen Sie nach EG (include_files), was bedeutet, dass es eingebunden wurde, und geben Sie andernfalls den open_path der Datei ab Datei existiert in "/tmp2/2.php".

Dann geht PHP nach dem Abrufen des open_path zur Liste der geladenen Dateien, um herauszufinden, ob sie enthalten ist. Wenn nicht, kompilieren Sie die Datei direkt .

1. Wenn das Parsen erfolgreich ist, überprüfen Sie EG (included_files), geben Sie es zurück, wenn es nicht existiert, und fahren Sie fort Rufen Sie den offenen Pfad der Datei ab und suchen Sie ihn in EG (included_files), um zu sehen, ob er existiert. Wenn er nicht existiert, fahren Sie fort. compile_file

In den meisten Fällen ist dies kein Problem, aber das Problem ist, wenn Sie APC verwenden...

Bei der Verwendung von APC entführt APC den Compile_File-Zeiger der kompilierten Datei , wodurch das Kompilierungsergebnis direkt aus dem Cache abgerufen wird, das Öffnen der eigentlichen Datei vermieden wird und

Wenn Sie jedoch include_once in Ihrem Code verwenden, hat PHP vor der Kompilierung der Datei bereits versucht, die Datei zu öffnen, und ist dann eingetreten Die Kompilierungsdatei wurde von APC gekapert, daher wird ein zusätzlicher Öffnungsvorgang durchgeführt. Wenn include_once_override aktiviert ist, kapert APC den Opcode-Handler ZEND_INCLUDE_OR_EVAL von PHP und ermittelt den absoluten Pfad der Datei über stat Wenn dann festgestellt wird, dass es nicht geladen ist, Schreiben Sie einfach den Opcode neu, um ihn einzuschließen, und erstellen Sie eine knifflige Lösung.

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

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

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

<?phpclass B {}?>

Wenn dann apc.include_once_override aktiviert ist, werde ich kontinuierlich darauf zugreifen Ich habe die folgende Fehlermeldung erhalten:

Fatal error - include() : Cannot redeclare class

(Postscript 2012-09-15 02:07:20: Ich habe diesen APC-Fehler behoben: #63070)

Abgesehen von diesen technischen Faktoren war ich immer der Meinung, dass wir include anstelle von include_once verwenden sollten, da wir vollständig selbst planen können und eine Datei nur einmal geladen wird. Wir können auch Laden Sie dazu automatisch.

Wenn Sie include_once verwenden, beweist dies nur, dass Sie kein Vertrauen in Ihren Code haben.

Ich empfehle Ihnen daher, include_once nicht zu verwenden >

Das obige ist der detaillierte Inhalt vonDer Fehler, den ich immer mache, wenn ich include_once anstelle von include verwende. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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