我正在开发一个Yii2 REST API,使用AngularJS供前端使用。
我需要一种实现实时方法的方法,例如用于聊天,或制作一些实时通知。
这是可能的,如何实现?我读了棘轮,插座的故事。. io和其他一些东西,但我不知道如何使它们适合REST,或者这是否是前进的道路。
这里有几个选项。
短/长轮询(使用setTimeout)
app.controller("MyController", function($scope, $timeout, $http) {
$scope.messages = [];
$timeout(callAtTimeout, 3000);
function callAtTimeout() {
console.log("Timeout occurred");
$http.get('PATH TO RESOURCE TO GET NEW MESSAGES').then(
function(res) { // update $scope.messages etc... },
function(err) { // handle error }
);
}
});
对于客户端的短轮询和长轮询,您发送请求,等待获得响应,然后等待3秒并再次触发。
短轮询/长轮询在服务器端的工作方式不同。短轮询会立即返回一个响应——不管是否发生了变化。长轮询,保持连接打开,当有变化时,返回数据。注意不要打开太多的连接。
插座。io(尚)
我建议你在自己的web服务器上使用node.js之类的东西来实现websockets,或者使用像Firebase这样的托管解决方案。
Firebase的事情是,从PHP,你可以发送一个post请求到Firebase服务器上的REST端点。您的javascript可以连接到该端点并侦听更改并相应地更新dom。它可能是所有实现中最简单的。
我个人不会使用PHP的套接字编程,但它可以做到。
要在您的网站上进行实时更新,您可以根据您的需求和您需要更新前端组件的速度实现以下方法之一。
websocket
您可以使用像https://github.com/consik/yii2-websocket这样的库来使用Yii2实现它。但是这将作为一个独立于REST API的服务。因此,您必须确保应用了适当的安全实践。
使用超时运行Angular函数
您可以在几毫秒的超时时间内连续轮询REST API的端点以接收更新的值。
第二种方法将创建许多对API的请求,这将增加服务器负载。因此,我首选的方法是使用websocket