文件修改时间无法找到文件

4

我正在尝试使用filemtime获取一些文件的最后修改日期和时间。不幸的是,所有文件都无法获取。我已经尝试使用完整路径(例如www.mysite.com/images/file.png),也尝试仅使用扩展名(例如/images/file.png)以及仅使用文件名本身(file.png)。但是没有任何效果。请问如何传递路径引用以便找到我的文件?谢谢!

<br />n<b>Warning</b>:  filemtime() [<a href='function.filemtime'>function.filemtime</a>]: stat failed for www.mysite.com/images/hills.png in <b>D:\Hosting\11347607\html\mobile\updateImages.php</b> on line <b>20</b><br 

这是PHP脚本:

<?php

    include '../scripts/connection.php';

    //get information on this location from the database
    $sql = "SELECT * FROM types";
    $result = mysql_query($sql);

    $array = array();
    while ($row = mysql_fetch_array($result)) {
        $path = $row['path'] . $row['picture_url'];
        $last_mod = filemtime($path);
        $this_file = array(
            'filename' => $row['picture_url'],
            'last_mod' => $last_mod
        );
        $array[$row['type']] = $this_file;
    }

    echo json_encode(array('result'=>'success', 'message'=>$array));
?>

建议使用绝对路径作为基础路径,这样您就可以始终确保规范的文件名是您所期望的。 - Ja͢ck
在调用filemtime()之前,你有检查过$path是什么吗?你有从PHP以外的其他方式检查过该路径是否真的存在吗?如果它确实存在,则请检查PHP运行的任何用户是否具有写入访问该目录树和文件的权限。 - Marc B
我先尝试了那个方法,但结果一样。我会编辑我的帖子,展示使用那种方法时的错误信息。 - AndroidDev
尝试在循环内部回显 $path,并将输出中的路径到 hills.png 和您磁盘上原始的 hills.png 的路径发送出来。 - Jithesh
@Jithesh:路径正确地呈现出来了。然而,你提到了“我的磁盘”,这让我想到有必要指出我正在使用服务器上的路径(例如www.mysite.com/images/hills.png),因为那是我要进行比较的版本。使用服务器版本而不是磁盘版本会有问题吗? - AndroidDev
3个回答

8

相对路径是根据请求的当前工作目录解析的。这会因为接收请求的php文件不同而在每个请求中改变。您需要将其转换为绝对路径。

有几种技术可供使用。 __DIR__ 魔法常量是其中更有用的一种,但对于您的问题,由于您知道路径相对于文档根目录,因此可以这样做。

$last_mod = filemtime($_SERVER["DOCUMENT_ROOT"]."/images/file.png");

这使用您的Web服务器文档根目录作为起点来解析与之相对应的路径(相当于http://mysite.com URL的文件系统路径)。

__DIR__在您想要解析相对于__DIR__常量所在路径的路径时非常有用。 在早期的php版本中,您可以使用dirname(__FILE__)获取相同的值。


还需要反转斜杠(从 / 到 \)。谢谢! - AndroidDev

3

是的,这是一个URL。我需要比较我在安卓手机上拥有的文件版本和存储在服务器上的版本。如果服务器版本更新,则重新下载它。在我上传到服务器之前,我并不一定关心磁盘上存储的文件版本。我使用的是服务器版本作为主版本。 - AndroidDev
很抱歉告诉你,你无法通过 filemtime 在服务器上找到文件的修改时间。 - Jigar
如果您对服务器有控制权,可以创建一个Web服务来返回所请求文件的最后修改时间。 - Orangepill
是的,@Orangepill 是正确的。实际上有很多方法可以获取修改时间。如果您对该服务器具有控制权,则可以使用一个简单的 PHP 文件来获取修改时间,或者使用 PHP FTP 函数 ftp_mdtm http://www.php.net/manual/en/function.ftp-mdtm.php 也可以获取修改时间。 - Jigar

0

简单解决方案

问题与错误路径有关,但通常是由于网站缓存而导致的。

因此,简单的解决方案是清除缓存,然后在您的服务器上重新创建错误的基本路径。

根据我的经验,我曾经在symfony 2的缓存中遇到过这个问题。 而简单快速的解决方案是删除app/cache目录。

cd www/app/cache rm -fR *

然后缓存就会得到新的正确基础路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接