<?php
define('xreservedmaxstrings', 1000000); //кол-во строк в списке
define('xreservedsize', 128); //длинна строки в списке
function mkfile($path){
fclose(fopen($path, 'a'));
}
function putdata($data){
$lock=fopen(__FILE__.'.1.lock', 'w+');
flock($lock, LOCK_EX); //блокируем файл lock для избежания коллизий
$i=1;
while(true){
if($i<16)
$pre=0; //ведущий ноль
$dir='./list/';
$list=$dir.$pre.dechex($i).'.list'; //путь к списку
if(!file_exists($dir))
mkdir($dir); //если нет папки, создать
if(!file_exists($list))
mkfile($list); //если нет списка, создать
if($i>255){
return false;
echo '<t>[u01] Lists are full.</t>'."\n";
break;
} //если заполнены 255 списков, выдать ошибку
if(filesize($list)<(xreservedmaxstrings*(xreservedsize+1))){ //если список не заполнен
$data.=str_repeat(' ', xreservedsize);
$data=substr($data, 0, xreservedsize);
file_put_contents($list, $data."\n", LOCK_EX|FILE_APPEND);
return true;
break;
} //записать data в список, дополнив пробелами и обрезав, чтобы data весил xreservedsize байт
$i++;
$pre='';
}
flock($lock, LOCK_UN);
fclose($lock);
}
function getdata($index){
$lock=fopen(__FILE__.'.1.lock', 'w+');
flock($lock, LOCK_EX); //блокируем файл lock для избежания коллизий
$listindex=ceil($index/xreservedmaxstrings); //вычисляем номер списка
$liststring=($index-($listindex-1)*xreservedmaxstrings); //вычисляем номер строки
$pre='';
if($listindex<16)
$pre=0; //ведущий ноль
$list='./list/'.$pre.dechex($listindex).'.list'; //путь к списку
if(!file_exists($list)){
echo '<t>[u02] Requested list is not exists.</t>'."\n";
return false;
} //если нет нужного списка, выдать ошибку
elseif(filesize($list)<($liststring*(xreservedsize+1))){
echo '<t>[u03] Requested string is not exists.</t>'."\n";
return false;
} //если нет нужной строки, выдать ошибку
else{
$listf=fopen($list, 'r');
fseek($listf, (($liststring-1)*(xreservedsize+1)));
$string=fgets($listf, xreservedsize);
return rtrim($string, ' ');
} //выдать строку, убрав лишние пробелы
flock($lock, LOCK_UN);
fclose($lock);
}
putdata('text'); echo getdata(1);
preferences:
53.29 ms | 402 KiB | 5 Q