Мобильный кошелек - скрипт для работы

Shadow48

Новичок
Мобильный кошелек - скрипт для работы

Здравствуйте.

Кто-нибудь работал с мобильным кошельком (mobw.ru) как провайдер?

У меня проблема такая, что скрипт ждет ответа 20 секунд!

Он отсылает запросы на их сервер и ждет ответа. Скрипт написан по примеру из их документации.
Ничего внятного поддержка не может сказать, они сами не с php работают, и как я понял, не знают его.



Если кто-то работал с мобильным кошельком, то приведу более подробные данные.
Я уже неделю сижу и пробую переписать скрип на разный лад, но результат тот же :(
 

Shadow48

Новичок
В общем я победил их сам :)

Скрипт переписал через curl.
Работа через сокеты, как рекомендуют они, тормозит.
 

kruglov

Новичок
Ну, curl тоже не через астрал, а через сокеты работает.
И нет ничего такого, что умеет curl, и что невозможно вручную написать.
 

Shadow48

Новичок
Тем не менее эта функция томозится на 20 в момент fread.
PHP:
function send_mobw ($data) {
  $result='';
  $URL_info = parse_url('http://www.mobw.ru/term2/xmlutf.jsp');

  if (!isset($URL_info['port'])) $URL_info['port']=80;
  $rq = 'POST '.$URL_info['path']." HTTP/1.1\n";
  $rq .= 'Host: '.$URL_info['host']."\n";
  $rq .= 'Content-type: application/x-www-form-urlencoded'."\n";
  $rq .= 'Content-length: '.strlen($data)."\n";
  $rq .= 'Connection: close'."\n";
  $rq .= $data."\n";
  
  $fp = fsockopen($URL_info['host'],$URL_info['port']);
  fputs ($fp, $rq);

  $result .= fread($fp, 3000);

  fclose($fp);

  return $result;
}
 

kruglov

Новичок
Ну так надо следить за content-length или обрабатывать chunked, а не просто качать до опупения.

-~{}~ 25.09.08 18:03:

Но вообще, CURL в данном случае, конечно, правильнее, т.к. зачем лишнюю работу делать, если она уже сделана...
 

SiMM

Новичок
> обрабатывать chunked
Не проще запрос в HTTP/1.0 отсылать?
 

kruglov

Новичок
Тогда и может получиться ситуация, что сервер про длину контента не знает, content-type не дает, а соединение по его окончанию не сразу разрывает (встречаются такие сервера).
 

Shadow48

Новичок
Я пробовал HTTP/1.0

Пробовал читать файл
PHP:
  while(!feof($fp)) {
    $result .= fgets($fp,128);
  }
но тут еще интереснее... перед стением последней строки еще возникает задержка в 10 секунд.


kruglov, как же тогда curl понимает, что пора закрыть соединение?
 

SiMM

Новичок
> а соединение по его окончанию не сразу разрывает
Это даже не смотря на Connection: close?
 

Shadow48

Новичок
Именно такая и была функция.

Вот интересный лог файл, когда тестировал функцию с построчным чтением данных:

начали15:49:07
открыли сокет15:49:07
отправили xml15:49:07
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:27
считали строку ответа15:49:37
закрыли сокет15:49:37
вывели на экран15:49:37
 

kruglov

Новичок
Shadow48
kruglov, как же тогда curl понимает, что пора закрыть соединение?
Как количество счинанных байт сравнялось с количеством заявленных.


SiMM
Ну, боюсь подпасть под статью о краже контента, но бывало, что даже с connection:close простое чтение через http/1.0 до feofа "подвисало".
 

Shadow48

Новичок
Господа, правильно ли я понимаю, что проблема скорее всего на стороне сервера?
 

Shadow48

Новичок
Хм. Я пробовал скрипт на трех хостингах.
Этот скрипт предлагается ими, а через curl то я сам сделал.
 
Сверху