Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Redis和Nodejs与laravel一起广播消息_Php_Node.js_Redis_Laravel 5.1_Node Redis - Fatal编程技术网

Php 如何使用Redis和Nodejs与laravel一起广播消息

Php 如何使用Redis和Nodejs与laravel一起广播消息,php,node.js,redis,laravel-5.1,node-redis,Php,Node.js,Redis,Laravel 5.1,Node Redis,我正在使用Redis+laravel+nodejs来广播消息。我的代码如下 内部控制器 function postReassignlead(Request $request){ $data = Input::get(); $leadId = $data['leadid']; $assignedtoid = $data['assignedtoid']; $assignedbyid = $data['assignedbyid']; $message = "A

我正在使用Redis+laravel+nodejs来广播消息。我的代码如下

内部控制器

function postReassignlead(Request $request){
    $data = Input::get();
    $leadId = $data['leadid'];
    $assignedtoid = $data['assignedtoid'];
    $assignedbyid = $data['assignedbyid'];

    $message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid."";

    $redis = LRedis::connection();
    $redis->publish('message', $message);

}
在我的server.js中

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(8890);

io.on('connection', function (socket) {

  console.log("new client connected");
  var redisClient = redis.createClient();
  redisClient.subscribe('message');

  redisClient.on("message", function(channel, message) {
    console.log("mew message in queue "+ message + "channel");
    socket.emit(channel, message);
    //res.flush();
  });

  socket.on('disconnect', function() {
    redisClient.quit();
  });

});
然后在home.php页面上

    <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
    <script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>

    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2">
              <div id="messages"></div>
            </div>
        </div>
    </div>
    <script>
        var socket = io.connect('http://localhost:8890');
        socket.on('message', function (data) {
            $( "#messages" ).append( "<p>"+data+"</p>" );
        });
    </script>
所以在我的home.php

我可以用类似这样的代码

 <script>
        var socket = io.connect('http://localhost:8890');
        socket.on('message_1990', function (data) {
            $( "#message_1990" ).append( "<p>"+data+"</p>" );
        });
 </script>

var socket=io.connect('http://localhost:8890');
socket.on('message_1990',函数(数据){
$(“#message_1990”)。追加(“”+data+”

”); });
在我自己的项目中对Redis进行了一些研究,发现了你的问题

据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,只需在发送端和接收端将“message”更新为“message_1990”

这意味着您的Laravel应用程序将知道将消息发布到哪个频道,这可能并不总是容易确定,或者消息可能是团队广播消息

为了灵活性,您可以在客户端上简单地解包以确定交付/显示。通过这种方式,消息将传递给每个人,客户机可以决定如何处理它

因此,在Laravel控制器内:

$message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid."";

$redis = LRedis::connection();

// PHP array to convert to JSON, add other fields as necessary
$msgPacket = ["rx"=>"bsmith","msgtype"=>"leadGen","message"=>$message];

// send as a JSON data packet
$redis->publish('message', json_encode($msgPacket) );
在客户端,确定如何使用它:

<script>
    socket.on('message', function (data) {
        obj = JSON.parse(data);

        // receive team and personal messages
        if( (obj.msgtype == "leadGen") || (obj.rx == "bsmith") ) {
            $( "#message" ).append( "<p>"+data+"</p>" );
        }
        // else ignore the message

    });
</script>

socket.on('message',函数(数据){
obj=JSON.parse(数据);
//接收团队和个人信息
如果((obj.msgtype==“leadGen”)| |(obj.rx==“bsmith”)){
$(“#消息”)。追加(“”+数据+“

”); } //否则,请忽略此消息 });

在这里,我使用了
JSON.parse()
,但实际上是这样的,而且数据也可以通过数据变量访问,如
data.msgtype

为我自己的项目对Redis进行了一些研究,并遇到了您的问题

据我所知,发布和订阅方法的第一个参数是用于通信的“通道”。因此,在您的情况下,只需在发送端和接收端将“message”更新为“message_1990”

这意味着您的Laravel应用程序将知道将消息发布到哪个频道,这可能并不总是容易确定,或者消息可能是团队广播消息

为了灵活性,您可以在客户端上简单地解包以确定交付/显示。通过这种方式,消息将传递给每个人,客户机可以决定如何处理它

因此,在Laravel控制器内:

$message = "A lead :".$leadId," has been assigned to YOU by ".$assignedbyid."";

$redis = LRedis::connection();

// PHP array to convert to JSON, add other fields as necessary
$msgPacket = ["rx"=>"bsmith","msgtype"=>"leadGen","message"=>$message];

// send as a JSON data packet
$redis->publish('message', json_encode($msgPacket) );
在客户端,确定如何使用它:

<script>
    socket.on('message', function (data) {
        obj = JSON.parse(data);

        // receive team and personal messages
        if( (obj.msgtype == "leadGen") || (obj.rx == "bsmith") ) {
            $( "#message" ).append( "<p>"+data+"</p>" );
        }
        // else ignore the message

    });
</script>

socket.on('message',函数(数据){
obj=JSON.parse(数据);
//接收团队和个人信息
如果((obj.msgtype==“leadGen”)| |(obj.rx==“bsmith”)){
$(“#消息”)。追加(“”+数据+“

”); } //否则,请忽略此消息 });

在这里我使用了
JSON.parse()
,但实际上是这样的,而且数据也可以通过数据变量访问,正如在
data.msgtype

中一样,谢谢你的回复,我应用了类似的方法,而不是Json数据,我发送了一个字符串,用
分隔,在前端,我只是将它分割成JS数组并检查它。消息的
ID
Auth::user->ID
相同,然后将消息附加到它的弹出窗口:)。但这里每个用户都在听消息套接字,有没有一种方法可以让每个用户都听自己的socket,这样当我们发布它时,它只会发送给那个特定的用户??hehe感谢您的回复,我采用了类似的方法,而不是Json数据,我发送了一个字符串,用
\uuuuu
分隔,在前端,我只是将它切成JS数组,并检查了它的
ID
消息与
Auth::user->ID
相同,然后将消息附加到其弹出窗口:)。但是在这里,每个用户都在听消息套接字,有没有一种方法每个用户都在听自己的套接字,这样当我们发布消息时,它只会发送给那个特定的用户??