Technische Frage zu PHP

qsrs

Erfahrenes Mitglied


Hallo,

ich habe ein Script, welches in mehrere Dateien aufgegliedert ist. Eine Sprachdatei, wird in jede Datei mit include(); geladen. In der Sprachdatei werden Wörter, Sätze etc. in Variablen gespeichert. Die Sprachdatei ist relativ groß. Nun frage ich mich, wie PHP damit umgeht. Wird der komplette Inhalt der Sprachdatei, also auch die komplette Datei, geladen wenn Sie mit include verfügbar gemacht wird, oder nur das, was letztlich an den Browser mit echo ausgegeben wird?

Ich überlege mir auch, was z.B. bei großen Scripten sinnvoller ist. Teilt man es in viele kleinere Dateien auf, oder verwendet man eine große Datei und ruft Funktionen z.B. mit action=delete auf? Wenn ich quasi ein komplettes Script auf eine Datei beschränken würde, die Funktionen aber immer nur einen Teil des Inhaltes aufrufen, wird dann dennoch die komplette Datei geladen, oder immer nur der Teil der über den Browser ausgegeben wird?

Ich frage auch wegen der Ladezeiten. Wenn dann einzelne Dateien bis zu 500 KB groß werden und jedes Mal der komplette Inhalt geladen wird, wird das Script doch relativ langsam, oder?

Danke für Antworten.
 
Hallo!

PHP wird serverseitig ausgeführt.
Du solltest also bei grösseren Projekten unbedingt mit als Variablen definierte Funktionen arbeiten, denn so überspringt PHP den Inhalt der Funktionen sofern diese nicht benötigt werden.
Dass musst Du dir wie z.b. ein Lexika vorstellen.
Wenn Du darin etwas nachschlagen willst, guckst Du zuerst ins Stichwortverzeichnis und schlägst dann die richtige Seite auf..... ohne Stichwortverzeichnis (Funktion) müsstest Du Seite für Seite, Zeile für Zeile umblättern/lesen.

Ggf. solltest Du nicht alle Funktionen includen, sondern nur die, die vom jeweiligem Abschnitt benötigt wird.
Dieses würde ich natürlich von der Anzahl/Grösse der Funktionen abhängig machen.
So könnte es durchaus sinvoller sein 10 umfangreiche Funktionen in viele Einzeldateien aufzuteilen, als 50 kleine Funktionen in eine Datei zu machen.
Da sollte man sich also im vorwege Gedanken machen, wie gross die Funktionen evtl. werden könnten.
Wenn mehrere Leute an dem Projekt arbeiten, könnte es u.U. wiederum sinnvoller sein jede einzelne Funktion in eine seperate Datei zu machen und/oder entsprechende Klassen anzulegen.

Evtl. solltest Du überlegen ob Du deine Sprachendatei nicht in mehrere Einzeldateien aufteilst, denn ich denke nicht dass immer alles gebraucht wird..... schon garnicht alle Sprachen.
Irgendwo lässt Du ja sicherlich eine Auswahlmöglichkeit für die Sprachen ausgeben.
Dieses würde ich in ein Switch packen, als default nimmst Du dann z.b. Deutsch.
Wenn nun der User auf Englisch umschaltet, wird die Auswahl ja per GET oder POST an das Script übergeben.
Dieses wird an den Switch übergeben und dort wird nach dem passenden Eintrag gesucht, wenn dieser gefunden wurde wird der dort angebene Code ausgeführt..... z.b. include("englisch_lang.php").
So wird nur die Sprachendatei includet, die der User ausgewählt hat.

500 KB ist wirklich schon sehr gross.
Ich habe hier ein Galleriescript, dass sind 15 Dateien, ist 235 KB gross (ohne Bilder) und hat 1145 Zeilen Code.

Dann habe ich hier noch eine Video Verwaltung.
3 Dateien..... das eigentliche Script hat 494 Zeilen, eine Konfigurationsdatei mit 10 Zeilen und eine Datei zur Verarbeitung des Cookies mit 27 Zeilen, insgesamt sind es 29 KB.

Das eigentlich Script könnte ich noch aufteilen, da hier 3 Tabellen sind die je nach dem ob ich auf "Eintrag hinzufügen", "Eintrag suchen" oder "Eintrag bearbeiten" klicke.
Dieses halte ich aber für überflüssig, da die Abschnitte eh nur verarbeitet werden wenn ich auf den jeweiligen Button klicke.
Auch würde das Script nur unwesentlich übersichtlicher werden.

In der Konfigurationsdatei stehen nicht nur die Zugansdaten, sondern auch der Tabellenname und eine Variable für die Anzahl an Einträgen pro Seite.
Somit ist die Video Verwaltung schon flexibel genug um von anderen Leuten eingesetzt zu werden, ohne dass diese im Script rumfummeln müssen.

Die Datei für die Verarbeitung des Cookies habe ich nur ausgelagert, weil sonst das Script in einer Endlosschleife hängt. :(

Du siehst, eine Pauschalaussage gibt es nicht.

Gruss Dr Dau
 


Vielen Dank für deine ausführliche Antwort. Möglicherweise habe ich mich etwas missverständlich ausgedrückt. PHP ist ja eine serverseitige Scriptsprache. Das bedeutet ja, dass zwar die Dateien, wie Du es ja auch beschrieben hast, die per include eingebunden werden auch komplett geladen werden müssen. Aber nur serverseitig. Und hier ist die Größe nur weniger relevant. Ich dachte zuerst, dass diese Dateien auch am Client, also beim Ausführenden des Scripts zur Verfügung stehen müssten, und das würde die Downloadzeit ziemlich vergrößern. Wenn man sich aber bei einem großen Script, welches quasi fast komplett in einer Datei steckt, den Quellcode im Browser ausgegeben wird, wird nur der Teil angezeigt, welcher auch per Script ausgeführt wird. Das bedeutet dann doch, dass auch nur dieser Teil an den Browser übergeben und herunter geladen wird. Ist das richtig?

Das mit den Funktionen leuchtet ein. Aber eine serverseitige Scriptsprache arbeitet ja relativ schnell. Also nur um Ladezeiten zu sparen, müsste man nicht unbedingt Funktionen verwenden, oder? Das mit den Sprachdateien habe ich auch so gemacht. Ich lade nur die Datei, die der User als seine Sprache ausgewählt hat.
 
Wie der Begriff serverseitige Skriptsprache schon erläutert, wird das Skript auf dem Server verarbeitet. Nur die Ausgabe selbst wird an den Client gesandt.

Vor allem häufig verwendete oder verallgemeinerte Algorithmen sollten als eigene Funktionen zur Verfügung stehen. Dies spart nicht nur Ressourcen sondern auch Tipparbeit und Nerven: man stelle sich vor, x-beliebig viele Instanzen der gleichen Skriptpassage müssten über mehrere Skriptdateien verstreut minimal angepasst werden – und das vielleicht auch mehrere Male.
 
qsrs hat gesagt.:
Aber eine serverseitige Scriptsprache arbeitet ja relativ schnell.
Naja, relativ ist relativ.
Schliesslich hängt es auch davon ab, welche Hardware im Server verbaut ist und/oder wieviel gleichzeitige Zugriffe auf den Server (nicht auf das Script) statt finden.
So könnte (rein theoretisch) z.b. ein alter P1 schneller sein als ein P4. ;)

Ich habe z.b. einen Hoster (für den Fall der Fälle als Ausweichmöglichkeit), bei dem ein aufrufen einer minimalen statischen HTML Seite länger dauert, als eine MySQL Abfrage mittels PHP auf meinem altem 486er.
Ob dieses nun an der verbauten Hardware, der Auslastung des Servers und/oder der Internetanbindung (Bandbreite) des Servers liegt, weiss ich allerdings nicht.
Da es aber ein Freehoster aus England ist, nehme ich mal an dass es ein Mix aus allem ist. ;)
 
Hallo,

ich habe zwar schon in meinen schlauen Büchern gelesen, aber nichts vergleichbares gefunden, deshalb stell ich hier die Frage. Bin zwar der Meinung, dass hier schon eine Antwort drin steht, aber weiß nicht, ob ich das richtig interpretiere:

Gibt es für include() eine Beschränkung in Form von einer Größenbeschränkung der zu integrierenden Datei?

Ich habe nämlich folgende Fehlermeldung:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 168 bytes) in /srv/www/htdocs/web52/html/includes/mannschaft_ansicht_gallerie.php on line 26
 
Was passiert denn in dem „mannschaft_ansicht_gallerie.php“-Skript, dass so viel Speicherplatz benötigt wird?
 
Das ist das Script...
Es soll mir lediglich eine kleine Tabelle mit Thumbnails erstellen. Ich muss mich für das HTML im Script vorhr entschuldigen.
PHP:
if ($bilder_ausgabe)
{
$inhalt.='<table width="100%" cellspacing="0">';
   $inhalt.='<tr>';
      $inhalt.='<td colspan="6">';
         $inhalt.='<span id="copyright">';									$inhalt.="</span>";
      $inhalt.="</td>";
   $inhalt.="</tr>";
   $inhalt.="<tr>";
						
   for ($i = 0 ; $i < (count($bilder_ausgabe)+1) ; $i ++)
   {
      if ($i = 0)
      {
	 $inhalt.="<td>";
	$inhalt.='<a href="#bild" onClick="wechselBild(\'austausch\', \''.$bild.'\', \'\', \'\', \'\')"><img src="'.$bild.'" width="100" height="66"></a>';							$inhalt.="</td>";
      }
      if (($i % 5) == 0)
      {
	$inhalt.="</tr>";
	$inhalt.="<tr>";
	$inhalt.="<td>";
	$inhalt.='<a href="#bild" onClick="wechselBild(\'austausch\', \'gallerie/'. $bilder_ausgabe[($i-1)]["pfad"].'\', \'\', \'\', \''.htmlentities($bilder_ausgabe[($i-1)]["copyright"]).'\')">';
         $inhalt.='<img src="gallerie/'.$bilder_ausgabe[($i-1)]["thumbnail"].'" width="100" height="66"></a>';
	$inhalt.="</td>";
      }
      else
      {
	$inhalt.="<td>";
	$inhalt.='<a href="#bild" onClick="wechselBild(\'austausch\', \'gallerie/'.$bilder_ausgabe[($i-1)]["pfad"].'\', \'\', \'\', \''.htmlentities($bilder_ausgabe[($i-1)]["copyright"]).'\')"><img src="gallerie/'.$bilder_ausgabe[($i-1)]["thumbnail"].'" width="100" height="66"></a>';
	$inhalt.="</td>";
      }										
   }
$inhalt.="</tr>";
$inhalt.="</table>";										
									}
?>
 
Zuletzt bearbeitet:
Zurück