Category Archives: код

Еще об особенностях работы SOAP

Нынче закончил работу над API сервером на SOAP и опишу еще один момент, с которым возможно столкнется еще кто-то.

Итак, в Zf работа Soap сервера основана на двух элементах — autoDiscover и собственно soap_server. Оба этих элемента расположены на сервере и ссылаются друг на друга. И вот особенность в том, что при получении запроса на выполнение функции от соап клиента просходит запрос с soap_server на autoDiscover (адреса одного и другого указываются в самом сервере). Проблема, из-за которой пришлось потратить около часа на поиск решения проблемы была в том, что соап клиент возвращал:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘https://[censored]’ : failed to load external entity [url]

Сразу просто не догадался искать проблему на сервере, т.к. ошибку то возвращает клиент. Но как оказалось, он просто перетранслирует ошибку, которую возвращает сервер. А сервер ругался из-за того, что php был без модуля openssl. В общем в итоге доставление php5-openssl решило проблему.

Zend_Soap_Server & Client и его особенности

По долгу службу начал сегодня писать API к серверу на SOAP, используя для этого ZF.

В целом никаких вопросов не возникало, простенький сервер для проверки набросал минут за 5, еще столько же тестовый скрипт что бы проверить Soap_Client.

Но тут то начались проблемы: делаю вызовы функций с сервера, а соап клиенту возвращается всегда NULL.

Пробовал создавать другие функции, как с параметрами так и без, ничего не давало другого результата. При этом даже getLastResponse() возвращала null. Следует так же заметить, что все запросы делаются через httpS, из-за чего я было еще подумал что грешит обработка сертификата SSL, но не мог получить никакой ошибки которая бы хоть намекала на то, что проблема связана с этим.

Гугление давало слабые результаты. У некоторых была проблема, связанная с тем, что soap.wsdl_cache_enabled была установлена в 1, а когда изменили на 0 то все заработало. Мне же это не помогло, ровно так же как и установка soap.wsdl_cache тоже в ноль. Не помогло так же и $soapServer->setWsdlCache(0);

На этом идеи найденные через великий гугл закончились. Пробовал я так же делать $client->getFunctions() — список существующих функций он выводил правильно. Сразу же меня смутило немного  слово void перед названием функции, то есть судя по ответу getFunctions() эти функции ничего не возвращают.

Но тогда я не придумал как можно было бы ему указать что ответ все таки есть. Return то в функции прописан, почему же  соап сервер не видит его?

И в итоге, перепробывав все варианты решение проблемы было в том, что нужно функциям которые будут достыпны через SOAP комментарии-документацию в стиле

/**
* @param int $i1
* @return string
*/
public function test($i1)

После этого все заработало. Никогда бы сразу не подумал, что информация о параметрах функции будет браться именно оттуда.

Такой день.

Разбор криворукостей: куки и глобалсы.

Так уж сложилось, что я связан с хостингом уже не первый год. Кто не знает, хостинг этот для вап сайтов ориентирован.

Так вот, приходится соответственно и отвечать на вопросы клиентов по технической части, само собой частенько бывают претензии что «вот этот скрипт у пупкина работал, а у вас нет».

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

1. таю надежду, что кто то прочитает и ему окажется информация полезной, что в дальнейшем потенциально освободит меня от очередного вопроса.

2. новичкам информация будет для того, что бы не совершать глупостей в дальнейшем.

И так, сегодня первый случай.

Жалоба: код капчи должен быть одним и тем же в течении 300 секунд. Код записывается в куки.

Диагноз: как я и предположил изначально, дело было в глобалсах ( кто не знает — гуглите register_globals ).

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

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

Код капчи, который в итоге генерирует другой скрипт, передается в параметре картинки :-)

Ну что тут сказать то. На лицо элементарное непонимание сути капчи. Я пока узнаю самописный это скрипт или нет. Если окажется что это какой то движок  то автору всеобщий позор и на кол.

Я намерено не указывал ни адреса сайта, ни какой либо информации о клиенте, этика, как никак :-)

Чтобы уж точно…

Нужно было один момент в скрипте, вот что нашел:

if(isset($_GET[‘dir’])){
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
$_GET[‘dir’]=str_replace(‘..’, », $_GET[‘dir’]);
}

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