Heren en damesch,
Voor een gegevensuitwisseling met een HL7 berichtenserver heb ik in PHP een (op een PEAR package gebaseerde) set classes geschreven voor het opstellen van de HL7 berichten en het verwerken van de response.
Samenstellen van berichten gaat allemaal fantastisch en mooi, enige probleem waarmee ik zit, is de communicatie met de server over een socket. Het opzetten van de socket gaat goed, en versturen van de data gaat goed en het ontvangen van de gegevens gaat goed. Maarrrr ... het inlezen van de data uit de socket-connectie gaat mis. Er wordt wel data ontvangen (volgens mij zelfs het volledige bericht), maar toch blijft de loop waarin de data wordt ingelezen hangen. Vreemde is dat geen enkele timeout ervoor zorgt dat het script ermee ophoudt (na bijvoorbeeld 30 seconde). Vervelend is vervolgens, dat de socket-verbinding open blijft staan, waardoor ik geen nieuwe verbinding kan maken. Immers ... de berichtenserver vindt dat er nog een verbinding openstaat en "Actively refuses" een nieuwe verbinding. De reeds bestaande verbinding kan ik echter in PHP niet opnieuw gebruiken, maar ook niet afsluiten. Dat maakt debuggen er ook niet eenvoudiger op.
Een stukje code:
De logger logt berichten naar een bestand, zodat ik kan zien waar de uitvoering wel/niet komt.
- Regel 28 wordt nooit bereikt.
- Regel 23 wordt 1 keer aangeroepen en bevat dan ook keurig het responsbericht dat ik nodig heb.
Ik heb dus het vermoeden dat bij de tweede keer socket_read ergens iets misgaat, waardoor het script eindeloos ergens op blijft wachten.
Het script wordt uitgevoerd op een Windows Server 2003. Ergens in de handleiding van PHP heb ik gevonden dat op windows server de socket_read geen (bool)false teruggeeft wanneer hij klaar is met lezen, maar dat hij dan een lege string ("") teruggeeft.
Iemand een idee of mijn aanpak verkeerd is, danwel andere suggesties?
Voor een gegevensuitwisseling met een HL7 berichtenserver heb ik in PHP een (op een PEAR package gebaseerde) set classes geschreven voor het opstellen van de HL7 berichten en het verwerken van de response.
Samenstellen van berichten gaat allemaal fantastisch en mooi, enige probleem waarmee ik zit, is de communicatie met de server over een socket. Het opzetten van de socket gaat goed, en versturen van de data gaat goed en het ontvangen van de gegevens gaat goed. Maarrrr ... het inlezen van de data uit de socket-connectie gaat mis. Er wordt wel data ontvangen (volgens mij zelfs het volledige bericht), maar toch blijft de loop waarin de data wordt ingelezen hangen. Vreemde is dat geen enkele timeout ervoor zorgt dat het script ermee ophoudt (na bijvoorbeeld 30 seconde). Vervelend is vervolgens, dat de socket-verbinding open blijft staan, waardoor ik geen nieuwe verbinding kan maken. Immers ... de berichtenserver vindt dat er nog een verbinding openstaat en "Actively refuses" een nieuwe verbinding. De reeds bestaande verbinding kan ik echter in PHP niet opnieuw gebruiken, maar ook niet afsluiten. Dat maakt debuggen er ook niet eenvoudiger op.
Een stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| private function _connect($host, $port) { $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ( $socket < 0 ) return false; socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 2, "usec" => 0)); $result = socket_connect($socket, $host, $port); if ( $result === false ) return false; return $socket; } // _connect() public function send($req) { global $logger; $hl7Msg = $req->toString(); $rs = socket_write($this->_handle, $this->_message_prefix.$hl7Msg.$this->_message_suffix); if ( $rs === false ) return false; $logger->logmsg("HL7 Message has been sent."); $data = ''; $timeout = time() + 5; while( $buf = socket_read($this->_handle, $this->_max_read, PHP_BINARY_READ) ) { $data .= $buf; $logger->logmsg("Read from buffer: {$buf}."); if ( preg_match('/' . $this->_message_prefix. "$/", $buf) ) break; if ( (time()) > $timeout ) break; } $logger->logmsg("Finished while() loop with socket_read()."); // Remove message prefix and suffix $data = preg_replace("/^" . $this->_message_prefix . "/", "", $data); $data = preg_replace("/" . $this->_message_suffix . "$/", "", $data); $resp = new HL7_Message($data); return $resp; } // send() |
De logger logt berichten naar een bestand, zodat ik kan zien waar de uitvoering wel/niet komt.
- Regel 28 wordt nooit bereikt.
- Regel 23 wordt 1 keer aangeroepen en bevat dan ook keurig het responsbericht dat ik nodig heb.
Ik heb dus het vermoeden dat bij de tweede keer socket_read ergens iets misgaat, waardoor het script eindeloos ergens op blijft wachten.
Het script wordt uitgevoerd op een Windows Server 2003. Ergens in de handleiding van PHP heb ik gevonden dat op windows server de socket_read geen (bool)false teruggeeft wanneer hij klaar is met lezen, maar dat hij dan een lege string ("") teruggeeft.
Iemand een idee of mijn aanpak verkeerd is, danwel andere suggesties?