我正在尝试使用php实现websocket并作为yii的扩展,以便我可以为我的Web应用程序创建一个类似通知的通知
以下链接的代码是我的出发点:
http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/
它在我当地的xampp中完美运作..
我尝试将其转换为Yii扩展我遵循的步骤..
这是代码段
<?php
Yii::import("ext.websocket.PHPWebSocket");
class WebSocketController extends Controller {
public $layout = '//layouts/empty';
public function actionStartServer() {
set_time_limit(0);
function wsOnMessage($clientID, $message, $messageLength, $binary) {
global $Server;
$ip = long2ip($Server->wsClients[$clientID][6]);
// check if message length is 0
if ($messageLength == 0) {
$Server->wsClose($clientID);
return;
}
//The speaker is the only person in the room. Don't let them feel lonely.
if (sizeof($Server->wsClients) == 1)
$Server->wsSend($clientID, "There isn't anyone else in the room, but I'll still listen to you. --Your Trusty Server");
else
//Send the message to everyone but the person who said it
foreach ($Server->wsClients as $id => $client)
if ($id != $clientID)
$Server->wsSend($id, "Visitor $clientID ($ip) said \"$message\"");
}
// when a client connects
function wsOnOpen($clientID) {
global $Server;
$ip = long2ip($Server->wsClients[$clientID][6]);
$Server->log("$ip ($clientID) has connected.");
//Send a join notice to everyone but the person who joined
foreach ($Server->wsClients as $id => $client)
if ($id != $clientID)
$Server->wsSend($id, "Visitor $clientID ($ip) has joined the room.");
}
// when a client closes or lost connection
function wsOnClose($clientID, $status) {
global $Server;
$ip = long2ip($Server->wsClients[$clientID][6]);
$Server->log("$ip ($clientID) has disconnected.");
//Send a user left notice to everyone in the room
foreach ($Server->wsClients as $id => $client)
$Server->wsSend($id, "Visitor $clientID ($ip) has left the room.");
}
$Server = new PHPWebSocket();
$Server->bind('message', 'wsOnMessage');
$Server->bind('open', 'wsOnOpen');
$Server->bind('close', 'wsOnClose');
$Server->wsStartServer('127.0.0.1', 9300);
}
public function actionIndex() {
$this->render('index');
}
}
我使用php创建websocket的方法是正确的还是不可能这样做..
我想使用php实现相同,因为我更喜欢使用node.js或任何其他脚本
答案 0 :(得分:1)
将PHP与Apache一起使用时,对PHP的每个请求(通常)都会创建新的进程/线程。由于Web套接字是(某种程度上)永久连接,因此这些PHP请求会持续很长时间。每个进程都占用服务器上的内存。因此,我认为这是可能的,如果您一次有多个(甚至不是很多)用户在线,您的服务器可能只会崩溃或拒绝请求。
Node.js方法不同 - 每个连接不需要单独的进程,因此它可以同时处理许多活动连接。
您可以将Node.js与PHP一起使用,使用队列或其他一些通信机制连接这两者。
答案 1 :(得分:0)
以防其他人偶然发现这件事。
我一直在寻找一种方法来实现Yii应用程序的实时事件。
在上面的评论中提到了this (Yii) tutorial on HTML5 SSE。由于它似乎非常简单,如果您需要支持旧版浏览器和移动设备,这还不够。
浏览器支持还能在IE中运行吗? Internet Explorer和Android浏览器(所有版本)都不支持Server-Sent Events 盒子。旧版本的Firefox(&lt; 6),Chrome(&lt; 6), Safari(&lt; 5),iOS Safari(&lt; 4)或Opera(&lt; 11)。
另一个解决方案是一个相当新的Yii node socket扩展。它基于node.js socket.io库,并使用elephant.io通过php与服务器通信。最重要的是,扩展似乎(我只使用它一个月)写得很好。它具有Linux和Windows支持,使用CLI执行命令,甚至还提供了自己的数据库驱动程序。
其他解决方案仍然受欢迎。