piątek, 15 sierpnia 2008

Problemy z amfphp i drupalem


Amfphp w połączeniu z drupalem daje całkiem duże możliwości. Niestety moduł amfphp do drupala czasami sprawia spore kłopoty.
Najczęstszym powodem kłopotów z komunikacją flasha z amfphp jest źle ustawiony gateway (dla samego amfphp jest to www.example.com/amfphp/gateway.php , a dla zintegrowanego amfphp z drupalem www.example.com/services/amfphp), lub brak dodania uprawnień do korzystania z services. Niestety w moim przypadku wszystko było skonfigurowane poprawnie a flash nadal nie odbierał danych z serwisu. W analizatorze ruchu sieciowego wireshark pakiety z informacjami dochodziły do systemu a flash ich nie odbierał (lub odbierał a nie potrafił zinterpretować). Aby ułatwić sobie przeglądanie pakietów z wireshark wystarczy wstawić filtr ip.src == ip serwera || ip.dst == ip serwera.

Problemem było to że z jakiegoś powodu drupal do każdej strony dodawał znak nowej lińji, co powodowało że dodawał znak nowej lińji również do xml-a z odpowiedzią wywołania metody amfphp. Można to najlepiej przetestować w pythonie:

#! /usr/bin/env python
import xmlrpclib, math

server = xmlrpclib.Server("http://www.example.pl/xmlrpc.php")
print server.node.load(135730,[])

jeśli ten sktrypt zwróci
xml.parsers.expat.ExpatError: xml declaration not at start of external entity: line 2, column 0
to znaczy że mamy doczynienia z uszkodzoną odpowiedzią z serwera.

Oczywiście skrypt ten komunikuje sie z drupalem za pośrednictwej xmlrpc, co wymaga włączenie serwera xmlrpc, oraz serwisu node_service w modułach.

Rozwiązanie problemu znaku nowej lińji znalazełem na stronach http://drupal.org/node/18265 i http://drupal.org/node/18265.

wystarczy dodać do includes/bootstrap.inc

function drupal_page_header() {
$clean = ob_get_contents();
ob_end_clean();

Wszystko było by fajnie gdybym wiedział dlaczego drupal zachowuje się w ten sposób. Dziwne bo ta sama instalacja drupala w innej lokalizacji (na serwerze testowym) działa w najlepsze, a na serwerze produkcyjnym znalazłem w/w błąd.

Funkcja drupal_page_header() w pliku includes/bootstrap.inc służy do generowania nagłówków.

string ob_get_contents ( void )

Gets the contents of the output buffer without clearing it.

bool ob_end_clean ( void )

This function discards the contents of the topmost output buffer and turns off this output buffering. If you want to further process the buffer's contents you have to call ob_get_contents() before ob_end_clean() as the buffer contents are discarded when ob_end_clean() is called.

Brak komentarzy: