вопрос по ошибкам сервера

musicant

Новичок
вопрос по ошибкам сервера

добрый день!
помогите решить задачу.

Есть WebService крупной турфирмы с которого нужно получать информацию о новых турах. Я написал PHP код, который запускается по крону, коннектится к этому сервису по SOAP и забирает новые данные для записи в свою базу.
Когда я начал эту работу вебсервис в случае ошибки возвращал только такую:
System.Exception: Error loading SPO info
at RIVIERA.TourML_Creator.TP_DataSet.FillForSpoKey(Int32 p_nTOKEY, String p_sConnect, Boolean p_bWithTP, Int32 p_nStartPriceKey, Nullable`1 p_RowsToLoad) in D:\work\...:line ...
at RIVIERA.TourML_Creator.CreatorPrices.FillPriceListBySPO(Int32 p_nSPO, Int32 p_nStartKey, Nullable`1 p_nRowsToLoad) in D:\work\...:line ...
at RIVIERA.TourML_Creator.CreatorPrices.FillPriceListBySPO(Int32 p_nSPO) in D:\work\...:line ...
at WebHoster.Service.GetSPO(Int32 SPOKey) in D:\work\...:line ...

Т.е. это ошибка в скрипте сервиса.
Исходя из этого алгоритм моих действий был такой(в кратце):

Получаю список новых(обновленных) туров
$client = new SoapClient("http://www.....asmx?WSDL", array('trace' => 1));
$xml = $client->ActiveSPO( array("CityFrom"=>'222', "DateFrom"=>$yesterday, "DateTill"=>$today) );

перебираю в цикле, проверяю,получаю данные по каждому туру и записываю в базу.

Записываю так:
REPLACE INTO `рабочая_таблица` VALUES ('-3', 'дата', 'ключ тура')
$data=$client->GetSPO(array("SPOKey"=>$num));
REPLACE INTO `рабочая_таблица` VALUES ('-2', 'дата', 'ключ тура')
записываю в базу данные
REPLACE INTO `рабочая_таблица` VALUES ('-1', 'дата', 'ключ тура')
При повторном запуске по крону скрипт проверяет первое поле служебной таблицы:
Если -1, то тур записан, если -2, значит информация от сервиса получена, но по какой-то причине записана не полностью -> обращаемся повторно
Если -3, то сервер вернул ошибку и обращатся по этому ключу бессмысленно.

Все работало, но сейчас видимо выросла нагрузка на ВебСервис и стали появляться новые ошибки:
Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.OutOfMemoryException: ...
либо
Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in ...:3 Stack trace: #0 [internal function]: SoapClient->__doRequest('
либо
Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Timeout expired.

Тоесть теперь надо как-то объяснить скрипту после каких ошибок нужно повторно запрашивать тур при следующем запуске по крону(например после этих трех ошибок) а после каких ставить "черную метку" и пропускать в дальнейшем.

Возможно ли различать ошибки сервера? Если да, то как?
Если мой алгоритм действий совсем примитивный, то как сделать грамотней?
 

Fortop

Новичок
PHP:
try {
// тут SOAP request
} catch (SoapFault $e) {
    var_dump($e);
}
Как дальше различить ошибки разберетесь сами
 

musicant

Новичок
Fortop
Спасибо! Попробую, как только у них сервер заработает (сейчас Service Unavailable)
 
Сверху