Answer the question
In order to leave comments, you need to log in
How effective is the script↓?
Here is a primitive DB script to store links for indexing:
<?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){
$r=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);
$r=true;
break;
} //записать data в список, дополнив пробелами и обрезав, чтобы data весил xreservedsize байт
$i++;
$pre='';
}
flock($lock, LOCK_UN);
fclose($lock);
return $r;
}
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";
$r=false;
} //если нет нужного списка, выдать ошибку
elseif(filesize($list)<($liststring*(xreservedsize+1))){
echo '<t>[u03] Requested string is not exists.</t>'."\n";
$r=false;
} //если нет нужной строки, выдать ошибку
else{
$listf=fopen($list, 'r');
fseek($listf, (($liststring-1)*(xreservedsize+1)));
$string=fgets($listf, xreservedsize);
$r=rtrim($string, ' ');
} //выдать строку, убрав лишние пробелы
flock($lock, LOCK_UN);
fclose($lock);
return $r;
}
Answer the question
In order to leave comments, you need to log in
You have an unpaired number of opening and closing curly braces.
xreservederror is a constant? And this is $GLOBALS[xreservederror] what is it?
hexdec($i) I would replace with intval($i,16). But hexdec('ff') would generally be replaced by 255. We
would create a variable.
This piece would be:
if($i<16)
$pre=0;
if(!file_exists('./db/'.$pre.dechex($i).'.list'))
mkfile('./db/'.$pre.dechex($i).'.list');
if($i>hexdec('ff')){
return false;
$GLOBALS[xreservederror].='<t>[u01] Database is full.</t>';
break;
}
$data.=str_repeat(' ', $size);
$data=substr($data, $size);
Even though I'm not invited, something seems to be wrong here:
if($i>hexdec('ff')){ // $i > 0xFF
return false;
// Сюда никогда не попадём =(
// А тут ещё и undefined константа
$GLOBALS[xreservederror].='<t>[u01] Database is full.</t>';
break;
}
if(!file_exists('./db/'.$pre.dechex($listindex).'.list')){
// ...
}elseif(filesize('./db/'.$pre.dechex($listindex).'.list')<($liststring*($size+1))){
// ...
}else{
$listf=fopen('./db/'.$pre.dechex($listindex).'.list', 'r');
fseek($listf, ($liststring*($size+1)));
// ...
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question