我正在尝试在客户端和服务器之间实现Server-sent-events通信。
我已经实现了它,除非服务器返回异常,否则它可以正常工作。
我不确定为什么在异常之后没有将异常消息返回给客户端。
以下是我的听众的写作方式
var evtSource = new EventSource('poll.php');
evtSource.addEventListener("getMessagingQueue", function(e) {
console.log(e);
var data = JSON.parse(e.data);
console.log(data);
processServerData(data);
}, false);
以下是我的PHP代码。 (即poll.php
)文件
ini_set('display_errors', 0);
set_time_limit(0);
header("Content-Type: text/event-stream" . PHP_EOL);
header("Cache-Control: no-cache" . PHP_EOL);
try {
$sleepTime = 1;
$url = '';
$loggedIn = false;
if( !isDefinedConstents('ICWS_USERNAME', 'ICWS_PASSWORD', 'ICWS_STATION_NAME', 'ICWS_SERVER', 'ICWS_PORT') ){
throw new exception('Missing Credentials');
} else {
$scheme = 'http';
if(ICWS_SECURED){
$scheme = 'https';
}
$url = sprintf('%s://%s:%s@%s:%s', $scheme, ICWS_USERNAME, ICWS_PASSWORD, ICWS_SERVER, ICWS_PORT);
//configure the connection
$conf = new ICWS\Config\Config($url, ICWS_STATION_NAME);
//create a new instance of icws
$icws = new ICWS\Connection($conf);
$messaging = new ICWS\Messaging($icws);
$loggedIn = $icws->isLogged();
}
if(!$loggedIn){
throw new exception('Something Went Wrong when trying to login');
}
while($loggedIn){
$messaging->processMessages();
$result = array_merge( (array) $messaging->getCallsQueue(), (array) $messaging->getCurrentUserStatusQueue()) ;
displayResults($result);
sleep(1);
}
} catch(Exception $e){
$result = array('userStatus' => array('statusId' => 'You are not logged in!',
'isLoggedIn' => false,
'icwsDescription' => $e
)
);
displayResults($result);
}
function displayResults($result){
echo 'event: getMessagingQueue' . PHP_EOL;
echo 'data: ' . json_encode( $result ) . PHP_EOL . PHP_EOL;
ob_end_flush();
flush();
}
function isDefinedConstents(){
$args = func_get_args();
foreach($args as $v){
$value = constant($v);
if( !defined($v) || empty($value) ){
return false;
}
}
return true;
}
即使存在异常,如何让侦听器获取消息?
EDITED 当我在addEventListner行
之后执行此代码时evtSource.onerror = function(e) {
console.log(e);
};
这就是我得到的
error { target: EventSource, isTrusted: true, currentTarget: EventSource, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, timeStamp: 1435614201283000, originalTarget: EventSource, explicitOriginalTarget: EventSource, NONE: 0 }
似乎PHP服务器抛出的异常导致整个调用失败。
答案 0 :(得分:0)
最有可能的是,您的Javascript代码在返回PHP异常时遇到问题{1}因为它不是有效的JSON。这将导致您的Javascript代码中出现未捕获的异常,从而结束执行。
解决这个问题的方法是以Javascript可以处理的方式抛出异常。尝试使用JSON.parse
此外,尝试使用try catch块围绕die("data: ". json_encode(array("exception" => "Missing Credentials.")))
,并将异常打印到控制台。
您的JSON.parse()
函数中可能还会有未捕获的异常,但我们无法在不看代码的情况下知道。
答案 1 :(得分:0)
我在两条ob_end_clean();
行
header(....
解决了这个问题