我是靠谱客的博主 坚强毛衣,最近开发中收集的这篇文章主要介绍php文件锁 性能怎么样,PHP-PHPUnit-测试保护文件锁的能力,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我正在为我的核心库更新单元测试,遇到了一个有关文件锁(群发)的场景,并且想了解其他人如何实现这些类型的单元测试.

基本上,我有一个utlity File类,它将内容写入文件:

class CoreLib_Api_File_Package

{

public static function write(array $options)

{

...

if (!$file->flock(LOCK_EX)) {

throw new CoreLib_Api_Exception('Unable to obtain lock on file');

}

...

}

}

我的单元测试如下:

public function testWriteException_UnableToSecureLock()

{

$this->touchFile($this->destFileUri);

$file = new SplFileObject($this->destFileUri, CoreLib_Api_File::MODE_WRITE);

$file->flock(LOCK_EX);

CoreLib_Api_File_Package::write(array('fileUri' => $this->destFileUri, 'content' => $this->testContent, 'mode' => CoreLib_Api_File::MODE_WRITE));

}

从测试代码中可以看到,在对write()方法进行API调用之前,我在$this-> destFileUri上设置了显式锁定.我希望异常会抛出新的CoreLib_Api_Exception(‘无法获取文件锁’);被抛出.相反,我的单元测试只是无限期地挂起.

测试文件是否具有锁定的正确方法是什么?

提前致谢.

解决方法:

本质上,flock将暂停执行,直到能够获得该锁为止.采取以下代码,与上面的情况类似:

$file = 'file.txt';

$first = fopen($file, "w");

flock($first, LOCK_EX);

$second = fopen($file, "w");

# Your script will pause on the next line until timeout

# due to the inability to obtain a lock.

flock($second, LOCK_EX);

但是,您可以这样获得非阻塞锁:

flock($file, LOCK_EX | LOCK_NB);

我不确定以这种方式锁定文件是否有负面影响.另外,虽然文档说LOCK_NB在Windows上不起作用,但我只是对其进行了测试,并且它在我的机器上也可以工作.因此,您可以在CoreLib_Api_File_Package :: write方法中执行以下操作:

class CoreLib_Api_File_Package

{

public static function write(array $options)

{

if ( ! $file->flock(LOCK_EX | LOCK_NB))

{

throw new CoreLib_Api_Exception('Unable to obtain lock on file');

}

}

}

您当前的测试应按原样通过.除此之外,我什么都没想到.

编辑:只要您告诉PHPUnit期望CoreLib_Api_Exception异常,它们就应该通过(只是指出来是因为您的示例中没有它).

标签:phpunit,flock,php

来源: https://codeday.me/bug/20191201/2083364.html

最后

以上就是坚强毛衣为你收集整理的php文件锁 性能怎么样,PHP-PHPUnit-测试保护文件锁的能力的全部内容,希望文章能够帮你解决php文件锁 性能怎么样,PHP-PHPUnit-测试保护文件锁的能力所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部