当我尝试在 php 中按 filemtime 对图像进行排序时,scandir 子文件夹出现错误(filemtime():stat 失败)

scandir subfolder gives errors when I try to sort images by filemtime in php (filemtime(): stat failed)

提问人:Alessandro 提问时间:10/2/2022 最后编辑:Alessandro 更新时间:10/4/2022 访问量:126

问:

几年前我写了一个php画廊,一切正常,直到我在scandir中放入一个子文件夹(foto),我有以下结构:

  • 根/图库/
  • 根/图库/照片/
  • 根/图库/拇指/
  • 根/图库/thumbs_b/
  • 根/图库/图库.php

文件夹中有所有较大的照片,里面有所有微缩模型,里面有所有中等微缩模型。fotothumbsthumbs_b

代码工作正常,直到我继续注释排序数组:

#array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);

如果我删除评论,我会得到很多错误,听起来像是与filemtime路径有关的问题......

array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);

这是我尝试按filemtime对图像进行排序时遇到的错误。

警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Castellamare_Del_Golfo_16082016_001.jpg 的统计信息失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的Cefalu_14082017_001.jpg的统计信息失败 警告:filemtime():第 84


行 D:\Web\test\www\gallery\gallery.php 中的Cefalu_14082017_002.jpg的统计信息失败警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Charleston_Mondello_04062014_001.jpg stat 失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Charleston_Mondello_15032010_001.jpg stat 失败 警告:filemtime():第 84


行 D:\Web\test\www\gallery\gallery.php 中的 Concerto_Politeama_Palermo_25072015_001.jpg stat 失败警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Foro_Italico_Magnolia_02022014_001.jpg 的统计信息失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的Gattino_08092008_001.jpg的统计信息失败 警告:filemtime():第 84


行 D:\Web\test\www\gallery\gallery.php 中的Mondello_Lido_04062014_001.jpg的统计信息失败警告:第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Mondello_Passeggiata_10092007_001.jpg 的 filemtime():stat 失败 警告:filemtime():第 84

行 D:\Web\test\www\gallery\gallery.php 中的 Riserva_Naturale_Capo_Gallo_02082016_001.jpg 的 stat 失败 警告:filemtime():D:\ 中 Riserva_Naturale_Capo_Gallo_02082016_002.jpg 的 stat 失败Web\test\www\gallery\gallery.php 第 84 行 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的Terrasini_Scultura_23122018_001.jpg统计失败

并且图像不再显示。

如何修复此错误?听起来像是 Php 的错误。 如果我在没有附加路径的情况下放入并且如果我将所有图像从 移动到 .问题是,如果 scandir 正在处理子文件夹,则排序图像不起作用。我有php 8.1.11 64位和apache 2.4.53 64位。scandir($src_folder);fotoroot/gallery/foto/root/gallery/

这是一个部分代码,所有完整代码约为 15 kb,这是一个用于测试目的的简短版本......

<?php
$pageText = 'Page ';
$pageOfText = ' of ';
$imageText1 = ' image';
$imageText2 = ' images';
$photoText = 'photo';
$comments = 'Comments';
$thumb_width = 120;  // width of thumbnails
$thumb_height = 85;  // height of thumbnails
$itemsPerPage = 5;  // number of images per page
$src_folder = '.';  // current folder images
$src_files = scandir("$src_folder/foto");  // files in current folder
$extensions = array(".jpeg",".jpg",".png",".gif");  // allowed extensions in photo gallery
//  display pagination
      
function print_pagination($pageText, $pageOfText, $numPages, $currentPage) 
{
    $page = 1;
    $page = (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) 
                ? htmlspecialchars((int) $_GET['page'], ENT_QUOTES | ENT_HTML401, 'UTF-8') 
                : 1;
    $page = str_replace("\0", "", $page);
    $currentPage = (is_numeric($currentPage) && $currentPage > 0) 
                    ? htmlspecialchars((int) $currentPage, ENT_QUOTES | ENT_HTML401, 'UTF-8') 
                    : 1;
    $currentPage = str_replace("\0", "", $currentPage);
    echo $pageText . $currentPage . $pageOfText . $numPages;
    $naviPage = array();
    if ($numPages > 1) {
        $min = max($currentPage - 2, 2);
        $max = min($currentPage + 2, $numPages - 1);
        $naviPage[] = "1";
        if ($min > 2) {
            $naviPage[] = "...";
        }
        for ($i = $min; $i < $max + 1; $i++) {
            $naviPage[] = "$i";
        }
        if ($max < $numPages - 1) {
            $naviPage[] = "...";
        }
        $naviPage[] = "$numPages";
    } else {
        $naviPage = array("1");
    }
    if ($numPages > 1) {
        echo '&nbsp;&nbsp;';
        if ($currentPage > 1) {
            $prevPage = $currentPage - 1;
            echo '<a href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $prevPage .'" class="direction">&#10096;&#10096;</a>';
        }
        foreach ($naviPage as $currentNaviPage) {
            if ($currentNaviPage == "...") {
                echo '<span class="paginate disabled">'. $currentNaviPage .'</span>';
            } elseif ($page == $currentNaviPage) {
                echo '<a class="current-paginate" href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $currentNaviPage .'">'. $currentNaviPage .'</a>';
            } else {
                echo '<a class="paginate" href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $currentNaviPage .'">'. $currentNaviPage .'</a>';
            }
        }
        if ($currentPage != $numPages) {
            $nextPage = $currentPage + 1;
            echo '<a href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $nextPage .'" class="direction">&#10097;&#10097;</a>';
        }
    }
}


$files = array();
foreach ($src_files as $file) {
    $ext = strtolower(strrchr($file, '.'));
    if (in_array($ext, $extensions)) {
        array_push($files, $file);
    }
}
if (count($files) == 0) {
    echo 'No photos';
} else {
    $numPages = ceil(count($files)/$itemsPerPage);
    if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) {
        $currentPage = htmlspecialchars((int) $_GET['page'], ENT_QUOTES | ENT_HTML401, 'UTF-8');
        $currentPage = str_replace("\0", "", $currentPage);
        if ($currentPage > $numPages) {
            $currentPage = $numPages;
        }
    } else {
        $currentPage = 1;
    }
    $start = ($currentPage * $itemsPerPage) - $itemsPerPage;
    for ($i = $start; $i < $start + $itemsPerPage; $i++) {
        if (isset($files[$i]) && is_file($src_folder .'/foto/'. $files[$i])) {
            #array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);
            echo '
<div class="thumb"><a href="'. $src_folder .'/foto/'. $files[$i] .'" data-fancybox data-caption="'. trim(pathinfo($files[$i], PATHINFO_FILENAME)) .'"><img src="'. $src_folder .'/thumbs/'. $files[$i] .'" width="'.$thumb_width.'" height="'.$thumb_height.'" alt="'.$photoText.'"></a><br><div class="srtgs" id="rt_'. $files[$i] .'"></div><br><div class="time">'. date("d-m-Y H:i:s", filemtime($src_folder .'/foto/'. $files[$i])) .'</div><div class="item"><a class="item" href="./comments.php?photo='. $files[$i] .'">'. $comments .'</a></div></div>';
        } else {
            if (isset($files[$i])) {
                echo $files[$i];
            }
        }
    }
    $counter = count($files);
    if ($counter <= 1) {
        $numImages = $imageText1;
    } else {
        $numImages = $imageText2;
    }
    print_pagination($pageText, $pageOfText, $numPages, $currentPage);
}
?>

从我的Dropbox中,用于测试目的的所有文件:

测试库 02.10.2022.zip

没有文件夹的测试库 FOTO 02.10.2022.zip

php 排序 scandir filemtime

评论


答:

0赞 Alessandro 10/4/2022 #1

我通过放置一个为 filemtime 提供完整路径的函数来解决:

function filetime_callback($a, $b) {
    global $src_folder;
    if (filemtime($src_folder.'/foto/'.$a) === filemtime($src_folder.'/foto/'.$b)) {
      return 0;
    }
    return filemtime($src_folder.'/foto/'.$a) > filemtime($src_folder.'/foto/'.$b) ? -1 : 1;
  }

最后,我可以使用简单的方法按filemtime对我的图像进行排序,如下所示:

usort($files, 'filetime_callback');

问题是filemtime找不到子文件夹中提供的图像。

谢谢。