Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 模拟无可用磁盘空间情况的最简单方法?_Php_Apache_Macos_Testing_Diskspace - Fatal编程技术网

Php 模拟无可用磁盘空间情况的最简单方法?

Php 模拟无可用磁盘空间情况的最简单方法?,php,apache,macos,testing,diskspace,Php,Apache,Macos,Testing,Diskspace,我需要在没有剩余磁盘空间的情况下测试我的web应用程序,即我无法再写入任何文件。但我不想把我的硬盘填满垃圾,只是为了确保没有空间了。我想用一个特定的进程(实际上是一个PHP应用程序)来模拟这种情况 实际上,暂时禁止向进程写入磁盘就足够了 最简单的方法是什么?我正在使用MacOSX10.6.2和内置的Apache/PHP包。谢谢 编辑:磁盘可用空间检查不可靠,因为它随时可能更改。许多页面同时提供。检查时可以有足够的可用空间,但在您实际编写某些内容时却没有。另外,检查磁盘可用空间需要在我写文件的任何

我需要在没有剩余磁盘空间的情况下测试我的web应用程序,即我无法再写入任何文件。但我不想把我的硬盘填满垃圾,只是为了确保没有空间了。我想用一个特定的进程(实际上是一个PHP应用程序)来模拟这种情况

实际上,暂时禁止向进程写入磁盘就足够了

最简单的方法是什么?我正在使用MacOSX10.6.2和内置的Apache/PHP包。谢谢


编辑:磁盘可用空间检查不可靠,因为它随时可能更改。许多页面同时提供。检查时可以有足够的可用空间,但在您实际编写某些内容时却没有。另外,检查磁盘可用空间需要在我写文件的任何地方更改代码,这不是我想要的:-)最后,此解决方案与我尝试测试的正好相反:当我的应用程序无法再写入时,它将如何运行。

当我需要执行此操作时,我创建了一个虚拟机,并将有限的空间分配给虚拟磁盘。

我使用了一个拇指驱动器,作为流程的卷。

一个简单快捷的解决方案是为专门的用户帐户设置配额


如果您不介意设置它的麻烦,并且您的操作系统可能需要第二个许可证,那么虚拟机可能是具有最长期可能性的最佳方案。

无论您在哪里获得剩余的磁盘空间,只需对其进行注释并使用替换值(如0.1、0、,-1

我不确定如何在OSX上实现,但在Linux上,我可能会在测试用户上设置一个磁盘配额,然后运行应用程序


或者创建一个空文件(一个小文件),将其格式化为ext3分区,使用环回设备挂载它,并在其中运行PHP应用程序。这将更接近于空间不足的物理磁盘。

我打赌您也可以创建自己的.dmg文件,文件系统大小为。。。说2Mb,然后写信给它。如果这是可行的,那么测试就非常容易了——您只需安装它并切换测试路径。如果dmg足够小,您甚至可以将其上载到源代码管理。

无需使用预填充的虚拟文件系统。
用于模拟文件系统

disk_free_space()-给定包含目录的字符串, 此函数将返回数字 上可用的字节数 相应的文件系统或磁盘 分割

要进行模拟,只需将函数包装到文件系统类中。然后将其作为依赖项注入到进行保存的类中,并在实际保存之前检查驱动器是否已满。在单元测试中,只需将常规类替换为模拟完整文件系统的类,就完成了。这样,您就不必在需要重新运行测试时重新创建完整的磁盘驱动器或始终将驱动器与项目文件一起保存,例如

class MyFileSystem
{
    public static function df($drive)
    {
        return disk_free_space($drive);
    }
}
要模拟完整的文件系统,请执行以下操作:

class MyFileSystemFull
{
    public static function df($drive)
    {
        return 0;
    }
}
如果希望重载函数以始终返回0,可以使用RunKit Pecl扩展并执行以下操作:

runkit_function_redefine('disk_free_space','string','return 0;');
作为另一种选择,请调查:

vfsStream是虚拟文件系统的流包装器,在模拟真实文件系统的单元测试中可能会有所帮助。它可以用于任何单元测试框架,如PHPUnit或SimpleTest


在常规文件(大小有限)中创建一个磁盘/文件系统映像,并循环装载它


但是如果你经常这样做,我会创建一个虚拟机,你会发现重新使用它的机会。

难道你不能使用一个模拟,用一个伪测试替换来替换你的代码中实际写入磁盘的部分,它会抛出你期望看到的异常吗?

递归地从你的webfolder中删除所有写权限,应用程序将要写入的文件夹和文件。

底线;不要那样做。说真的,当一个卷的空间用完时,会有很多事情发生可怕的错误。除非目标卷不是启动卷,并且没有其他应用程序写入该卷,否则磁盘填充时的行为将超出您的控制

如果它是启动驱动器,系统很可能会死机或崩溃后,满磁盘无论如何。或者,如果没有,它的行为将不稳定

如果您谈论的是数据卷,那么您的应用程序是否是唯一写入数据卷的应用程序?如果其他应用程序正在编写,您是否确定它们可能会失败


如今,磁盘空间非常便宜,您最好确保永远不会出现磁盘空间不足的情况。放下一个2TB驱动器,当它达到50%容量时发出警报。实现起来要便宜得多(除非你的时间是免费的),而且更可靠。

你试过用-f-r挂载吗?磁盘空间并不是很低,但它应该会引发相同级别的错误。

我认为使用mock类的想法是正确的方向。我通常也这样测试我的代码。如果可能的话,我会使用一个框架,而不是自己编写这些类。我对PHP不太了解(更多地使用C#和Java编程),但这似乎很好。

如果您依赖某种“NoFreeDiskSpace”异常出现,这将不起作用。对于php部分,我完全不称职,但这听起来像是在嘲笑您的依赖关系,这正是我想要做的。@Mathias:是的,这就是应该做的。它可能需要一些调整以适应OP的代码,但这是一个模拟。我更新了答案以使其更清楚。听起来像是竞争条件的候选项。@gs您的意思是当两个进程尝试保存文件并都通过检查,但第一个文件被写入,而另一个文件的空间不足时。对对。但这不是上面的代码要解决的问题。这只是为了模拟没有可用的磁盘空间。拥有自己的diskfull功能就可以了-b