2 Stimmen

PHP/passthru/mysqldump scheint eine Zeitüberschreitung zu verursachen

Ich habe ein PHP-Skript, das ich aufrufe, um MySQL-Datenbank-Backups in .sql-Dateien zu erstellen, sie zu TAR/GZipen und per E-Mail an mich zu senden. Eine der Datenbanken wird von einem anderen Anbieter gehostet als der, der den Webserver bereitstellt. Alles wird auf Linux/Unix gehostet. Wenn ich diesen Befehl ausführe:

$results = exec("mysqldump -h $dbhost -u $dbuser -p$dbpass $dbname > $backupfile", $output, $retval);

(Zu Ihrer Information: Ich habe dies auch mit system(), passthru() und shell_exec() versucht).

Mein Browser lädt die Seite 15-20 Sekunden lang und bleibt dann ohne Bearbeitung stehen. Wenn ich mit einem FTP-Client auf den Server zugreife, sehe ich, dass die resultierende Datei ein paar Sekunden später angezeigt wird, und die Dateigröße nimmt zu, bis die Datenbank gesichert ist. Die Sicherungsdatei wird also erstellt, aber das Skript hört auf zu arbeiten, bevor die Datei komprimiert und an mich gesendet werden kann.

Ich habe die max_execution_time in PHP auf 30 Sekunden gesetzt (länger als es dauert, bis die Seite aufhört zu funktionieren) und haben die set_time_limit Wert auf bis zu 200 Sekunden.

Hat jemand eine Ahnung, was hier vor sich geht?

1voto

Paolo Punkte 21418

Nutzen Sie Shared Hosting oder sind das Ihre eigenen Server? Im ersten Fall hat Ihr Hosting-Anbieter die maximale Ausführungszeit möglicherweise auf 15-20 Sekunden festgelegt und so eingestellt, dass sie nicht überschrieben werden kann (ich habe dieses Problem mit 1&1 und dieser Art von Skripten).

1voto

Alfabravo Punkte 7336

Überprüfen Sie die Ausführungszeit-bezogenen Parameter mit einem phpinfo()-Aufruf... vielleicht liegt es an dem, was Paolo schreibt.

1voto

VolkerK Punkte 93746

Es könnte auch ein (umgekehrter) Proxy sein, der nach einer gewissen Zeit der Inaktivität aufgibt. Zugegeben, es ist weit hergeholt, aber trotzdem.... versuchen

// test A
$start = time();
sleep(20);
$stop = time();
echo $start, ' ', $stop;

y

// test B
for($i=0; $i<20; $i++) {
  sleep(1);
  echo time(), "\n";
}

Wenn die erste Zeit ausfällt und die zweite nicht, würde ich das nicht als Beweis, sondern als Indiz bezeichnen.

1voto

VolkerK Punkte 93746

Vielleicht hat der Provider ein anderes Ressourcenlimit festgelegt, das über die php.ini-Einstellung hinausgeht. Versuchen Sie

<?php passthru('ulimit -a');

Wenn der Befehl verfügbar ist, sollte er eine Liste der Ressourcen und ihrer Grenzen ausgeben, z. B.

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 4095
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4095
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Vielleicht finden Sie auf Ihrem gemeinsamen Server noch restriktivere Einstellungen als diese.

0voto

mst Punkte 247
  1. Führen Sie eine manuelle Entladung durch und vergleichen Sie sie mit der kaputten Entladung. Dies kann Ihnen sagen, an welchem Punkt mysqldump anhält/abstürzt
  2. Erwägen Sie die Protokollierung der mysqldump-Ausgabe, wie in mysqldump ... 2>/tmp/dump.log
  3. Ziehen Sie in Erwägung, mysqldump abgetrennt auszuführen, damit die Kontrolle an PHP zurückgegeben wird, bevor der Dump beendet ist

Nebenbei bemerkt, ist es fast immer eine gute Idee, mysqldump -Q

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X