Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблема с размером ответа от сервера через сокеты

 PHP.SU

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


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

> Без описания
mindcraft
Отправлено: 22 Ноября, 2011 - 15:08:34
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Есть функция:
PHP:
скопировать код в буфер обмена
  1. function GetHallPlan(){
  2.         $fp = fsockopen("192.168.200.1", 9194, $errno, $errstr, 30);
  3.         if (!$fp){
  4.                 echo "$errstr ($errno)<br> ";
  5.         }
  6.         else{
  7.                 $wait = true;
  8.                 stream_set_blocking($fp, 0);
  9.                
  10.                 $query = "тут_запрос_к_серверу";
  11.  
  12.                 fwrite($fp, $query);
  13.                         while (!feof($fp)){
  14.                                 $r = fgets($fp);
  15.                                
  16.                                 if(!empty($r)){                
  17.                                         $xml = simplexml_load_string($r);
  18.                                         foreach($xml->Data->Session->Theatre->Hall->Levels->Level->Places->Place as $chair){
  19.                                                 $top =  $chair['Y'];
  20.                                                 $left =  $chair['X'];
  21.                                                 $row = $chair['Row'];
  22.                                                 $num =  $chair['Place'];
  23.                                                 $status = $chair['Status'];
  24.                                                 if($status!=4 && $status!=5){
  25.                                                         echo"
  26.                                                                 <span style='top:".$top."px; left:".$left."px;'>".$num."</span>
  27.                                                         ";
  28.                                                 }
  29.                                                 elseif($status==4 || $status==5){
  30.                                                         echo"
  31.                                                                 <span class='busy' style='top:".$top."px; left:".$left."px;'>".$num."</span>
  32.                                                         ";
  33.                                                 }
  34.                                         }
  35.                                 }
  36.                                
  37.                                 if (!strcmp($r, "")){
  38.                                         if (!$wait){
  39.                                                 break;
  40.                                         }
  41.                                 }
  42.                                 else{
  43.                                         $wait = false;
  44.                                 }
  45.                         }
  46.                         fclose($fp);
  47.                
  48.         }
  49. }


Функция делает следующее:
1. устанавливает сокет-соединение с сервером кинотеатра
2. отправляет запрос на сервер
3. получает ответ и пишет его в переменную $r
4. обрабатывает ответ, выводя план зала

Ответом является xml-файл вида:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?xml version='1.0' encoding='Windows-1251' standalone='yes'?>
  2. <XML>
  3. <Result>Ok</Result>
  4. <Error></Error>
  5. <Remark></Remark>
  6. <Data>
  7. <Session ID='35990' Geometry='1' ShowBusyPlaces='1'>
  8. <Theatre ID='1'>
  9. <Hall ID='1'>
  10. <Levels>
  11. <Level ID='1' Reservation='1' Sale='0'>
  12. <Places PlacesCount='250' PlacesLimit='100' Width='690' Height='765'>
  13. <Place ID='3' Row='1' Place='1' X='90' Y='45' Width='35' Height='35'></Place>
  14. ... много мест в кинозале...
  15. <Place ID='131' Row='9' Place='9' X='410' Y='365' Width='35' Height='35'></Place>
  16. </Places>
  17. </Level>
  18. </Levels>
  19. </Hall>
  20. </Theatre>
  21. <Movie ID='343'>
  22. </Movie>
  23. <Date>24.11.2011</Date>
  24. <Time>11:15</Time>
  25. </Session></Data>
  26. </XML>


Проблема в том, что в $r пишется не весь ответ а его часть.
Вот результат var_dump($r):
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version='1.0' encoding='Windows-1251' standalone='yes'?><XML><Result>Ok</Result><Error></Error><Remark></Remark><Data><Session ID='36006' Geometry='1' ShowBusyPlaces='1'><Theatre ID='1'><Hall ID='1'><Levels><Level ID='1' Reservation='1' Sale='0'><Places PlacesCount='250' PlacesLimit='100' Width='690' Height='765'><Place ID='3' Row='1' Place='1' X='90' Y='45' Width='35' Height='35'></Place>
  3. ...
  4. <Place ID='16"

и на этом обрывается.

Соответственно, функция выводит следующее:

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : AttValue: ' expected in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ' Y='605'></Place><Place ID='222' X='450' Y='605'></Place><Place ID='223' X='490 in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : attributes construct error in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ' Y='605'></Place><Place ID='222' X='450' Y='605'></Place><Place ID='223' X='490 in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Couldn't find end of Start Tag Place line 1 in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ' Y='605'></Place><Place ID='222' X='450' Y='605'></Place><Place ID='223' X='490 in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in X:\home\kino-tver.new\www\common.php on line 253

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Premature end of data in tag Places line 1 in X:\home\kino-tver.new\www\common.php on line 253
...

и т.д.

Если ответ от сервера брать из физического файла и обрабатывать с помощью simplexml_load_file - все работает нормально.
Но необходимо обрабатывать именно строку.
Заранее спасибо за любую помощь.

(Отредактировано автором: 22 Ноября, 2011 - 15:19:33)

 
 Top
Viper
Отправлено: 22 Ноября, 2011 - 15:26:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Цитата:
AttValue: ' expected
ожидается '
Проблема с кавычками.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
mindcraft
Отправлено: 22 Ноября, 2011 - 16:58:28
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Я понимаю, что проблема с кавычками (и не только с ними), но это следствие того, что xml-ответ получен не полностью.
Основной вопрос - почему он не полностью получен?
 
 Top
Stierus Супермодератор
Отправлено: 22 Ноября, 2011 - 17:01:27
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




$r = fgets($fp);

В $r пишется ровно 1 строка и эта строка каждый раз разная Улыбка Объединяйте эти строки в одну переменную и после цикла работайте с ней .... если файл не слишком большой Улыбка
 
My status
 Top
mindcraft
Отправлено: 22 Ноября, 2011 - 17:03:31
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




А каким образом объединять их в одну? Не очень понял идею.
 
 Top
Stierus Супермодератор
Отправлено: 22 Ноября, 2011 - 17:14:11
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




идея в том, что бы из этих строк получить целиковый документ
 
My status
 Top
mindcraft
Отправлено: 22 Ноября, 2011 - 17:22:18
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Попытался таким образом:
PHP:
скопировать код в буфер обмена
  1.  while (!feof($fp)){
  2.   $r = $r.fgets($fp);
  3. ...
  4.  


В итоге получил повисший браузер не сумевший переварить бесконечный $r.
Тогда попытался вот так:
PHP:
скопировать код в буфер обмена
  1. while (!feof($fp)){
  2. while (strlen($r)<=15033){
  3.  $r = $r.fgets($fp);
  4. ...
  5.  

где 15033 - это количество символов в ответе (эту величину я могу получить от сервера), но результат тот же - бесконечный $r.
 
 Top
Viper
Отправлено: 23 Ноября, 2011 - 07:38:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




mindcraft http://ru.php.net/manual/en/func...kopen.php#101872 первый комент


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
mindcraft
Отправлено: 23 Ноября, 2011 - 11:07:01
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Viper - спасибо, функция работает, но не вполне понятно как.
Кажется дело в
PHP:
скопировать код в буфер обмена
  1. while ($line = fgets($fp)) $ret .= $line;
?
 
 Top
Viper
Отправлено: 23 Ноября, 2011 - 11:56:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




mindcraft в line получается строка + приращение


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB