Проблема с хинтами в связке AJAX + SOAP

Gerr_ZINger

Новичок
Проблема с хинтами в связке AJAX + SOAP

Есть задача:
Сделать хинты, которые через AJAX подгружали с SOAP сервера/сервиса необходимую информацию. В моем случае это краткое оглавление книги.

Вот PHP функция формирования данных:
PHP:
function get_book_contents_ajax($idbook)
{
	global $user,$soapclient;
	$html = "";
	$contents = $soapclient->book_contents("!!! DEBUG !!!",$idbook);
	$contents = parse_data($contents);	 
		
	foreach($contents["name"] as $val)
		$html .= $val."<br>";
	
	return $html;
}
Вот часть AJAX:
Код:
<script type="text/javascript">
	<? sajax_show_javascript(); ?>
	var cbuf = new Array(); //Буфер уже полученых данных
	var lastbid = 0;  //ID книги последнего запроса
	var ajaxinprogress=false; //Запускался ли AJAX
	
	function do_get_book_content_cb(z)  
 {
		ajaxinprogress=false; //Ajax успешно отработал
		hintbody = "<div style='font-weight:bold;'>Оглавление</div>";
		if(z)
			hintbody += unescape(z);
		else 
			hintbody += "Оглавления нет";

		dhint.innerHTML = hintbody; //Пишем в слой с хинтом данные
		cbuf[lastbid] = dhint.innerHTML; //и в буфер
	}
	
	function do_get_book_content(bookid)  //ВЫЗЫВАЕТЬСЯ НА OnMouseOver; примерно так <A href="..." onMouseOver="...">Title</a>  
	{
		if(!cbuf[bookid]) //Если в буфере нет
		{
			if(!ajaxinprogress) //Если вызова АЯКС небыло
			{
				ajaxinprogress = true; //Стафим флаг - вызван
				lastbid = bookid; 
				x_get_book_contents_ajax(bookid, do_get_book_content_cb); //AJAX ВЫЗОВ
			}
			else 
			if(lastbid!=bookid) //Если вызов был но не для текущей книги
			{
				sajax_cancel(); //Отменяем предидущий вызов
				lastbid=bookid;
				x_get_book_contents_ajax(bookid, do_get_book_content_cb); //AJAX ВЫЗОВ
			}
			showhint("Загрузка...");
		}
		else
			showhint(cbuf[bookid]); //Выводим из буфера
	}
	function cancel_get_book_content()  //ВЫЗЫВАЕТЬСЯ НА OnMouseOut;
	{
		if(ajaxinprogress) //Если есть АЯКС вызов
		{
			lastbid=0;
			sajax_cancel(); //Отменяем
			ajaxinprogress=false; //Говорим что нет :)
		}
		hidehint();//Прячем хинт
	}
</script>
<!-- AJAX END -->
вот код создание клиента
PHP:
if(!isset(soapclient))  	
  try{  		
$soapclient = new SoapClient($WSDL,$SOAPPARAMS);  	
}  	
catch(SoapFult $e){  		
  die("Невозможно установить соединение с сервисом $WSDL");  	
}
Код создания клиента инклудится во все скрипты.
Итого:
На хинты "наежать" не стоит :). Проверено сто раз сами(Даже с AJAX, но без SOAP) хинты работают отчлино.
SOAP отдельно отрабатывает без проблем.

Сформулирую проблему так:
Все отлично работает пока не поставить всё это творение в одну нехитрую ситуаци, а именно:
если побегать по Titl'am (см выше) и резка кликнут на любую ссылку, то
вылетает по таймауту
[pre]
Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\znsbook.ru\www\library.php on line 10
[/pre]
Как раз в этой строке написано нечто иное как $soapclient = new SoapClient(...);

Вот такая вот истроия :)

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

Мои мысли по поводу того как это вылечить кончились... :(
Прошу вас выссказать свое мнене.
Я же начал сомниваться в их(хинтах) надобности.
 

alexs

Новичок
Вопрос наверняка в клиентском коде (т.е. с js), который отправляет кучу запросов на соединение с сервисом

чтобы убедиться попробуй поставить:
set_time_limit(0) //php

А вообще для чего ты юзаешь соап для этого? это какой-то общедоступный сервис или ради интереса ?

-~{}~ 05.04.07 03:30:

Почитай это ещё:
an undocumented feature -> setting a connection timeout
$client = new SoapClient($wsdl, array("connection_timeout"=>5));
ideally you'd have two timeouts set in your application one for how long it should take to actually connect to your remote host and a timeout for how long the socket connection should wait for a response from the server
the above addresses the time it takes to wait to connect to your host and this addresses the time to wait for a response
ini_set('default_socket_timeout', 180);
I would wrap this in a configuration option in case you distribute your package and different clients might need different timeouts when dealing with slow soap server responses.
PHP:
// SET SOCKET TIMEOUT
if(defined('RESPONSE_TIMEOUT') &&  RESPONSE_TIMEOUT != '') {
ini_set('default_socket_timeout', RESPONSE_TIMEOUT);
}
>>Я же начал сомниваться в их(хинтах) надобности.
Лучше в использовании СОАП посомневайся :)
 

Alexandre

PHPПенсионер
я очевидно перекурнул... прочитав пост, но AJAX - предполагает выполнение скриптов на клиенте, на код
PHP:
function get_book_contents_ajax($idbook) 
{ 
    global $user,$soapclient; 
    $html = ""; 
    $contents = $soapclient->book_contents("!!! DEBUG !!!",$idbook); 
    $contents = parse_data($contents);      
         
    foreach($contents["name"] as $val) 
        $html .= $val."<br>"; 
     
    return $html; 
}
что-то делают на сервере...
получается Запрос с клиента на сервер, далее СОАП запрос, прием, и передача обратно на клиент... Правой ногой чешем заднее ухо. А не проще ли сделать запрос непосредственно с клиента на подгрузку хинтов, сэмулировав СОАП сообщение?

Конечно этот путь труднее...

Тут немного подумав, хочу добавить, возможно я не прав - будут два разных хоста, откуда пришел запрос запрашиваемый для СОАП, возможно браузер выдаст предупреждение.

Я бы поступил так
- проверить отдельно СОАП
- проверить отдельно АДЖАКС
- проверить АДЖАКС + съэмулировать СОАП
- вроверить все в комплексе.
 

Gerr_ZINger

Новичок
Автор оригинала: alexs
похоже автору уже не интересно
Мне очень интересно, просто невероятно некогда.
Спасибо всем за помошь.

По поводу "зачем SOAP?" - ЦУ такое дали :).

-~{}~ 07.04.07 00:05:

Следующий код
PHP:
function get_book_contents_ajax($idbook) 
{ 
    global $user,$soapclient; 
    $html = ""; 
    $contents = $soapclient->book_contents("!!! DEBUG !!!",$idbook); 
    $contents = parse_data($contents);      
         
    foreach($contents["name"] as $val) 
        $html .= $val."<br>"; 
     
    return $html; 
}
заменял на
PHP:
function get_book_contents_ajax($idbook) 
{
   set_time_limit(5);
  $i=1000000;
   while($i){$i--}
   set_time_limit(30);
}
всёравно тот же эффект зависания
 
Сверху