PHP / passthru / mysqldump似乎超时

时间:2009-12-29 22:06:20

标签: php mysql mysqldump passthru

我有一个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客户端查看服务器时,我可以看到几秒钟后显示生成的文件,然后构建文件大小,直到备份数据库。因此,创建了备份文件,但脚本在压缩文件并发送给我之前停止工作。

我已经检查了PHP中的max_execution_time变量并将其设置为30秒(比页面停止工作所需的时间更长)并将set_time_limit值设置为200秒。

任何人都知道这里发生了什么?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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";
}

如果第一次超时而第二次没有,我会称之为证据而非证据。

答案 3 :(得分: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

也许您发现的设置比共享服务器上的限制更多。

答案 4 :(得分:0)

  1. 进行手动转储并将其与损坏的转储区分开来。这可能会告诉你mysqldump在哪一点停止/崩溃
  2. 考虑记录mysqldump输出,如mysqldump ... 2&gt; /tmp/dump.log
  3. 考虑执行mysqldump detached,以便在转储完成之前将控制权返回给PHP
  4. 另一方面,mysqldump -Q

    几乎总是一个好主意