有了这段代码,PHP会等到继续吗?

时间:2019-04-25 14:20:57

标签: php mysql exec exit-code

我正在用php创建一个mysqldump,然后希望下载文件并最终将其删除。

我担心的是,PHP不会在system($command);之前等待readfile($backup_file);完成,而unlink($backup_file);会在一切都完成之前删除,尤其是对于大型数据库。

我了解PHP是单线程的,并且system($command)将发出退出代码,但是退出代码是否仅表示PHP已通过要处理的命令,还是意味着PHP将等待直到MYSQL完成?

代码如下:

$backup_file = $backupDir.$devDB."-".date("Y-m-d-H-i").'.gz';
$command = "mysqldump --opt -h $DbHost -u$DbUser -p$DbPassword $devDB | gzip > $backup_file";
system($command);

if (file_exists($backup_file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($backup_file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($backup_file));

    readfile($backup_file);
    unlink($backup_file);
    exit;

1 个答案:

答案 0 :(得分:1)

如果在Web服务器上执行此操作,很可能会遇到超时,但是PHP是同步的,因此它永远不会在system()返回之前到达readfile()。

由于您没有使用命令将任何内容发送到后台,因此没有任何东西会导致system()在执行命令之前返回。真正关心的是,除了检查文件是否存在之外,您没有其他任何错误检查,因此您应该检查退出代码以确保mysqldump和gzip成功。

我还将确保您考虑在共享服务器中使用密码作为命令行参数的安全隐患。