在《使用nginx-push-stream-module构建在线聊天室(一)》这篇文章中已经介绍了nginx-push-stream-module插件的安装,本文中介绍一下如何通过程序来实现聊天功能。

 

在线聊天室PHP代码实现

 

  其实实现聊天功能一个是客户单代码另外是服务器端的代码,关于客户端的程序在安装源文件中也有说明并且支持websocket、长轮循、stream(iframe)、eventsource等多种模式,下面给出最简单的监听代码。


    <div id="messages" style="width:600px;height:300px;overflow:scroll;">这里显示聊天内容</div>

    <script src="js/pushstream.js" ></script>

    <script type="text/javascript" >
    function messageReceived(text, id, channel) {
      document.getElementById('messages').innerHTML +=  text + '<br>';
    };

    var pushstream = new PushStream({
      host: '主机名',
      port: "端口",
      modes: "websocket",
      messagesPublishedAfter: 5,
      messagesControlByArgument: true
    });
    pushstream.onmessage = messageReceived;
    pushstream.addChannel('频道名称');
    pushstream.connect();
    </script>

其中主机名可以填写ip或者域名,端口填写搭建服务时配置的端口,频道名称和发布时一致,这样就可以实现监听了,可以在命令下发送指令测试一下。

  另外说一下发送消息的代码,实现思路有两种。一种就是使用PHP执行linux系统命令,但是这个不推荐,因为允许PHP执行系统命令是比较危险的事情,很多服务器也禁止了这些函数。第二种就是通过PHP的curl扩展进行post数据,这是推荐的一种方式。下面给出服务器端的PHP代码。

//以下代码只是示例没有做安全处理  需要根据实际情况做安全认证
$channel = $_POST['ch']; //频道
$msg = $_POST['msg']; //消息内容

$url = "http://localhost:8080/pub?id=" . $channel; //服务器地址

if ($channel && $msg)
{
	curlRequest($url,$msg);
}
else
{
   exit("缺少参数");
}

/**
  使用curl方式实现get或post请求
  @param $url 请求的url地址
  @param $data 发送的post数据 如果为空则为get方式请求
  return 请求后获取到的数据
*/
function curlRequest($url,$data = ''){
        $ch = curl_init();
        $params[CURLOPT_URL] = $url;    //请求url地址
        $params[CURLOPT_HEADER] = false; //是否返回响应头信息
        $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
        $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
		$params[CURLOPT_TIMEOUT] = 30; //超时时间
		if(!empty($data)){
			$params[CURLOPT_POST] = true;
			$params[CURLOPT_POSTFIELDS] = $data;
        }
		$params[CURLOPT_SSL_VERIFYPEER] = false;//请求https时设置,还有其他解决方案
		$params[CURLOPT_SSL_VERIFYHOST] = false;//请求https时,其他方案查看其他博文
        curl_setopt_array($ch, $params); //传入curl参数
        $content = curl_exec($ch); //执行
        curl_close($ch); //关闭连接
		return $content;
}

客户端可以使用普通表单来实现,这样实现了使用程序发送和监听消息的功能,但是还是不够完善,比如界面和数据的持久化,后续会介绍如何对数据进行持久化的实现思路。