使用此代码将 PHP 在继续之前等待?
With this code will PHP wait before continuing?
我正在用 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() returning.
由于您没有使用命令向后台发送任何内容,因此在执行命令之前不会导致 system() return。真正关心的是除了检查文件是否存在之外没有错误检查,因此您应该检查退出代码以确保 mysqldump 和 gzip 成功。
我还会确保您考虑在共享服务器中使用密码作为命令行参数的安全隐患。
我正在用 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() returning.
由于您没有使用命令向后台发送任何内容,因此在执行命令之前不会导致 system() return。真正关心的是除了检查文件是否存在之外没有错误检查,因此您应该检查退出代码以确保 mysqldump 和 gzip 成功。
我还会确保您考虑在共享服务器中使用密码作为命令行参数的安全隐患。