STOMP收到Unexpected EOF while reading from socket錯誤

最近在協助處理一個PHP搭配ActiveMQ的系統問題,處理過程中習慣性的把所有可能的潛在原因都看一遍。又看到一些以前沒注意過的事情。就稍微記錄一下~

找問題,自然是先打開log、觀察log中是否有任何的異常。觀察下來,發現偶爾會出現"Unexpected EOF while reading from socket"的錯誤。原以為這樣的錯誤訊息,是出現在Stomp::readFrame。沒想到,最後確認是發生於Stomp::__construct,程式開啟ActiveMQ連線時…

這樣的錯誤、與發生位置,相關性真令人百思不得其解。但無意間,在另一台主機測試時找到了答案~

在測試連線時,將一樣的程式放到另一台主機上執行、測試時,故意給予錯誤的連線設定。測試結果卻是收到"Unable to connect to 127.0.0.1:61613"的錯誤訊息,和剛剛的不同。

最後找到原因,是因為兩台主機的PECL :: Package :: stomp版本不同,整理如下…
  • 錯誤訊息為"Unexpected EOF while reading from socket"的主機,版本為1.0.3
  • 錯誤訊息為"Unable to connect to 127.0.0.1:61613"的主機,版本為1.0.9

另外,還有一個原因造成這樣的差異,就是PECL :: Package :: stomp1.0.3版本有問題。當我們使用1.0.3版本,搭配PHP不同撰寫風格,也會有不同結果…
  • 使用Object oriented style開發
    Stomp::__construct開連線,使用try catch就會得到"Unexpected EOF while reading from socket"。
  • 使用Procedural style開發
    stomp_connect開連線,再搭配stomp_connect_error,就可以取得"Server is not responding"的錯誤。(這樣的訊息,才是正確的)

兩種PHP style的範例如下…
<?php
 //Procedural style
 $conn = stomp_connect('tcp://127.0.0.1:61613', 'user', 'password');
 //show "Server is not responding"
 var_dump(stomp_connect_error());

 //Object oriented style
 try {
  $conn1 = new Stomp('tcp://127.0.0.1:61613', 'user', 'password');
 } catch (StompException $e) {
  //show "Unexpected EOF while reading from socket"
  var_dump($e->getMessage());
 }

瞭解這狀況後,多做了些測試,以帳號、密碼錯誤為例,舊版的訊息真令人難理解…如下…
  • 1.0.3,顯示"Stomp unknown error"
  • 1.0.9,顯示"User name [username] or password is invalid."

看來PECL :: Package :: stomp應該要升級了。新版除了可以得到比較正確的錯誤訊息之外,也修正不少的bug…



相關文章



留言