Maximale Dateigröße bei PHP-Einlesen?

tluebke

Mitglied
Ich möchte eine große txt-Datei (2000 kb, 101337 Zeilen!) per PHP-Script nach einem bestimmten String durchsuchen lassen und mir dann einen Teil der Zeile, in der der String steht, ausgeben lassen. Soweit klappt alles ganz gut, bis auf, dass das Script nach ca. 66904 Zeilen aufhört. Es tut so, als ob es komplett durchgelaufen wäre, da die nachkommenden Befehle ohne Probleme ausgeführt werden. Kann das an der Dateigröße liegen, die maximal geladen werden kann?
Das Script läuft wie folgt:

PHP:
$datei = fopen("./cog-groups/cogs_all.txt", "r");

$funcgroup = '[M]';
$entf = 'COG';
$einf = '';
$i = 0;
while(!feof($datei)) {
  $zeile = fgets($datei,1024);
  
  if(strstr($zeile,$funcgroup)!=NULL){

  $zeile_ex = explode(" ", $zeile);
  $cog1 = $zeile_ex[1];
  echo str_replace($entf,$einf,$cog1);
  echo '<br>';
  $i++;
  } 
}
 
Also wenn es nicht am Timeout liegt, dann tippe ich eher darauf das nach ca. 66904 Zeilen ein Zeichen kommst was PHP dazu bringt die Schleife abzubrechen!?

PHP:
if(strstr($zeile,$funcgroup)!=NULL)

Sicher das es richtig ist auf NULL zu prüfen und nicht FALSE
 
Desweiteren ist es anstatt strstr() evtl. sinnvoller strpos() zu verwenden:

PHP Manual hat gesagt.:
Hinweis:

Wenn Sie nur herausfinden möchten, ob ein bestimmter needle innerhalb von haystack vorkommt, verwenden Sie stattdessen die schnellere und weniger speicherintensive Funktion strpos().

Möglicherweise ist die Fehler-Anzeige auch deaktiviert:

PHP:
// Schreib mich an den Anfang deines Scripts
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);
 
Ich habe nun das Script optimiert. Den Befehl strstr() brauche ich nun nicht mehr, da ich direkt die Datenbank abfrage, deren Tabellenfelder ich direkt überprüfen kann.

Soweit funktioniert alles auch gut. Wenn die Datenflut zu groß wird, kommt aber ein Timeout. Das liegt jedoch wohl an dern Srvereinstellungen vom Anbieter.
 
Soweit funktioniert alles auch gut. Wenn die Datenflut zu groß wird, kommt aber ein Timeout. Das liegt jedoch wohl an dern Srvereinstellungen vom Anbieter.

Das kann auch ein Anzeichen eines schlechten Queries sein. Jage mal dein/e SELECT-Query/Queries durch EXPLAIN. Dieses sagt dir, ob er die gesamte Tabelle durchsuchen muss oder auf Indexe zugreifen kann. Indexe sind weitaus schneller, da MySQL sie im Arbeitsspeicher hält, wenn die nicht zu groß werden.
Code:
EXPLAIN SELECT ... FROM ... WHERE ...
Dokumentation zum EXPLAIN Statement

Etwas detailreicher ist das Webinar zum Thema MySQL-Performance.

Gruß Kyoya Stefan
 
Zurück