3v4l.org

run code in 300+ PHP versions simultaneously
<?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