我正在尝试使用php实现websocket,并作为yii的扩展,以便我可以为我的web应用程序创建一个通知式功能
下面的代码链接是我的起点:
http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/它在我的本地示例中工作得很好。
我尝试将其转换为Yii扩展,我遵循的步骤…
- 我已经把类PHPWebSocket.php在yii扩展文件夹。
- 我创建了一个控制器websocket、一个动作启动服务器和一个动作索引(用于聊天界面,以测试上面链接中的示例)
下面是代码片段
<?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或任何其他脚本
在Apache中使用PHP时,每次对PHP的请求(通常)都会创建新的进程/线程。由于web套接字(在某种程度上)是永久连接,这些PHP请求会持续相当长的时间。每个进程占用服务器上的内存。所以,我认为这是可能的,如果你有很多(甚至没有那么多)用户同时在线,你的服务器可能会崩溃或拒绝请求。
Node.js的方法是不同的-每个连接不需要单独的进程,所以它可以一次处理许多活动连接。
你可以使用Node.js和PHP一起使用队列或其他通信机制连接两者
以防别人偶然发现。
我正在寻找一种方法来实现实时事件的Yii应用程序自己。
在上面的评论中提到了HTML5 SSE教程。这看起来很简单,但如果你需要支持旧的浏览器和移动设备,这是不够的。
浏览器支持aka它在IE中工作吗? Internet Explorer和Android浏览器(所有版本)不支持服务器发送事件退出这个盒子。旧版本的Firefox (<6)、Chrome (<6),Safari (& lt;5)、iOS Safari (<4),或Opera (<11) .
另一个解决方案是一个相当新的Yii节点套接字扩展。它基于node.js套接字。IO库和使用大象。IO通过php与服务器通信。最重要的是,扩展似乎(我只使用了一个月)写得很好。它支持Linux和Windows,使用CLI执行命令,甚至还提供了自己的数据库驱动程序。