PHP 重命名(文件)正在制作 2 个副本.有时.为什么


php rename(file) is making 2 copies. sometimes. why?

在我的php服务器上,我有3个文件夹(包括根目录(
/
/列表
/列表/存档

我有一个名为/lists/make.php 的文件,它使用今天的日期作为文件名生成一个静态 html 文件,如下所示:/lists/20160203.htm

但在它列出今天的名单之前,它首先检查昨天的名单。如果找到,它会使用 rename(( 命令将其移动到/lists/archive 文件夹。但是,它所做的不仅仅是移动到存档,它还在root中创建副本,但它每隔一天才这样做。这不仅仅是一个偶数/奇数问题,因为它在一月底发生了变化。例如,这是我现在的文件结构。(注:今天是2016-02-03(

/20160128.htm
/20160130.htm
/20160201.htm
/20160203.htm
/lists/20160203.htm
/lists/archive/20160128.htm
/lists/archive/20160129.htm
/lists/archive/20160130.htm
/lists/archive/20160131.htm
/lists/archive/20160201.htm
/lists/archive/20160202.htm

所以这里发生了 3 件奇怪的事情,我需要帮助修复:
(1(昨天的清单应该只在存档中,而不是在根
目录中(2(为什么每隔一天才出现一次问题???
(3(为什么今天的列表已经在root中,而存档脚本还没有执行?
(4(明天的名单会扎根吗?

这是/lists/make 中的相关代码.php

<?php
$filename = date('Ymd',strtotime('yesterday')).'.htm';
if( file_exists($filename) ){
    //email a copy to admin
    $message = file_get_contents($filename);
    mail($emailAdmin, $subject, $message, $headers));
    //move list to archive
    rename('../lists/'.$filename, '../lists/archives/'.$filename);
}
//start or overwrite today's list
$filename = date('Ymd').'.htm';
$fh = fopen($filename,'w');
fwrite($fh, 'stuff1, stuff2');
fwrite($fh, 'stuff3, stuff4');
?>

如果"../lists/" rename(( 的一部分似乎是多余的,我同意,但添加一半解决了我的问题。以前,我只是在做重命名($filename,'档案/'.$filename(,它每天都在制作副本。现在它只是每隔一天制作一次副本。我很困惑。帮助!

/

lists/make.php 包含在我网站上的其他几个文件中,因此每天执行几次。这是我触发备份的黑客解决方案,因为我无法控制共享主机上的 chron 事件。大多数调用make.php的文件也在/lists/文件夹中,但其中一个在 root 中,另一个埋在/lists/的子文件夹中 2 层深处。我认为这无关紧要,但这个问题对我来说是一个谜。

我会使用rename(__DIR__.'/'.$filename, __DIR__.'/archives/'.$filename). __DIR__是指使用它的脚本的目录。 如果要包含来自多个位置的脚本,则/list 的相对路径将为您提供来自不同脚本的不同结果。

如果它在不同的日期被不同的脚本调用,它可以解释为什么它不一致。 今天已经运行可能是您没有调整时区,而在服务器的时间已经是明天了。