рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА / рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реЗрдбрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ред рдЪреВрдБрдХрд┐ рдХреБрдЫ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореВрд▓реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА php рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ (phpredis рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЗрд╕реА рдмреИрд▓реЗрдВрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдорд┐рддрддрд╛ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред рдХрд╛рд╢, рдкреНрд░реЙрдХреНрд╕реА рд╣рдореЗрд╢рд╛ рдЬрдЯрд┐рд▓ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд░рддрд╛ ...
рд╣рд░ 10 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рд░реЗрдбрд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдФрд░ рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд╣рд░ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдирд╛, рдкрдХрдбрд╝рдиреЗ рдХреА рдереЛрдбрд╝реА рд╕реА рднреА рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░ рдХреНрд░реИрд╢ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдереАред рдлрд┐рд░ рдореБрдЭреЗ рд░реЗрдбрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдиреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛ ...
рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрджреНрднреБрдд
__call рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдЗрдирдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рдзрд┐ рдФрд░ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо
call_user_func_array рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд░реЛрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ, рдкрдХрдбрд╝реЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓ call_user_func_array рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдХреБрд▓ __call рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
public function __call($name, $arguments) { $i=0; while(true) { try{ return call_user_func_array(array($this->obj, $name), $arguments); break; } catch (Exception $e) { $this->handle_exception($e,$name,$arguments); if($i<5) $i++; else die('5 time redis lug'); } } }
рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред 5 рдЕрд╕рдлрд▓ рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдкреАрдбрд╝рд╛ рджреЗрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдзреВрдореНрд░рдкрд╛рди рд▓реЙрдЧ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ ...
рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:
class RedisErrHandler { private $obj; private $ip; private $port; private $timeout; public function __construct($ip,$port,$timeout=0) { $this->ip=$ip; $this->port=$port; $this->timeout=$timeout; $this->rconnect(); } private function rconnect() { $this->obj=new Redis; $this->obj->connect($this->ip,$this->port,$this->timeout) or die('Error connecting redis'); } public function __call($name, $arguments) { $i=0; while(true) { try{ return call_user_func_array(array($this->obj, $name), $arguments); break; } catch (Exception $e) { $this->handle_exception($e,$name,$arguments); if($i<5) $i++; else die('5 time redis lug'); } } } private function handle_exception($e,$name,$args) { $err=$e->getMessage(); $msg="Caught exception: ".$err."\tcall ".$name."\targs ".implode(" ",$args)."\n"; if($_SERVER['LOG']) { $handle2=fopen('redis_log.txt','a'); fwrite($handle2,date('H:i:s')."\t$msg"); fclose($handle2); } echo $msg; if(substr(trim($err),0,37)=='Caught exception: protocol error, got') die('bye'); $this->rconnect(); } }
рд╡рд╣ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддреНрд░реБрдЯрд┐" рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╕реНрдерд╛рди рдкрд░ "рдФрд░" рдорд░ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдареАрдХ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдо рд╢рд┐рдХрд╛рд░ рдереЗред
рдЗрд╕рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛
$r=new Redis(); $r->connect('127.0.0.1',6379,10);
рдкрд░
$r=new RedisErrHandler('127.0.0.1',6379,10);
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдиреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдмрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд▓реНрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реБрдИред рдЪреВрдВрдХрд┐ рдлрд╝реНрд░реЗрдбреНрд░рд┐рд╕ рдореЗрдВ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рднреА рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╣реБ рд╡рд┐рдзрд┐ рдХреЛ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛:
public function multi($type) { return new RedisMultiErrHandler($this->obj,$type,$this->ip,$this->port,$this->timeout); }
рдареАрдХ рд╣реИ, рдПрдХ рд▓реЗрдирджреЗрди рд╡рд╕реНрддреБ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдЕрдиреБрд░реВрдк
class RedisMultiErrHandler { private $obj; private $ip; private $port; private $timeout; private $m; private $type; private $commands; public function __construct(&$redis,$type,$ip,$port,$timeout=0) { $this->ip=$ip; $this->port=$port; $this->timeout=$timeout; $this->type=$type; $this->obj=$redis; $this->m=$this->obj->multi($type); } private function rconnect() { $this->obj=new Redis; $this->obj->connect($this->ip,$this->port,$this->timeout) or die('Error connecting redis'); $this->m=$this->obj->multi($this->type); } public function __call($name, $arguments) { $this->commands[]=array('name'=>$name, 'arguments'=>$arguments); return $this; } private function handle_exception($e) { $err=$e->getMessage(); $msg=''; foreach($this->commands as $command) { $msg.="Multi sent\tcall ".$command['name']."\targs ".implode(" ",$command['arguments'])."\n"; } $msg.="Caught exception: ".$err."\n"; if($_SERVER['LOG']) { $handle2=fopen('redis_multi_log.txt','a'); fwrite($handle2,date('H:i:s')."\t$msg"); fclose($handle2); } echo $msg; if(substr(trim($err),0,37)=='Caught exception: protocol error, got') die('bye'); $this->rconnect(); } public function exec() { $i=0; while(true) { foreach($this->commands as $command) { call_user_func_array(array($this->m, $command['name']), $command['arguments']); } try{ return $this->m->exec(); break; } catch (Exception $e) { $this->handle_exception($e); if($i<5) $i++; else die('5 time mredis lug'); } } } }
рдкреНрд░рд╕реНрдерд╛рди рдкрд░ рд╕рднреА рд▓реЗрдирджреЗрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЙрд▓ (), рдЬреЛ рд╕реАрдзреЗ рд▓реЗрдирджреЗрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдХреЛ рд╕рд░рдгреА рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рддреНрдпрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдпрд╣ рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВ рдЦрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХрднреА-рдХрднреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ, рдореВрд▓реА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рдореВрд▓реА рдХрдиреЗрдХреНрд╢рди рдлреНрд░реАрдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд░реИрдкрд░ рдбреЗрдЯрд╛ рдЖрдЬ рддрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред