今天突發奇想,如果創建一個文件,不寫入內容,就如我們之前說的寫入擴展屬性能快速查找數據,但是在SSD下只能寫4000個左右的字符,那么有沒有更快速的方法存儲這樣的信息呢?
我想到可以同文件名來存儲信息,測試了一下發現
<?php $file = './file/'; for ($i=0; $i < 1000; $i++) { $name = str_repeat("a", $i); $res = touch($file . $name . ".txt"); if (!$res) { var_dump($i);exit; } }
PHP Warning: touch(): Unable to create file ./file/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt because File name too long in /home/dir/index.php on line 6 int(252)
發現運行到252的時候報錯了,252加上 ".txt" 這4個字符是256個字符,也就是說一個文件名最大可以是255個字符,那這255個字符就可以用來存儲數據了。
如何使用這樣的數據呢,可以這樣,將你要存儲的數據使用_分割開來然后查找的時候glob過濾
<?php $file = './file/'; $res = touch($file . "_2000_2001_2002_2003_.txt"); var_dump($res); // bool(true) $list = glob("./file/*_2000_*.txt"); var_dump($list); // array(1) { // [0]=> // string(32) "./file/_2000_2001_2002_2003_.txt" // }
同理可測文件夾最大長度也是255
<?php $file = './file/'; for ($i=1; $i <= 1000; $i++) { $name = str_repeat("a", $i); $res = mkdir($file . $name, 0755, true); if (!$res) { var_dump($i);exit; } }
PHP Warning: mkdir(): File name too long in /home/dir/index.php on line 6 int(256)
使用的時候也是可以這樣glob過濾
<?php $file = './file/'; $dir = $file . "_2020_2021_2022_"; is_dir($dir) || $res = mkdir($dir, 0755, true); $list = glob("./file/*_2021_*"); var_dump($list); // array(1) { // [0]=> // string(23) "./file/_2020_2021_2022_" // }
不過這個效率不怎么高,執行一次大概在0.09ms左右,換算成1秒也就只能跑1萬次左右,還是沒有xattr的讀取效率高。
