Php rename()和unlink()是异步函数吗?

Php rename()和unlink()是异步函数吗?,php,ajax,asynchronous,filesystems,Php,Ajax,Asynchronous,Filesystems,我有充分的理由相信rename()和unlink()这两个函数都是异步的,据我所知,这意味着当调用函数时,它们下面的代码会在文件系统上完成其过程之前继续执行。这是我将在下面解释的互联网应用程序的一个问题,因为后面的代码依赖于这些已经固定的更改。那么,有没有一种方法可以使这两个函数保持同步,以便代码读取器在访问这些函数时冻结,直到其所有任务都在文件系统上完全执行为止 以下是delete-image.php中的代码,由ajax从另一个admin images.php调用(后者将不显示): ` for

我有充分的理由相信rename()和unlink()这两个函数都是异步的,据我所知,这意味着当调用函数时,它们下面的代码会在文件系统上完成其过程之前继续执行。这是我将在下面解释的互联网应用程序的一个问题,因为后面的代码依赖于这些已经固定的更改。那么,有没有一种方法可以使这两个函数保持同步,以便代码读取器在访问这些函数时冻结,直到其所有任务都在文件系统上完全执行为止

以下是delete-image.php中的代码,由ajax从另一个admin images.php调用(后者将不显示):

`
foreach($dirScan as$key=>$value){
$fileParts=explode('.',$dirScan[$key]);
if(isset($fileParts[1])){
如果(!($fileParts[1]=“gif”)&&($fileParts[1]=“jpg”)&&(!($fileParts[1]=“png”)&&&!($fileParts[1]=“jpg”)){
未设置($dirScan[$key]);
}
}否则{
未设置($dirScan[$key]);
}
}
$dirScan=数组_值($dirScan);
//缩略图
$file='gallers/'$currentGal.'/'$currentDir。"/" . $dirScan[$imageNum-1];
取消链接($文件);
对于($i=($imageNum-1)+1;$i`
此脚本返回完成的文本后,admin-images.php将触发一个新函数,该函数将从这些重命名和修剪的文件填充图像表。有时,它会显示原本应该删除的旧名称和文件,只需简单的页面刷新即可将其删除。这似乎表明上面的php脚本正在运行所有代码,并在主文件完成其文件系统操作之前将回显文本输出到主文件(所有其他代码都很长且复杂,希望不需要讨论)


您会注意到,我尝试了一个sleep()函数来停止php脚本,希望给它一点时间来完成。这是一种不灵活且有问题的处理方式,因为我必须投入大量时间来确保每次都能正常工作,但我不希望用户等待的时间比她/他必须等待的时间长。

请注意,文件系统通常使用缓存来减少负载。通常情况下,您不会注意到,但如果需要获得真实信息,有时需要清除缓存。如果问题与文件系统相关,请检查文件系统的配置

PHP本身也为一些文件操作使用缓存,这一点也很清楚

请参阅以清除PHP统计缓存


请注意,这是一个“视图”问题,文件实际上已在磁盘上删除,但PHP仍可能返回它在那里(直到清除缓存)。

我认为它们不是异步的,因为它们返回一个结果,告诉您操作是否成功


我认为出现问题的原因是,在进行修改后运行
scandir
时,它可能会使用内存中的“缓存”数据,而不是重新扫描文件系统。

要使用任何文件操作,需要使用$\u服务器[“DOCUMENT\u ROOT”]才能正常工作。万一你不做这件事。。实际操作无法正常工作。此外,如果您正在使用Linux服务器,则需要为要在其中执行文件操作的文件夹设置权限

请注意,这两个操作都是同步的,而不是异步的。它还取决于您使用的服务器或操作系统的类型。

rename()
不是,但是
unlink()
在Windows上是异步的


由于似乎无法等待挂起的删除完成,因此建议在删除文件之前重命名该文件。PHP,所以您可以假设它是异步的。

这些函数应该是同步的和可靠的。您在什么操作系统和什么文件系统类型上运行此操作?这两种操作在文件系统级别都是原子操作,肯定还有其他操作。请注意,
rename(2)
syscall仅在操作不跨文件系统时有效(尝试该操作将返回
EXDEV
,您必须复制然后删除旧文件)。
    foreach ($dirScan as $key => $value) {
        $fileParts = explode('.', $dirScan[$key]);
        if (isset($fileParts[1])) {
            if ((!($fileParts[1] == "gif") && !($fileParts[1] == "jpg")) && (!($fileParts[1] == "png") && !($fileParts[1] == "jpg"))) {
                unset($dirScan[$key]);
            }
        } else {
            unset($dirScan[$key]);
        }
    }
    $dirScan = array_values($dirScan);

    // for thumbnail
    $file = 'galleries/' . $currentGal . '/' . $currentDir . "/" . $dirScan[$imageNum - 1];
    unlink($file);      
    for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) {
        $thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/' . $dirScan[$i];
        $thisSplitFileName = explode('.', $dirScan[$i]);
        $newName = 'galleries/' . $currentGal . '/' . $currentDir . "/" . ($thisSplitFileName[0] - 1)  . "." . $thisSplitFileName[1];
        rename($thisFile, $newName);
    }

    // for large image
    $fileParts = explode('.', $dirScan[$imageNum - 1]);
    $file = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . $fileParts[0] . "Large." . $fileParts[1];
    unlink($file);
    for ($i = ($imageNum - 1) + 1; $i < count($dirScan); $i++) {
        $thisSplitFileName = explode('.', $dirScan[$i]);
        $thisFile = 'galleries/' . $currentGal . '/' . $currentDir . '/large/' . $thisSplitFileName[0] . "Large." . $thisSplitFileName[1];
        $newName = 'galleries/' . $currentGal . '/' . $currentDir . "/large/" . ($thisSplitFileName[0] - 1)  . "Large." . $thisSplitFileName[1];
        rename($thisFile, $newName);
    }

    sleep(1);
    echo 'deleted ' . $dirScan[$imageNum - 1] . " successfully!";

} else {
    echo "please set the post data";
} ?>`