0

给定一个简单的代码,例如:

$file = 'hugefile.jpg';
$bckp_file = 'hugeimage-backup.jpg';
// here comes some manipulation on $bckp_file.

假设的问题是,如果文件很大或很大 - 比如说 jpg - 人们会认为服务器需要一些时间来复制它(我的意思是甚至几毫秒) - 但也有人会假设下一行的执行会快得多.. 所以理论上 - 我可能会在尝试操作尚未创建的文件时出现“没有这样的文件或目录”错误 - 或者更糟 - 开始操作TRUNCATED文件.

我的问题是如何确保 $bckp_file 在操作它的 NEXT 行之前成功创建(或在这种情况下 - 复制)。

我有哪些选项可以“暂停”、“延迟”下一行执行,直到文件创建/复制完成?

现在我只能想到类似的东西

if (!copy($file, $bckp_file)) {
    echo "failed to copy $file...\n";
}

这只会提醒我,但不会解决任何问题(就像出现 php 错误一样)

或者

if (copy($file, $bckp_file)) {
  // move the manipulation to here ..
}

但这也不是那么有效 - 因为假设副本没有被执行 - 我将退出循环而没有实现我的目标并且没有错误。

这甚至是一个问题还是我想多了?还是 PHP 有一个内置机制来确保这一点?有什么推荐的做法吗?对这个问题有什么想法吗???

4

2 回答 2

2

我有什么选项可以“暂停”、“延迟”下一行执行,直到文件创建/复制完成

copy() 是一个同步函数,这意味着在调用 copy() 之后代码将不会继续,直到 copy() 完全完成或失败。

换句话说,不涉及魔法。

if (copy(...)) { echo 'success!'; } else { echo 'failure!'; }

除了同步 IO,还有异步 IO。在技​​术细节上解释起来有点复杂,但它的总体思路是它在后台运行,你的代码会钩住它。然后,每当发生重大事件时,后台执行都会提醒您的代码。例如,如果您要异步复制一个文件,您将注册一个侦听器,以便在取得进度时通知复制。这样,您的代码可以同时做其他事情,但您也可以知道文件的进展情况。

于 2012-03-13T05:56:29.800 回答
1

PHP 通过在执行任何脚本之前将整个文件保存在服务器上的临时目录中来处理文件上传(因此您可以从一开始就使用 $_FILES),并且可以安全地假设所有函数都是同步的——也就是说,PHP 将等待在移动到下一行之前执行每一行。

于 2012-03-13T05:59:36.830 回答