2

MySQLデータベースの.sqlファイルへのバックアップを実行するために呼び出すPHPスクリプトがあり、それらをTAR / GZipして、電子メールで送信します。データベースの1つは、Webサーバーを提供するプロバイダーとは異なるプロバイダーによってホストされています。すべてがLinux/Unixでホストされています。このコマンドを実行すると:

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

(参考までに、system()、passthru()、shell_exec()でもこれを試しました。)

私のブラウザは15〜20秒間ページをロードしてから、処理せずに停止します。FTPクライアントを使用してサーバーを見ると、結果のファイルが数秒後に表示され、データベースがバックアップされるまでファイルサイズが増加することがわかります。そのため、バックアップファイルは作成されますが、ファイルを圧縮して送信する前に、スクリプトは機能しなくなります。

PHPで変数を確認しましたが、max_execution_time30秒(ページが機能しなくなるまでにかかる時間よりも長い)に設定されており、set_time_limit値は最大200秒に設定されています。

誰かがここで何が起こっているのか分かりますか?

4

5 に答える 5

1

また、一定期間非アクティブになった後にあきらめる (リバース) プロキシである可能性もあります。確かにそれはロングショットですが、とにかく....試してみてください

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

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

最初の 1 つがタイムアウトし、2 番目がタイムアウトしない場合、私はそれを証拠ではなく証拠と呼びます。

于 2009-12-29T22:58:41.783 に答える
1

phpinfo() 呼び出しを使用して、実行時間関連のパラメーターを再確認してください。おそらく、Paolo の記述がすべてです。

于 2009-12-29T22:18:04.077 に答える
1

プロバイダーが php.ini 設定を超える別のリソース制限を設定している可能性があります。試す

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

コマンドが利用可能な場合、リソースとその制限のリストを出力する必要があります。

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

共有サーバーの設定よりも制限の厳しい設定がいくつかあるかもしれません。

于 2009-12-31T07:11:35.343 に答える
0
  1. 手動ダンプを実行し、壊れたものと比較してください。これにより、mysqldump が停止/クラッシュする時点がわかります。
  2. mysqldump ... 2>/tmp/dump.log のように、mysqldump の出力をログに記録することを検討してください。
  3. ダンプが完了する前に制御が PHP に戻されるように、切り離された mysqldump を実行することを検討してください。

余談ですが、ほとんどの場合、mysqldump -Q を使用することをお勧めします。

于 2009-12-30T11:49:46.647 に答える