// стадия 1
class Cache_Server{
// 2.0 обрабатываються все переменные
const PARSER_RAW_SECTION_COMMAND = 'raw_command';
const PARSER_RAW_SECTION_DATA = 'raw_data';
const HANDLER_COMMAND_COMMON_PREFIX = '_hook_';
const HANDLER_COMMAND_SET_KEY = 'key';
const HANDLER_COMMAND_SET_DATA = 'data';
const HANDLER_COMMAND_SET_SUCCESS = 1;
const HANDLER_COMMAND_SET_FAILURE = 0;
const SOCKET_BLOCK_READ_SIZE = 64;
const SOCKET_TERMINATE_BYTE = "\0";
const ERROR_SERVER_SETUP_MESSAGE = "Could not setup server socket";
const ERROR_SERVER_SETUP_CODE = 2;
protected $_sAddress = '127.0.0.1';
protected $_sPort = '23540';
protected $_rgClients = array(); protected $_rgErrors = array(); private $__rgCache = array(); private $__rSocket = null;
// 2.1 запускается автоматом конструктор и выполняется внос данных в переменные
public function __construct($sHost=null, $sPort=null){
if(isset($sHost)&&isset
($sPort)){ $this->_sAddress = $sHost;
$this->_sPort = $sPort;
}
}
// вот наша стадия 2.2
public function runServer(){
//3. как понимаю сначало это, на проверку создания
if(!$this->__setup_socket()){
$this->setError(self::ERROR_SERVER_SETUP_CODE, self::ERROR_SERVER_SETUP_MESSAGE);// 4.1 это вроде типа если ошибки
return false;
}
//4.2 это вроде цикла прослушивания
while(true){
$this->_check_clients();
$this->_listen_clients();
}
}
//errors functions:
public function getLastError(){
return $this->_rgErrors
[count($this->_rgErrors
)-1
]; }
// стадия 4.1
public function setError($iCode, $sMessage){
$this->_rgErrors
[] = array($iCode=>$sMessage);// занос в массив }
// ненашел?
public function getKey($mClient, $mKey){
$sKey = $this->__generate_key_hash($mClient, $mKey);
}
// ненашел?
public function setKey($mClient, $mKey, $mValue){
unset($this->__rgCache
[$this->__generate_key_hash
($mClient, $mKey)]); }else{
$this->__rgCache[$this->__generate_key_hash($mClient, $mKey)]=$mValue;
}
}
//8. бесконечный цикл порверки данных
protected function _check_clients(){
// ждем данных но только не от себя
$this->_rgClients[] = $rNewc; // не понял зачем себя вносить в массив?
}
}
//9. работа с клиентами
protected function _listen_clients($bCheckAlive=false// не понял что значит?){
foreach($this->_rgClients as $iIndex => $rClient){ // тоже не догнал манипуляция с клиентами чтоли?
if($sData = $this->__get_socket_data($rClient)){ // 10. типа что то читаем или получаем
if($rgCommand = $this->__parse_raw_command($sData)){ // 11. ну это вроде обработка чего получили
$this->_execute_command($iIndex, $rgCommand[self::PARSER_RAW_SECTION_COMMAND], $rgCommand[self::PARSER_RAW_SECTION_DATA]);// 12. что то о безопастности
}
}
}
}
// стадия 12
protected function _execute_command($mClient, $sCommand, $mParameters){
if(method_exists($this, $sCommand=self::HANDLER_COMMAND_COMMON_PREFIX.$sCommand)){ $this->$sCommand($mClient, $mParameters);
}
}
// ненашел?
protected function _hook_get($mClient, $mParameters){
$mClient = is_resource($mClient)?
$mClient:$this->_rgClients
[$mClient]; $this->__send_socket_data($mClient, $this->getKey($mClient, (string)$mParameters));
}
// ненашел?
protected function _hook_set($mClient, $mParameters){
$mClient = is_resource($mClient)?
$mClient:$this->_rgClients
[$mClient]; $sKey = $rgParameters[self::HANDLER_COMMAND_SET_KEY];
$this->setKey($mClient, $sKey, null);
$this->setKey($mClient, $sKey, $rgParameters[self::HANDLER_COMMAND_SET_DATA]);
}
$this->__send_socket_data($mClient, self::HANDLER_COMMAND_SET_SUCCESS);
return true;
}
}
$this->__send_socket_data($mClient, self::HANDLER_COMMAND_SET_FAILURE);
return false;
}
// ненашел?
private function __generate_key_hash($mClient, $mKey){
return md5($mClient."\n\n".$mKey); }
//5. подготовка к подключению и создания сокета
private function __setup_socket(){
if(!@socket_bind($this->__rSocket
,$this->_sAddress
,$this->_sPort
)){ return false;
}
return true;
}
// ненашел?
private function __send_socket_data($rSocket, $sData){
return socket_write($rSocket, $sData.self::SOCKET_TERMINATE_BYTE); }
// стадия 10
private function __get_socket_data($rSocket){
$sResult = false;
while($sBuffer = @socket_read($rSocket, self::SOCKET_BLOCK_READ_SIZE)){ // типа вносим в буфер по каким то определенным критериям $sResult.=$sBuffer;
}
return $sResult===false?null:$sResult;
}
// стадия 11
private function __parse_raw_command($sData){
return $mData;
}
return null;
}
}
$rServer = new Cache_Server();// 1. создаем класс
$rServer->runServer();// 2.2 запускаем функцию