【发布时间】:2014-03-07 14:40:05
【问题描述】:
我的环境是:Windows、MsSQL 和 PHP 5.4。
我的场景: 我正在做一个小的 shell 脚本,它从我想要的数据库创建一个完整的备份到一个临时文件夹,然后将它移动到一个新的位置。
备份正常,文件被创建到我的临时文件夹中。然后我将它重命名为第二个文件夹,有时它会正常,有时它找不到源文件。
当然,此时我知道我可以完全跳过临时位置,但是找不到文件的实际问题困扰着我。为什么它如此随机,并且可能还会影响我在此之前编写的其他文件功能...此外,我需要能够控制文件移动到目标的方式和时间。
基本代码应该很简单(尽管这是我实际代码的简化版本,因为我怀疑有人会对我的错误处理/记录条件感兴趣):
$query = "use test; backup database test to disk '//server01/temp/backups/file.bak', COMPRESSION;";
if($SQLClass->query($query)) {
$source="////server01//temp//backups//file.bak";
$destination="////server02//storage//backups//file.bak";
if(!rename($source , $destination)) {
//handleError is just a class function of mine that logs and outputs errors.
$this->handleError("Moving {$source} to {$destination} failed.");
}
}
else {
die('backup failed');
}
我试过的是:
- 我在它之前添加了一个file_exists,它也找不到源文件,当重命名时找不到。
- 由于找不到文件,copy() 和 unlink() 也不起作用
- 试过 clearstatcache()
- 在 sql 备份完成后尝试 sleep(10)
这些都没有帮助。我和谷歌似乎对下一步做什么或尝试没有想法。当然我可以执行一些 shell_execing,但这并不能消除我对早期产品的担忧。
我只是在尝试连续多次运行该命令时才注意到这个问题。是否有 clearstatcache() 不会触及的文件名的某种缓存?这似乎与某种幽灵文件现象有关,其中php更新文件系统内容迟到了。
如果您有任何关于下一步尝试的想法,我将不胜感激,如果您读到这里,谢谢:)。
【问题讨论】:
-
您是否为当前用户检查了服务器中文件的权限?
-
您是否尝试过在调用
handleError之前将重命名调用置于一个休眠一段时间并重试3-5 次的循环中?有时这有助于处理偶尔超时的文件操作。 -
是的,我有,权利很好。这也是我早期的想法之一,但结果是有时无法找到该文件。我没有尝试循环播放它,但我确实尝试睡了 10 秒。我会试试看它是否有效,也许两次调用相同的函数会重置一些东西。
-
在下面试试我的解决方案,希望它有效
标签: php sql sql-server file-move