brocoder/file-system

用于安全/不安全文件系统操作的轻量级模块。

v1.1.0.030618 2018-06-03 07:51 UTC

This package is auto-updated.

Last update: 2024-09-19 13:32:55 UTC


README

用于方便文件系统操作的轻量级模块

我的目标是编写一个直观且不过度复杂的模块,用于安全/不安全的文件操作,避免在需要与文件系统交互的每个地方都充斥着底层代码。

* 所有锁都处于独占模式。

子模块

文件

用于安全和不安全一致文件操作的通用工具(其他所有工具只是扩展它)。自动检测三种换行符:Unix (\n),Mac (\r),Windows (\r\n)。示例

/**
 * Unsafe counter
 */

// opening the counter
$fl = new File( __DIR__ . '/counter.tmp' );

// read counter
$counter = ( int )$fl->readAll();

// writing hit
$fl->rewrite( ++$counter );

echo "Current counter value: {$fl->readAll()}";

// close counter
$fl->close();

FileLocked

用于一致文件操作的安全文件实现。示例

/**
 * Fully safe counter.
 *
 * We open file and lock it, then reading and writing. Our counter working under continuous lock until we'll close it.
 */

// opening the counter with lock
$fl = new FileLocked( __DIR__ . '/counter_safe.tmp' );

// read counter
$counter = ( int ) $fl->readAll();

// writing hit
$fl->rewrite( ++$counter );

echo "Current safe counter value: {$fl->readAll()}";

// release counter
$fl->close();

SFile 和 SFileLocked

如果你只想对文件进行单个操作,可能不需要部署一个对象。因此,你可以使用静态的 File 和 FileLocked 实现。示例

SFile::append( 'test.txt', 'append text' );
echo SFile::readAll( 'test.txt' );

如果你想要进行安全的单个操作,可以使用 SFileLocked。以下示例将锁定文件,然后安全地读取第一行

SFileLocked::readLine( 'test.txt', 0 );

FileMemory

这相当于 File,唯一的不同之处在于你需要调用 save() 来应用更改(即将其保存到文件)。当你需要对文件内容进行许多修改,但又不想每次都对你的文件系统进行 DDoS 操作时,这可能很有用。

示例

$fm = new FileMemory( 'test.txt' );
$fm->removeLine( 0 );
$fm->append( "sometext" );
$fm->prepend( "sometext" );
$fm->saveAndClose();

FileMemoryLocked

带有文件锁的 FileMemory。

安全性基准测试

让我们测试上面提出的酷炫计数器。

环境

Ubuntu 16.04,apache2,PHP 7.0(FPM),Apache JMeter。

基准测试

每个测试 1000 个线程
每个线程 1 个请求
10 个测试(每个测试 1000 个请求,总共 10000 个请求)。
在理想情况下,每个测试后计数器的值必须是 1000。

结果

不安全计数器

测试 1:1384
测试 2:113
测试 3:112113 (:trollface:)
测试 4:1
测试 5:2
测试 6:2
测试 7:3
测试 8:1
测试 9:111
测试 10:1

完全安全计数器

测试 1:1000
测试 2:1000
测试 3:1000
测试 4:1000
测试 5:1000
测试 6:1000
测试 7:1000
测试 8:1000
测试 9:1000
测试 10:1000