PHP的fopen函数会不时出现错误:无法打开流:设备上没有剩余空间

6
这是我遇到的奇怪错误,我的PHP脚本在尝试生成文本文件并写入一些用户生成的内容时,间歇性地会出现无法打开流:设备上没有剩余空间的错误。但是我的磁盘有足够的空间。
下面是我使用的代码:
$fp=fopen('../user1/dataProduct.txt','w');
fwrite($fp, 'Demo Text of Products');
fclose($fp);

如果我运行命令:df -H df -H Results

错误信息: PHP警告:在/home/goashopping/public_html/sell/userprod.php的第192行打开流../user1/dataProduct.txt失败,设备上没有剩余空间。 PHP警告:在/home/goashopping/public_html/sell/userprod.php的第195行,fwrite()函数需要一个资源参数,但给出了一个布尔值。

请帮助我解决这个问题。


我猜你的网站已经设置了配额。 - Daan
创建账户时,我在 cpanel WHM 中选择了无限制选项,因此没有设置配额。 - WhiteHorse
3个回答

13

请使用df -i命令检查空余的inode。

you@yourbox:~$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1             532480   46391  486089    9% /

如果文件系统中有大量的小文件,通常会在空间耗尽之前耗尽 inodes。 如果您的情况是这样的,您将需要重建文件系统并使用 mkfs -i 命令在其上增加可用的 inodes。


它显示在/dev/md2 = IUse% : 30 %和/dev/md1 = IUse% : 19% /tmp。 - WhiteHorse
这就是了..我删除了目录中存在的所有小于1kb的文件。谢谢。 - WhiteHorse
这是我的问题!!我升级了硬盘,问题解决了。 - jruzafa
这真的很有帮助。我被信息搞糊涂了。结果发现一个小网站配置错误,没有删除会话文件。我简直不敢相信自己花了几年时间才解决这个问题。 - Dreaded semicolon
如何重建文件系统? - Deepak Patankar

1
我认为这很可能是inode问题,但我也遇到过这个间歇性的问题。 它仅在一个目录中发生。
file_put_contents(/ archive / ETG / content / original / 173530 / event / 173530_unplanned_outage_rd_20150107_fd_20150107_152715_6.pdf):无法打开流:设备上没有剩余空间
$php --version  
PHP 5.3.28 (cli) (built: Jun 27 2014 15:36:16)  
$uname -ior  
2.6.18-238.19.1.el5 x86_64 GNU/Linux  

$df -ih /archive  
Filesystem            Inodes   IUsed   IFree IUse% Mounted on  
/dev/mapper/vg03--archive-archive  
                    669M     57M    613M    9% /archive  
$df -h /archive  
Filesystem            Size  Used Avail Use% Mounted on  
/dev/mapper/vg03--archive-archive  
                  5.2T  3.9T  1.1T  79% /archive  

$mount |grep archive  
/dev/mapper/vg03--archive-archive on /archive type ext3 (rw)  

$find /archive/ETG/content/original/173530/event -type d -prune -ls  
21610738 779840 drwxrwxrwx   3 gasconcoll gasconcoll 797769728 Jan  7 10:28 /archive    /ETG/content/original/173530/event  

$ls -altr /archive/ETG/content/original/173530/event/ |wc -l  
8000842  

$du -sh /archive/ETG/content/original/173530/event  
49G  

我通过以下方法解决了这个问题:
$mkdir /archive/ETG/content/original/173530/event_new  
$chmod ugo+rwX /archive/ETG/content/original/173530/event_new  
$mv /archive/ETG/content/original/173530/event /archive/ETG/content/original/173530/event_old  
$mv /archive/ETG/content/original/173530/event_new /archive/ETG/content/original/173530/event  
$rsync -av /archive/ETG/content/original/173530/event_old/ /archive/ETG/content/original/173530/event  

我不再遇到这个错误了。我没有足够的时间深入挖掘,但认为你可能想知道对我有用的是什么。


1

它显示在 /dev/md2 = IUse% : 30 % 和 /dev/md1 = IUse% : 19% /tmp,这个问题有时会发生,不是持续性错误。 - WhiteHorse
链接已损坏。 - Márcio Rossato

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