2

我有一个 PHP 脚本,我调用它来运行 MySQL 数据库备份到 .sql 文件、TAR/GZip 并将它们通过电子邮件发送给我。其中一个数据库由与提供 Web 服务器的提供商不同的提供商托管。一切都托管在 Linux/Unix 上。当我运行这个命令时:

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

(仅供参考,我也尝试过使用 system()、passthru() 和 shell_exec()。)

我的浏览器加载页面 15-20 秒,然后停止而不进行处理。当我使用 FTP 客户端查看服务器时,我可以看到生成的文件会在几秒钟后出现,然后文件大小会不断增加,直到数据库被备份。因此,创建了备份文件,但脚本在文件可以被压缩并发送给我之前停止工作。

我检查了max_execution_timePHP 中的变量,它设置为 30 秒(比页面停止工作所需的时间长),并将set_time_limit值设置为 200 秒。

有人知道这里发生了什么吗?

4

5 回答 5

1

使用 phpinfo() 调用重新检查与执行时间相关的参数……也许这就是 Paolo 所写的。

于 2009-12-29T22:18:04.077 回答
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";
}

如果第一个超时而第二个没有超时,我会称之为不是证据,而是证据。

于 2009-12-29T22:58:41.783 回答
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 回答
1

您是在共享主机上还是这些是您自己的服务器?如果前者您的托管服务提供商可能已将最大执行时间设置为 15-20 秒并将其设置为不能被覆盖(我对 1&1 和这些类型的脚本有此问题)。

于 2009-12-29T22:08:41.877 回答
0
  1. 进行手动转储并将其与损坏的转储进行比较。这可能会告诉您 mysqldump 何时停止/崩溃
  2. 考虑记录 mysqldump 输出,如 mysqldump ... 2>/tmp/dump.log
  3. 考虑执行 mysqldump detached 以便在转储完成之前将控制权返回给 PHP

附带说明一下,mysqldump -Q 几乎总是一个好主意

于 2009-12-30T11:49:46.647 回答