Трабл с ПХП ? или не правильный скрипт?

Tayson

Новичок
Трабл с ПХП ? или не правильный скрипт?

На серваке (дебиан+ПХП5+Мускул) крутится 2 скрипта с сет_тайм_лимит=0
Скрипты используютс сокеты, принимают входящие соеденения, пишут в базу, и передают дальше по ерархии.
Передача данных происходит постоянно с интервалом в несколько минут.
Переодически наблюдаю такую картину: на сервак куда передаются данные по ерархии ничо не приходит.Смотрю на серваке - вроде все скрипты запущены, но они как бы остановились и стоят (в логи ничо не пишется).Т.е. я вижу что скрипты реально стоят около 8 часов. Каждый скрипт запущен в своем скрине. Останавливаю скрипт, который передает данные , и сразу стартую. И все начинает работать. Где собака зарылась - не пойму.

PHP:
while($result=="")  {
		$read=socket_read($socket,1024); //читаем ответ сервера, и выводим его
		
		//echo "zdu otveta...\n";
		$result.= $read;
		usleep(20);
		if (time()-$t> $time_live_socketa) {
			$errm="Bolee ".$time_live_socketa." sek net otveta ot XXX.";
			echo "$errm \n";
		// записываем ошибку в базу
		fun_err_socket($errm,$dt,$data1);
			$return_value=chr(0x45).chr(0x41);  //  - ошибка ответа  сокета
			return $return_value;
		}
		
	}
предпологаю что в этом куске скрипт стопорится. Уважаемые ГУРУ - плиз подскажите!
 

mity

Новичок
1) При закрытии сокета на другой стороне или разрыва связи socket_read вернёт false
2) Лучше проверять strlen($result)
3) Не забываем при ошибках закрывать сокет
4) time() возвращает время в секундах

PHP:
$result="";
while(strlen($result)==0)  { 
  $read=socket_read($socket,1024); //читаем ответ сервера, и выводим его 
  if($read===false){
	  fclose($socket);

    $errm="socket remote closed"; 
    echo "$errm \n"; 
      // записываем ошибку в базу 
    fun_err_socket($errm,$dt,$data1); 
    $return_value=chr(0x45).chr(0x41);  //  - сокет разорвался /  был закрыт с другой стороны
    return $return_value; 
	};
		 
  //echo "zdu otveta...\n"; 
  $result.= $read; 
	
	if(strlen($result)==0){
    usleep(1000); 
    if (time()-$t> $time_live_socketa) { 
	    fclose($socket);
		
      $errm="Bolee ".$time_live_socketa." sek net otveta ot XXX."; 
      echo "$errm \n"; 
      // записываем ошибку в базу 
      fun_err_socket($errm,$dt,$data1); 
      $return_value=chr(0x45).chr(0x41);  //  Тайм аут
      return $return_value; 
     }; 
   };      
 };

И потом вы ждёте первого чтения данных из сокета, уж не знаю какая там у вас логика в программе, но при медленном канале связи за одно чтение может быть прочитано меньше того, чем было отправлено в сокет.

usleep(20)
20 микросекунд это очень мало. Это создаёт необоснованную загрузку процессора, лучше поставить 1000 микросекунд = 1 милисенду =1/1000 сек
PHP:
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Переодически наблюдаю такую картину: на сервак куда передаются данные по ерархии ничо не приходит.Смотрю на серваке - вроде все скрипты запущены, но они как бы остановились и стоят (в логи ничо не пишется).Т.е. я вижу что скрипты реально стоят около 8 часов.
Если передающая сторона отвалилась, то ты будешь ООООЧЕНЬ долго ждать, пока освободится сокет в системе. Лучше такие процессы грохать по таймауту.

Да, и почему б вместо того, что бы не городить странные таймауты, не заюзать нормальный socket_select ?
 

Tayson

Новичок
спасибо. подправил. понаблюдаю. Про сокет_клозе совсем забыл !
 
Сверху