2016-07-14 5 views
-1

Ich habe ein Problem in PHP-Ausführungszeit, zuerst erkläre ich, was ich in PHP-Datei gemacht habe. Ich muss CSV-Datei erstellen, also schrieb ich Abfrage, um Daten von DB zu holen. und Meine Abfrage gibt 1 Million Datensatz zurück und ich habe PHP fwrite() verwendet, um Daten in eine CSV-Datei zu schreiben. aber mein Skript Taken 76.481406211853 sec, um eine CSV-Datei zu generieren, die 1 Million Daten enthält. Wie reduziert man diese Ausführungszeit? Irgendwann bekam ich fatalen Fehler:Wie PHP Ausführungszeit zu reduzieren und ini_set() in PHP setzen?

Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 793601 bytes)

so, wie Speicher zu verwalten?

PHP-Code hier:

<?php 
// start script 
$time_start = microtime(true); 
echo_memory_usage(); 

//My logic here 

// End of Script 
echo 'Total execution time in seconds: ' . (microtime(true) - $time_start); 
echo_memory_usage(); 

function echo_memory_usage() { 
    $mem_usage = memory_get_usage(true); 

    if ($mem_usage < 1024) 
     echo $mem_usage." bytes"; 
    elseif ($mem_usage < 1048576) 
     echo round($mem_usage/1024,2)." kilobytes"; 
    else 
     echo round($mem_usage/1048576,2)." megabytes"; 

    echo "<br/>"; 
} 
?> 

Mein Ergebnis ist

512 kilobytes //Script start 
1006.25 megabytes // script End 
Total execution time in seconds: 76.481406211853 

Und erfolgreich schreiben CSV mit 1 Million Rekord-Datei .. aber die Ausführungszeit zu lang und irgendwann Fatal Error wirft. Und auch wie man ini_set() setzt? Weil ich setzen muss ini_set('memory_limit', '1023M');

Der Grund von ich 1023 gesetzt, nach Skript ausführen Speicherauslastung ist 1006,25, also muss ich 1023M setzen? Ist es richtig?

+0

Um zu klären, ist 10 laks bedeuten eine Million? – Steve

+0

Der Code, den Sie gezeigt haben, zeigt nicht, was Sie überhaupt tun, es zeigt nur "// Meine Logik hier". Der beste Weg, dies zu beheben, besteht darin, die Datenbank abzufragen und dann nacheinander die Zeile resultset 1 durchzugehen und die Einträge in die Datei zu schreiben, aber ohne einen relevanten Code zu sehen, ist es schwer vorzuschlagen, wie man es verbessert. –

+0

Auch ohne zu gehen Wikipedia, die meisten Leute hier wissen nicht, was ein Lak ist - schlagen Sie vor, Englisch zu verwenden, um Ihr Problem zu einem breiteren Publikum zu beschreiben –

Antwort

0

Normalerweise würden Sie über die php.ini Ihres Webservers tun dies, aber Sie können tun es so auch:

ini_set('memory_limit','16M'); 

Werte angegeben werden wie 16,32,64 immer mit dem „M“ endet für Megabyte.

Oder entfernen Sie einfach das Limit:

ini_set("memory_limit",-1); 
+0

zum OP - seien Sie sich bewusst, dass das Entfernen des Limits in der Regel eine schlechte Idee ist Das Skript verwendet bereits 1 GB Arbeitsspeicher - dies weist auf eine schlechte Kodierung/Logik hin und Sie sollten sich darauf konzentrieren, dies zu beheben, anstatt Ihrem Skript unbegrenzte Ressourcen zu geben –

1

Ausführungszeit auf den externen Verbindungen, DB-Verbindungen und Schleifen von demselben Skript abhängt. Versuchen Sie, einen Schritt pro Zeit zu tun: 1. lassen Sie das Skript eine Verbindung mit nur db nichts zu tun 2. lassen Sie das Skript lesen die Daten 3. das Skript die Daten zum Speichern

Notieren Sie sich die Ausführungszeit vorbereiten lassen für in jedem Fall zu überprüfen, wo der Fehler liegt.

1

Option 1: Sie memory_limit in der php.ini-Datei ändern können.

Option 2: Vielleicht verwenden Sie schwere Objekte oder langsame Verbindungen. Wenn Sie Ihren Code verbessern möchten, können Sie es hier testen:

// Code 1 
$start = microtime(true); 

/* Here the code 1 */ 

$timeTotal1 = microtime(true) - $start; 
echo 'Code 1: '. $timeTotal1 .'<br>'; 


// Code 2 
$start = microtime(true); 

/* Here the code 2 */ 

$timeTotal2 = microtime(true) - $start; 
echo 'Code 2: '. $timeTotal2 .'<br>'; 

// Winner 
echo '<b>Winner:</b> '. ($timeTotal1 > $timeTotal2 ? 'Code 2' : 'Code 1');