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

标签 php mysql exec exit-code

我正在使用 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;

最佳答案

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

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

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

关于php - 使用此代码,PHP 会在继续之前等待吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55851554/

相关文章:

php - 将编号列表列添加到返回的 MySQL 查询

php - 通过 PHP 在 MySQL 数据库中回显用户

java - 通过java运行Shell命令

c - 如何对位置未知的命令使用 execv?

javascript - PHP- "template"

php - PHP/Codeigniter 的 Printf 语法解析器?

php - Woocommerce - 我可以汇总每个用户订购的特定产品的数量吗?

winapi - 为什么 Unix 有 fork() 而没有 CreateProcess()?

php正则表达式读取带有选择字段的选择表单

php - 从其他3个Docker容器访问MySQL