5

考虑到有问题的文件的创建有点落后于有问题的函数,我尝试运行一个 while 循环以在调用 rename 之前争取一点时间。

$no_file = 1;   
while($no_file && $no_file < 300)
{   // generation of Worksheet.xls may lag behind function -- WAIT FOR IT
    if(file_exists($old_path))
    {   $no_file = 0;
        rename($old_path, $new_path);
    }   else $no_file++;
}
if($no_file) die("Error: Worksheet.xls not found");

在这种配置中,我认为只有在 file_exists() 返回 true 时才能调用 rename(),但是对于我的一生,我无法弄清楚 rename() 是如何/为什么被调用然后返回失败...

PHP 警告:重命名(C:\wamp\www\demox/wp-content/plugins/cat-man/store-manager/summary/worksheets/Worksheet.xls,C:\wamp\www\demox/wp-content/plugins /cat-man/store-manager/summary/statements/TESTING/2012/Worksheet.xls) 没有这样的文件或目录...

4

3 回答 3

13

它可能告诉你statements/TESTING/2012/不存在。创建这些目录,mkdir()以便它能够保存文件。

mkdir( 'C:\wamp\www\demox/wp-content/plugins/cat-man/store-manager/summary/statements/TESTING/2012/', 777, true);
于 2013-01-18T23:40:43.887 回答
2

无论多么遥远,此代码都可能出现竞争条件,您的文件可能会在检查它是否存在和尝试重命名它之间发生变化。最好立即从try/catch块中尝试重命名并直接处理失败。

break您应该在重命名后使用语句显式退出循环。而$no_file = 0;改名前的设定就是过早地庆祝胜利。

此外,如果您出于延迟目的而循环,则需要休眠执行,否则循环将以 PHP 处理它的速度完成。看看time_nanosleep。如果您对该while循环计时,您会看到它非常非常快地完成:

$time_start = microtime(true);
$x = 0;
while ($x < 300) {
    file_exists("index.php");
    $x++;
}
echo sprintf("300 loops in %.9f seconds", microtime(true) - $time_start);

// 300 loops in 0.000626087 seconds
于 2013-01-19T03:21:49.923 回答
1

好的,mkdir() 确实解决了问题!这是上下文中的解决方案。

$old_path = $smry_dir."worksheets/Worksheet.xls";
if(@$store_options->paypal_live ==='false')
{   $new_path = $smry_dir."statements/TESTING/$reporting_year";
}   else $new_path = $smry_dir."statements/$reporting_year";
if(!is_dir($new_path)) mkdir($new_path, 777, true);
rename($old_path, $new_path."/Worksheet.xls");

再次感谢所有的帮助!语句 DIR 始终存在,我发现虽然 rename() 会毫无怨言地写入单个新子目录 $reporting_year,但它不会/不能写入递归子目录“TESTING/$reporting_year”。

mkdir 的递归参数来救援!

于 2013-01-19T16:36:21.623 回答