3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?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);
Output for 5.6.28, 7.0.20 - 7.2.0
Warning: fopen(/in/rLIaa.1.lock): failed to open stream: Permission denied in /in/rLIaa on line 12 Warning: flock() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 13 Warning: mkdir(): Permission denied in /in/rLIaa on line 24 Warning: fopen(./list/01.list): failed to open stream: No such file or directory in /in/rLIaa on line 7 Warning: fclose() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 7 Warning: filesize(): stat failed for ./list/01.list in /in/rLIaa on line 35 Warning: file_put_contents(./list/01.list): failed to open stream: No such file or directory in /in/rLIaa on line 38 Warning: fopen(/in/rLIaa.1.lock): failed to open stream: Permission denied in /in/rLIaa on line 55 Warning: flock() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 56 <t>[u02] Requested list is not exists.</t>
Output for 5.3.19 - 5.6.21, 7.0.0 - 7.0.6
Warning: fopen(/in/rLIaa.1.lock): failed to open stream: Read-only file system in /in/rLIaa on line 12 Warning: flock() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 13 Warning: mkdir(): Permission denied in /in/rLIaa on line 24 Warning: fopen(./list/01.list): failed to open stream: No such file or directory in /in/rLIaa on line 7 Warning: fclose() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 7 Warning: filesize(): stat failed for ./list/01.list in /in/rLIaa on line 35 Warning: file_put_contents(./list/01.list): failed to open stream: No such file or directory in /in/rLIaa on line 38 Warning: fopen(/in/rLIaa.1.lock): failed to open stream: Read-only file system in /in/rLIaa on line 55 Warning: flock() expects parameter 1 to be resource, boolean given in /in/rLIaa on line 56 <t>[u02] Requested list is not exists.</t>