PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 2
Shyt Отправлено: 05 Января, 2014 - 14:46:12 • Тема: Обработчик кеширования • Форум: Пользовательские функции

Ответов: 14
Просмотров: 3707
p.s Если что не судите строго, первый раз вообще смотрю на это

так всё интересно, но я много чего не смог понять, не могли бы вы мне помочь разобраться в этом примере и посмотреть как я разобрался в нем, я прогнал всё что понял но не уверен конечно что прав и остались некоторые нюансы

PHP:
скопировать код в буфер обмена
  1.  
  2. // стадия 1
  3. class Cache_Server{
  4.         // 2.0 обрабатываються все переменные
  5.     const PARSER_RAW_SECTION_COMMAND    = 'raw_command';
  6.     const PARSER_RAW_SECTION_DATA       = 'raw_data';
  7.     const HANDLER_COMMAND_COMMON_PREFIX = '_hook_';
  8.     const HANDLER_COMMAND_SET_KEY       = 'key';
  9.     const HANDLER_COMMAND_SET_DATA      = 'data';
  10.     const HANDLER_COMMAND_SET_SUCCESS   = 1;
  11.     const HANDLER_COMMAND_SET_FAILURE   = 0;
  12.        
  13.     const SOCKET_BLOCK_READ_SIZE        = 64;
  14.     const SOCKET_TERMINATE_BYTE         = "\0";
  15.        
  16.     const ERROR_SERVER_SETUP_MESSAGE    = "Could not setup server socket";
  17.     const ERROR_SERVER_SETUP_CODE       = 2;
  18.        
  19.     protected $_sAddress                = '127.0.0.1';
  20.         protected $_sPort                   = '23540';
  21.     protected $_rgClients               = array();
  22.     protected $_rgErrors                = array();
  23.     private   $__rgCache                = array();
  24.     private   $__rSocket                = null;
  25.    
  26.         // 2.1 запускается автоматом конструктор и выполняется внос данных в переменные
  27.     public function __construct($sHost=null, $sPort=null){
  28.         if(isset($sHost)&&isset($sPort)){          
  29.             $this->_sAddress = $sHost;
  30.             $this->_sPort = $sPort;
  31.                         }
  32.         }
  33.        
  34.         // вот наша стадия 2.2
  35.     public function runServer(){
  36.                 //3. как понимаю сначало это, на проверку создания
  37.         if(!$this->__setup_socket()){
  38.             $this->setError(self::ERROR_SERVER_SETUP_CODE, self::ERROR_SERVER_SETUP_MESSAGE);// 4.1 это вроде типа если ошибки
  39.             return false;
  40.                         }
  41.         //4.2 это вроде цикла прослушивания  
  42.                 while(true){
  43.             $this->_check_clients();
  44.             $this->_listen_clients();
  45.             }
  46.         }
  47.                
  48.         //errors functions:
  49.     public function getLastError(){
  50.         return $this->_rgErrors[count($this->_rgErrors)-1];
  51.         }
  52.      
  53.         // стадия 4.1
  54.     public function setError($iCode, $sMessage){
  55.         $this->_rgErrors[] = array($iCode=>$sMessage);// занос в массив
  56.         }
  57.                
  58.                
  59.     // ненашел?
  60.         public function getKey($mClient, $mKey){
  61.         $sKey = $this->__generate_key_hash($mClient, $mKey);
  62.         return array_key_exists($sKey, $this->__rgCache)?$this->__rgCache[$sKey]:null;
  63.         }
  64.    
  65.         // ненашел?
  66.     public function setKey($mClient, $mKey, $mValue){
  67.         if(!isset($mValue)){
  68.             unset($this->__rgCache[$this->__generate_key_hash($mClient, $mKey)]);
  69.         }else{
  70.             $this->__rgCache[$this->__generate_key_hash($mClient, $mKey)]=$mValue;
  71.             }
  72.         }
  73.  
  74.                
  75.         //8. бесконечный цикл порверки данных
  76.     protected function _check_clients(){
  77.                 // ждем данных но только не от себя
  78.         if(($rNewc = @socket_accept($this->__rSocket)) !== false){
  79.             socket_set_nonblock($rNewc); // это типа вроде мы, но я не допер
  80.             $this->_rgClients[] = $rNewc; // не понял зачем себя вносить в массив?
  81.             }
  82.         }
  83.    
  84.         //9. работа с клиентами
  85.     protected function _listen_clients($bCheckAlive=false// не понял что значит?){
  86.         foreach($this->_rgClients as $iIndex => $rClient){ // тоже не догнал манипуляция с клиентами чтоли?
  87.             if($sData = $this->__get_socket_data($rClient)){ // 10. типа что то читаем или получаем
  88.                 if($rgCommand = $this->__parse_raw_command($sData)){ // 11. ну это вроде обработка чего получили
  89.                     $this->_execute_command($iIndex, $rgCommand[self::PARSER_RAW_SECTION_COMMAND], $rgCommand[self::PARSER_RAW_SECTION_DATA]);// 12. что то о безопастности
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.                
  95.                
  96.     // стадия 12
  97.     protected function _execute_command($mClient, $sCommand, $mParameters){
  98.         if(method_exists($this, $sCommand=self::HANDLER_COMMAND_COMMON_PREFIX.$sCommand)){
  99.             $this->$sCommand($mClient, $mParameters);
  100.             }
  101.         }
  102.        
  103.         // ненашел?
  104.     protected function _hook_get($mClient, $mParameters){
  105.         $mClient  = is_resource($mClient)?$mClient:$this->_rgClients[$mClient];
  106.         $this->__send_socket_data($mClient, $this->getKey($mClient, (string)$mParameters));
  107.         }
  108.      
  109.         // ненашел?
  110.     protected function _hook_set($mClient, $mParameters){
  111.         $mClient = is_resource($mClient)?$mClient:$this->_rgClients[$mClient];
  112.         if($rgParameters = @unserialize($mParameters)){
  113.             if(array_key_exists(self::HANDLER_COMMAND_SET_KEY, $rgParameters)){
  114.                 $sKey = $rgParameters[self::HANDLER_COMMAND_SET_KEY];
  115.                 $this->setKey($mClient, $sKey, null);
  116.                 if(array_key_exists(self::HANDLER_COMMAND_SET_DATA, $rgParameters)){
  117.                     $this->setKey($mClient, $sKey, $rgParameters[self::HANDLER_COMMAND_SET_DATA]);                    
  118.                     }
  119.                 $this->__send_socket_data($mClient, self::HANDLER_COMMAND_SET_SUCCESS);
  120.                                 return true;
  121.                                 }
  122.                         }
  123.             $this->__send_socket_data($mClient, self::HANDLER_COMMAND_SET_FAILURE);
  124.             return false;
  125.         }
  126.        
  127.         // ненашел?
  128.     private function __generate_key_hash($mClient, $mKey){
  129.         return md5($mClient."\n\n".$mKey);
  130.         }
  131.                
  132.     //5. подготовка к подключению и создания сокета
  133.     private function __setup_socket(){
  134.         $this->__rSocket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  135.         if(!@socket_bind($this->__rSocket,$this->_sAddress,$this->_sPort)){
  136.             unset($this->__rSocket);
  137.             return false;
  138.             }
  139.        
  140.                 socket_listen($this->__rSocket);// 6. прослушиваем подключение
  141.         socket_set_nonblock($this->__rSocket);// 7. не врубился но вроде постояная активность
  142.         return true;
  143.         }
  144.    
  145.         // ненашел?
  146.     private function __send_socket_data($rSocket, $sData){
  147.         return socket_write($rSocket, $sData.self::SOCKET_TERMINATE_BYTE);
  148.         }
  149.    
  150.         // стадия 10
  151.     private function __get_socket_data($rSocket){
  152.         $sResult = false;
  153.         while($sBuffer = @socket_read($rSocket, self::SOCKET_BLOCK_READ_SIZE)){ // типа вносим в буфер по каким то определенным критериям
  154.             $sResult.=$sBuffer;
  155.             }
  156.         return $sResult===false?null:$sResult;
  157.         }
  158.                
  159.     // стадия 11  
  160.     private function __parse_raw_command($sData){
  161.         $mData = @unserialize($sData);
  162.         if(is_array($mData) && array_key_exists(self::PARSER_RAW_SECTION_COMMAND, $mData)){
  163.             return $mData;
  164.             }
  165.         return null;
  166.         }
  167.     }
  168.        
  169. $rServer = new Cache_Server();// 1. создаем класс
  170. $rServer->runServer();// 2.2 запускаем функцию
Shyt Отправлено: 05 Января, 2014 - 08:29:42 • Тема: Передача сокетов • Форум: FreeLance

Ответов: 1
Просмотров: 688
“Не знал куда написать, вроде не работа и не скрипт, если что не судите строго”
Добрый день! сразу перейду к главному
Я хочу разобраться с Php и написание на нем сокет сервер, мне нужна помощь хорошего специалиста

Ну и: я плачу 10000 рублей, конечно не много.
Обращаться: shyt_nik_1985 (skype)

Задачи:
1. Прием данных
2. Отправка данных
3. Работа с одним подключением
4. Работа с много подключением
5. Безопастность
6. Пример работы
7. Объяснить

Если что:
Php я изучаю более 3 лет, разбираюсь не плохо просто руки до этого не доходили, вот решил.

P.S Прошу тех кто мало разбирается не обращаться, спасибо

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB