使用此代码,PHP 会在继续之前等待吗?

Posted

技术标签:

【中文标题】使用此代码,PHP 会在继续之前等待吗?【英文标题】:With this code will PHP wait before continuing? 【发布时间】:2019-04-25 14:20:57 【问题描述】:

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

我担心的是,PHP 不会在 readfile($backup_file); 之前等待 system($command); 完成,并且 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;

【问题讨论】:

它会等到system返回。 【参考方案1】:

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

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

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

【讨论】:

谢谢你。我将添加代码以检查是否成功。这是在专用服务器上,并且 UN/PW 变量在配置文件中声明。备份脚本由一个按钮触发。

以上是关于使用此代码,PHP 会在继续之前等待吗?的主要内容,如果未能解决你的问题,请参考以下文章

我希望代码在继续之前等待上一行完成

iOS 在调用完成块之前会在 viewDidDisappear 之后等待 CATransaction

Swift - 在继续之前等待“dataTaskWithRequest”响应

如何在继续之前等待所有 multiprocessing.Processes 完成?

如何在继续之前等待 requestLocation?

如何让一个方法在继续执行之前等待另一个(异步)方法完成?