PHP filesize() 适用于除一个文件外的所有文件,给出 stat failed 错误

Posted

技术标签:

【中文标题】PHP filesize() 适用于除一个文件外的所有文件,给出 stat failed 错误【英文标题】:PHP filesize() works on all but one file, gives stat failed error 【发布时间】:2010-02-04 22:22:04 【问题描述】:

我正在编写一个 php 页面,它通过抓取现有的 html 页面来生成播客提要。一切正常,但我的一个 mp3 文件给出了“filesize(): stat failed”错误。据我所知,该文件没有损坏,并且运行良好。我还将文件重新上传到服务器。它属于所有文件大小的中间范围,所以我认为文件不会太大。因为每个其他文件都会返回一个文件大小,所以我假设问题出在 mp3 文件上,而不是我的服务器配置上。还有什么我应该检查的吗?

这是我的代码的相关部分:

$i = 1; //skipping header row on table
do 
    $tr = $table->find('tr', $i);

    $date = $tr->find('div', 0)->plaintext;
    $datetime = new DateTime($date);
    $speaker = $tr->find('div', 1)->plaintext;
    $title = $tr->find('div', 2)->plaintext;
    $url = $tr->find('div', 3)->find('a', 0)->href;
    $fullurl = "http://domain.org/resources/".$url;
    $filesize = filesize($url); //<---works on every file except one

    echo "<item><title>".$title."</title>\n";
    echo "<description>".$title." - ".$datetime->format('D, M jS, Y')." - ".$speaker."</description>\n";
    echo "<itunes:author>".$speaker."</itunes:author>\n";
    echo "<enclosure url=\"".$fullurl."\" length=\"".$filesize."\" type=\"audio/mpeg\"/>\n";
    echo "<guid isPermaLink=\"true\">".$fullurl."</guid>\n";
    echo "<pubDate>".$datetime->format('r')."</pubDate>\n";
    echo "<itunes:explicit>clean</itunes:explicit></item>\n\n";

    $i++;
while ($table->find('tr', $i) != NULL);

根据要求:(有人指出编辑吗?这是我在这里的第一个问题..)

文件名是“12-20-09_AM_Podcast.mp3”,遵循其他文件的命名约定,所有文件的权限都是644。完整的错误代码是

<b>Warning</b>:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for audio/12-20-09_AM_Podcast.mp3 in <b>/homepages/1/d106955786/htdocs/victory/resources/podcast1.php</b> on line <b>45</b><br />

【问题讨论】:

文件名中是否包含非ASCII字符或特殊字符()[]?另外,当stat失败时,一般不会有错误码吗? 看到这是一个简单的函数调用失败,你必须显示实际的文件名(也可能是文件的权限) 检查您的网络服务器是否有足够的权限来访问它。 【参考方案1】:

由于某种原因,domain.org 上的网络服务器没有返回 Content-Length 标头字段,这导致 filesize() 失败。

如果文件存储在本地,filesize() 则改为文件的本地副本。如果没有,您将无法解决此问题,因为这是domain.org 的网络服务器上的问题。您可以通过在本地下载文件并检查filesize() 来解决此问题,但这会大大降低您的页面速度。

如果文件存储在本地,请再次检查您的文件名或锚点。您可能拼错了一个(或两个),Apache mod_speling 正在为您修复它。

【讨论】:

我实际上正在使用本地文件(所有文件都是本地文件,包括我正在抓取的文件)。 $fullurl 语法仅用于 RSS 提要。因为其余文件都有效,所以我假设这不是服务器问题是否正确? 正确。查看file_exists 是否返回true。可能是因为mod_speling 而不会影响 Apache 的文件大小写问题。 就是这样。结果文件被命名为“12-20-09_AM_Podacst.mp3”(注意“播客”中交换的“a”和“c”),但 mod_spelling 正在修复它的所有链接。男人。我一定已经看了 100 次那个文件名而没有注意到这一点。谢谢!

以上是关于PHP filesize() 适用于除一个文件外的所有文件,给出 stat failed 错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP - filesize() 返回一个空字符串

关于 CORS,为啥我部署的 Azure 应用程序适用于除一个用户之外的所有人?

自定义 UINavigationBar 背景适用于除一个之外的所有导航控制器

关于PHP中filesize函数为何返回warning

Flexbox 代码适用于除 Safari 之外的所有浏览器。为啥?

Autotools:将 -D 与变量一起使用适用于除一个编译之外的所有编译(C 编程)