为啥即使磁盘已满PHP仍返回0

Posted

技术标签:

【中文标题】为啥即使磁盘已满PHP仍返回0【英文标题】:Why does PHP return 0 even though the disk is full为什么即使磁盘已满PHP仍返回0 【发布时间】:2019-03-30 19:04:19 【问题描述】:

我正在将 php 进程(cli 模式)的标准输出重定向到一个文件。

为什么磁盘已满时退出代码为 0。

我可以在 php 7.1/5.6/5.4 以及 macos 和 centos 中重新出现这个问题。

leojins-MacBook-Pro-2:Downloads leojin$ php test.php > /Volumes/disk_test/test.log
leojins-MacBook-Pro-2:Downloads leojin$ echo $?
0
leojins-MacBook-Pro-2:Downloads leojin$ df -h
Filesystem      Size   Used  Avail Capacity iused               ifree %iused  Mounted on
/dev/disk1s1   233Gi   27Gi  205Gi    12%  580000 9223372036854195807    0%   /
devfs          189Ki  189Ki    0Bi   100%     654                   0  100%   /dev
/dev/disk1s4   233Gi  1.0Gi  205Gi     1%       1 9223372036854775806    0%   /private/var/vm
map -hosts       0Bi    0Bi    0Bi   100%       0                   0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%       0                   0  100%   /home
/dev/disk2s1    95Mi   93Mi  1.5Mi    99%      96 9223372036854775711    0%   /Volumes/disk_test

以下是test.php的内容:

<?php
$i = 0;
while (true) 
    echo "php:" . $i . "\n";
    $i++;

当我使用 python 时,它按预期以 1 退出。

leojins-MacBook-Pro-2:Downloads leojin$ python test.py > /Volumes/disk_test/test.log
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print 'python:' + str(i)
IOError: [Errno 28] No space left on device
leojins-MacBook-Pro-2:Downloads leojin$ echo $?
1

以下是test.py的内容:

i = 0 
while True:
    print 'python:' + str(i)
    i = i + 1 

我也试过php -d implicit_flush=0python -u,没有区别。

【问题讨论】:

【参考方案1】:

您的 PHP 代码不会写入磁盘,setting an exit status 也不会在您的代码中的任何位置。所以,它没有理由异常退出。如果你想检查磁盘是否已满,我建议你这样做in your shell或in PHP。

我不太熟悉它,但我猜你的 Python 解释器可能会抛出这个错误,因为代码在执行之前是 compiled to bytecode。如果没有空间,则无法执行此中间步骤。

【讨论】:

要确认这一点,只需禁用*.pyc***.com/questions/154443/how-to-avoid-pyc-files的生成

以上是关于为啥即使磁盘已满PHP仍返回0的主要内容,如果未能解决你的问题,请参考以下文章

itunes显示磁盘已满怎么办 itunes显示磁盘已满解决方法【详解】

macbook 磁盘已满怎么清理

HDFS 磁盘已满

添加 2 个节点后,Redshift 免费存储不会增加

在 Core Data 中,如何检查错误是不是是由“磁盘已满”引起的?

为啥即使组件的父标签标记为提供者,useContext 在组件中仍返回 null?