- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 PHP 和 Ratchet 库的非常简单的 websocket。
当用户打开特定页面时,它会将用户 ID 发送到我的套接字,并且它应该更新该用户的状态(目前我只是在控制台中记录它),如下所示:
<input type="hidden" value="'.$account_id.'" id="account_id">
<input type="hidden" value="trial" id="request_type">
<script>
$(document).ready(function(){
var conn = new WebSocket('ws://127.0.0.1:8080');
conn.onopen = function(e){
console.log("Connection Opened!");
var account_id = $("#account_id").val();
var request_type = $("#request_type").val();
var data = {account_id: account_id, request_type: request_type};
conn.send(JSON.stringify(data));
}
conn.onclose = function(e){
console.log("Connection Closed!");
}
conn.onmessage = function(e) {
var data = JSON.parse(e.data);
console.log(data);
};
conn.onerror = function(e){
var data = JSON.parse(e.data);
console.log(data);
}
})
</script>
那么我的socket脚本如下:
set_time_limit(0);
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
require dirname(__DIR__) . '../vendor/autoload.php';
class socket implements MessageComponentInterface{
protected $clients;
public function __construct(){
$this->clients = new \SplObjectStorage;
echo 'Server Started.'.PHP_EOL;
}
public function onOpen(ConnectionInterface $socket){
$this->clients->attach($socket);
echo 'New connection '.$socket->resourceId.'!'.PHP_EOL;
}
public function onClose(ConnectionInterface $socket) {
$this->clients->detach($socket);
echo 'Connection '.$socket->resourceId.' has disconnected'.PHP_EOL;
}
public function onError(ConnectionInterface $socket, \Exception $e) {
echo 'An error has occurred: '.$e->getMessage().'!'.PHP_EOL;
$socket->close();
}
public function onMessage(ConnectionInterface $from, $json){
echo 'Connection '.$from->resourceId.' sent '.$json.PHP_EOL;
$data = json_decode($json, true);
$account_id = $data['account_id'];
$request_type = $data['request_type'];
try {
$conn = new PDO("mysql:host=".$db_host.";port:".$db_port.";dbname=".$db_name."", $db_user, $db_pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo $e->getMessage();
}
foreach ($this->clients as $client) {
if ($from->resourceId == $client->resourceId) {
if($request_type == 'trial'){
// while(true){
$response_array= [];
$stmt = $conn->prepare("SELECT * FROM table WHERE account_id=:account_id AND last_status_change=now()");
$stmt->bindParam(':account_id', $account_id);
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $key=>$value) {
$response_array[$key] = $value;
}
if(!empty($response_array)){
foreach($response_array as $item){
$status = $item['status'];
}
$response = array(
'account_id' => $account_id,
'status' => $status
);
var_dump($response);
$client->send(json_encode($response));
}
// sleep(5);
// }
}
}
}
}
}
$server = IoServer::factory(
new HttpServer(
new WsServer(
new socket()
)
),
8080
);
$server->run();
就目前而言,它按预期工作,但仅当页面加载时状态发生变化时才提供当前状态,我将在控制台中看到状态,只要我取消评论
while()
循环实际继续检查更新状态,我的套接字将执行
var_dump()
当状态发生变化但客户端没有记录任何内容时,命令行中的结果。
fetch()
的间隔来进行长轮询。到一个获得最新数据库结果的 PHP 脚本,但它不是很有效,并且当大量客户端处于事件状态并不断向文件发出请求时会导致问题,这反过来又减慢了数据库的速度。所以我不确定为什么
while()
循环正在像这样影响它,或者如果我什至以正确的方式进行处理。
最佳答案
while 循环不是它的工作原理。它会阻塞东西并无限地和不必要地消耗资源。
您要的是 addPeriodicTimer()
.
定期检查需要更新的客户。
添加到您的 bootstrap 中,如下所示:
$reactEventLoop->addPeriodicTimer(5, function() use $messageHandler, $server {
// Fetch all changed clients at once and update their status
$clientsToUpdate = getUpdatedClients($server->app->clients);
foreach ($clientsToUpdate as $client) {
$client->send(json_encode($response));
}
});
这比任何其他方法都轻得多,因为您可以
关于PHP/Ratchet websocket - while 循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65741189/
我需要一起实时收听 2 个网络套接字 URL。我创建了 2 个连接到不同 URL 的连接,但我只看到了第一条消息结果。如何在没有关闭第一次连接的情况下从 wss://exalpme2 获取消息? 我的
我正在尝试根据 YouTube 中的教程创建基本的 websocket 聊天,但在运行时我在终端中遇到了这个错误 php bin/server.php Fatal error: Interface '
我正在尝试在 Ratchet 中使用 sessionProvider,以下是我的 shell 脚本: namespace App\Console\Commands; use Ratchet\S
我正在尝试在我的系统上设置 Ratchet 并关注了 socketo.me 我已经做了一切,直到安装 ZMQ 和 React/Zmq 并且一切都成功了。 但是当我尝试运行时 push-server.p
我正在为我的应用程序使用 PHP Ratchet(推送集成),并具有实时出价功能,它的工作原理非常棒。 由于高流量,我们将我们的应用程序移到 AWS 平台上,我们有多个应用程序服务器实例,其中一个(R
我正在使用 Ratchet 为群聊启用推送通知。 我决定做以下事情: 每当用户连接时,为他订阅他参与的所有群组主题以及个人消息主题。 我有一个数组 protected $subscribedTopic
我只是在学习 Ratchet(用于 PHP 实时聊天应用程序的库)。根据文档,以下函数将收到两件事: 消息来自谁和 信息。 然而,它错过了发送给谁。此功能将消息发送给所有连接的人。但我也想实现一对一聊
我使用 Ratchet php 创建了一个网络套接字连接。我连接了一个客户端,然后执行了一个查询(执行查询大约需要 20 秒),同时我尝试连接另一个客户端,我看到网络套接字连接处于挂起状态(仍在尝试切
我正在开发一个具有聊天功能的网站,当用户收到新消息时需要即时通知。我正在尝试决定是使用 Ratchet 服务器还是使用 AJAX 实现长轮询系统。我目前已经实现了一个基本的 Pub/Sub Ratch
我正在尝试使 Ratchet 推送教程起作用。 http://socketo.me/docs/push 我正在按照教程所说的做,但我的订阅者不会收到任何消息。 我的服务器.php getSocket(
我开始使用 PhP Ratchet 套接字。按照指南,我可以制作一个简单的聊天应用程序,它可以在同一台计算机上运行。例如,如果我打开chrome和firefox,我可以交互发送和接收消息,ok。 问题
我是尝试实现 Ratchet 的编程初学者。 这是我当前的文件结构 D:\Xampp composer.phar htdocs Ratchet composer.
在 documentation , 他们有: Item 2 问:这只是打字错误,还是他们出于某种原因将 table-view-cell 放入了两次? 最佳答案 前几天我注意到了同样的事情并打算调查..
我是网络套接字编程的新手。我正在 codeigniter 中实现 web socket 以实现简单的聊天功能,我的配置看起来像这样 $config['ratchet_client'] = array
最近一直在学习如何使用 Ratchet 在 PHP 中实现 websockets,但我不知道如何让它与按钮点击一起工作。 这是我当前的 JS/jQuery 代码: jQuery(documen
我有一个托管在 AZURE 平台上的 Ubuntu 服务器。 SSH 的 IP 是 52.XX.XX.XX,如果我这样做了 ifconfig 表明 eth0 Link encap:Ethernet
我目前正在为 UI 使用 Ratchet 框架,并且想知道如何在页面之间共享信息(例如用户输入的数据)。该网站似乎没有涵盖这一点,我似乎无法找到任何类型的教程。 最佳答案 您最好的选择是使用 HTML
我已经使用 Ratchet 集成了 pusher。向所有用户广播工作正常。 现在我试图找到一种方法,当我连接到特定用户时如何向特定用户发送消息。 在 subscribe 上执行的方法: public
在客户端: var ws = new WebSocket('ws://localhost:8082/chat?id=123&tid=7'); 在服务器端 class MyApp implements
我使用 Ratchet 作为一些基于浏览器的游戏的套接字服务器,我注意到一个非常奇怪的行为。 我的应用程序类实现了 WampServerInterface,我注意到在 4-5 个客户端连接和断开连接(
我是一名优秀的程序员,十分优秀!