Лучший метод для отладки вызываемого веб-сервиса в php? - PullRequest
5 голосов
/ 14 апреля 2009

У меня есть n-уровневая система, в которой интерфейсный слой шаблонов обращается к бэкэнд-серверу приложений. Например, мне нужно получить некоторые результаты поиска, и внешний интерфейс вызывает их, чтобы получить результаты.

И движок шаблонов, и сервер приложений написаны на PHP. В настоящее время я использую PHPed для инициирования сеансов отладки на шаблонизаторе, однако, когда http-запрос отправляется на удаленный сервис, мой отладчик просто сидит и ждет завершения ввода-вывода.

То, что я хотел бы сделать, это эмулировать HTTP-вызов, но на самом деле просто оставаться внутри моего процесса PHP, сделать гигантский толчок среды в какой-то стек, затем загрузить среду моего сервера приложений и обработать вызов. После завершения вызова я выполняю команду env pop и получаю результаты http-вызова в var (например, через выходной буфер). Я могу запустить обе службы на одном сервере. У кого-нибудь есть идеи или библиотеки, которые уже делают это?

Ответы [ 7 ]

2 голосов
/ 21 апреля 2009

Это неловко грубо и совершенно без всякого изучения того, как работает отладчик, но вы пробовали добавить

    debugBreak(); 

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

Я использовал эту технику, чтобы вернуться к процессу, называемому через AMFPHP. У меня был PHP-файл, загружающий Flash-файл в браузер, который затем перезванивал в PHP с помощью AMFPHP, все на одном сервере. Когда я нажимаю на строку debugBreak (), PhpED восстанавливает контроль.

2 голосов
/ 15 апреля 2009

Не можете ли вы запустить отладчик и установить точку останова на сервере приложений? Два разных сеанса отладки - один для перехвата вызова механизма шаблонов и один для перехвата вызова в сервере приложений.

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

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

1 голос
/ 25 апреля 2009

Это не открытый код, но посмотрите Чарльз . Он работает как прокси-сервер и является лучшим отладочным прокси-сервером, который я когда-либо видел. Работает на Linux, OS / X и Windows.

Практически любая HTTP-библиотека позволит вам указать прокси.

1 голос
/ 24 апреля 2009

Я не очень разбираюсь в PHP отладка , и я не уверен, что следую «проталкиванию среды в какой-то стек», но мне интересно, можно ли использовать netcat + некоторые сценарии оболочки полезно здесь для устранения неполадок ?

Вы можете использовать netcat для:

  • Подделка HTTP-запроса
  • Действуйте как веб-сервер (слушайте порт - выберите порт, любой порт!)

http://www.plenz.com/netcat-tips

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

echo "<xml .. <node>hello php!</node>" | netcat -lp 80 ... etc

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

Не могли бы вы использовать сценарий оболочки с netcat в качестве посредника, который действует как ваш веб-сервис, немедленно возвращает что-то общее, чтобы сделать ваш PHP счастливым, а затем передает запрос вашему фактическому серверу приложений и регистрирует результаты?

Супер просто.

netcat webserver http://img240.imageshack.us/img240/791/netcat.jpg

1 голос
/ 23 апреля 2009

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

Например, если вы используете инфраструктуру, такую ​​как Zend, для трафика HTTP, вы можете взломать класс HTTP, чтобы использовать примитивные сокеты для чтения / записи службы вместо встроенного, и создать небольшой переключатель задач (цикл :) чтобы отслеживать, что происходит.

Конечно, вы могли бы также использовать fopen ('http: // ...') и fread в чанках в цикле, что может помочь, но вам нужна поддержка http: в потоках.

1 голос
/ 22 апреля 2009

Почему вы не используете сниффер HTTP? Что-то вроде tcpflow.

Кроме того, вы можете просто записать полный XML-файл в файл для каждого запроса и ответа.

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

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

Надеюсь, это поможет.

0 голосов
/ 04 апреля 2013

PhpED поддерживает параллельные сеансы отладки - это означает, что вы можете начать отладку кода, который выдает запрос на исходный сервер, а затем межсерверные запросы. Все, что вам нужно, это установить точки останова в соответствующих проектах и ​​передать запрос отладчика между серверами. Обычно это можно сделать, повторно передав значение переменной DBGSESSID (запрос отладчика) со значением на второй сервер. Переменная может быть найдена среди $ _COOKIES и / или $ _GET (в зависимости от того, как вы начинаете отладку - из IDE или использования панели инструментов отладчика). Чтобы повторно передать переменную на вторичный сервер (ы), вы можете добавить ее к переменным POST или в качестве параметра URL или файла cookie. Если вы не можете сделать это, например если ваш сервер отфильтровывает все из get / post / cookies, попробуйте встроить вызов DebugBreak (). Убедитесь, что все ваши серверы могут найти среду IDE по ее IP-адресу в запросе и имеют возможность подключиться обратно к среде IDE - например, у вас есть необходимые правила в брандмауэре и LinuxSE (по умолчанию этот уровень SE включен во всех современных Linux). Мне понадобился день, чтобы понять, почему мой сервер не может подключиться.

В случае, если подключение с сервера к IDE невозможно (если рабочая станция с IDE находится в другой сети, например, у вас дома), вы можете использовать ssh tunnels . В этом случае, конечно, IDE-адресом является localhost.

...