我在webapp上使用datatables作为我的网格.问题是,用户必须始终刷新页面以从数据库中获取当前数据,有没有办法可以自动完成?因为有几个应用程序写入同一个表,而webapp仅用于监控,但如果用户必须刷新页面以获取当前数据,它就会失败.这是我的初始化代码:
$('.{{datatable['class']}}').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "includes/swf/copy_csv_xls_pdf.swf",
"aButtons": [
{
"sExtends":"copy",
"mColumns":[{{datatable['flds']}}]
},
{
"sExtends":"csv",
"mColumns":[{{datatable['flds']}}]
},
{
"sExtends":"xls",
"mColumns":[{{datatable['flds']}}]
},
{
"sExtends": "pdf",
"mColumns":[{{datatable['flds']}}],
"sPdfOrientation": "landscape",
"sPdfMessage": "{{datatable['title']}}"
}
]
},
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "{{datatable['source']}}",
"aoColumns": [
{% for column in 0..datatable['columns']-2 %}
null,
{% endfor %}
null
]
});
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,每当数据源发生任何事情(UPDATE/INSERT/DELETE)时,列表可以自行更新?我已经实现了Danny建议的循环,
var int=self.setInterval(function(){oTable.fnDraw();},1000);
Run Code Online (Sandbox Code Playgroud)
但问题是列表总是一个有趣的状态,看到附着的图像
我目前正在尝试使用 WebSockets,以减少/消除在潜在的低带宽环境中对持续 AJAX 请求的需求。所有设备都兼容 WebSocket,所以没有问题,我试图将其保留为原生 PHP WebSocket,没有 Node.js 或其他框架/库(到目前为止一直很好)。
我想做的是决定如何通知连接的客户端有关另一个客户端对数据库的更新。所讨论的用例是一个人按下其设备上的按钮,然后设备会提醒该人员的经理按下该按钮。所以我有两个选择如下:
1. 循环数据库查询 (PHP)
我的第一个想法是向 WebSocket 服务器插入一个查询,该查询实际上是在说“警报字段是否已更改?如果是,请通知经理”。虽然这是最直接、最明智的方法(我能想到的),但设计一个旨在减少服务器压力的 PHP 脚本似乎很浪费,该脚本现在每秒运行一个查询,但是,至少这可以确保当检测到数据库更新时,将发送更新。
2. 客户端发送通知
我的另一个想法是,当客户端更新数据库时,他们实际上可以自己发送 WebSocket 通知。这样做的优点是减少任何密集和循环查询,但也意味着每次我想要更改任何数据时都需要发送 WebSocket 消息,例如:
$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code
{
if(Result == "Successful")
{
SendWebSocketNotification(OtherData);
}
}
Run Code Online (Sandbox Code Playgroud)
也许这是最好的选择,因为它是最有效的,但我担心更新数据库和发送 WebSocket 通知之间的连接可能会断开,这可能需要在 PHP 文件中进行回退检查,与第一个解决方案中的非常相似,尽管间隔较长(例如每 30 秒)。
3.MySQL触发器?
这纯粹是一个猜测,但也许另一种选择是创建一个 MySQL 触发器,它可以以某种方式直接通知 server.php 文件?我不知道这是如何工作的,并且会冒险猜测这可能最终会产生与解决方案 #1 相同或相似的查询要求,但这只是一个......
预先感谢您的帮助 :)
编辑:解决方案可能性 4
事实上,另一个想法刚刚出现在我的脑海中,用于更新数据库的 PHP 文件实际上可以内置一个 WebSocket 消息。这样当PHP文件更新数据库时,通过PHP通知WebSocket服务器,这可能吗?
这可能是一些愚蠢的问题,一些已经缠绕它的人,也许我只需要更多的咖啡.
问题:无论是使用websockets还是ajax,似乎仍然会发生一些轮询.它是否正确?
示例 (不是真实的项目):我想留意文本文件.除非我遗漏了一些东西(更多的咖啡?),我还是不得不a)询问服务器是否有更新,或b)告诉页面我有更新; 通过将PHP代码暂停一段时间或在客户端进行setTimeout循环.
我明白的事情:我确实看到了在服务器和页面之间来回交谈的好处.我看到我没有发送http请求.所以我看到了好处.
细节:我一直只是使用xmlhttprequest所以我决定从我认为理解的内容中查看整个websockets的东西,是实时发送给客户端的数据,但是,如上所述,除非我遗漏了某些东西或者这里有一些逻辑,似乎我还是要告诉php或javascript来检查数据的间隔,否则数据将在无限循环中发送(想象一下调用mysql).
也许我的代码中的逻辑是各种各样的坏.欢迎您查看.从我发现的所有示例中,每个人似乎只是在PHP中运行无限循环
PHP(减去所有连接术语)
while(true) {
// update once a second
$this->send($client, file_get_contents('/my/file/test.txt'));
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
使用Javascript
var websocket = new WebSocket( "ws://mysite.com:12345" );
websocket.onmessage = function( str ) {
console.log( str.data );
};
Run Code Online (Sandbox Code Playgroud)
我只是没有理解这个如何在没有某种轮询的情况下实现它的逻辑.也许这就是它应该如何运作.
我明白,如果我从PHP代码中删除睡眠,事情会变得更加实时,太多,但这似乎会在上面的例子中无限地轮询文件并且这似乎不对.
编辑:为了澄清,我并不是专门寻找一个观看文本文件的具体解决方案.如果你撇开这个问题,你可能已经想到了这一点.
编辑:未来的访问者,答案是:当用户发送更改时,您不会专门关注更改,而是将更改发送给打开的连接.
我想在我的 HTTP 标头中发送 json 数据。
我使用的是 Codeigniter PHP,所以我在我的控制器中做了这个:
header('Content-Type: application/json');'
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
$request = array(
'request' => $_GET['request'],
'device_id' => $_GET['device_id'],
'launch_date'=> $_GET['launch_date'],
'allowed_hours'=>$_GET['allowed_hours'],
'site_id'=>$_GET['site_id'],
'product'=>$_GET['product'],
'software_version'=>$_GET['software_version'],
'platform_os'=>$_GET['platform_os'],
'platform'=>$_GET['platform'],
'platform_model'=>$_GET['platform_model']
);
$response = array(
'response_code' =>200 ,
'device_id'=>$_GET['device_id'],
'allowed_hours'=>$_GET['allowed_hours'],
'product'=>'mlc',
'prov_ur'=>NULL
);
header('Content-Type: application/json');
echo json_encode( $response );
Run Code Online (Sandbox Code Playgroud)
但是当我打印我的标题时,我得到
遇到 PHP 错误严重性:注意
消息:未定义索引:请求
文件名:admin/license.php
行号:22
遇到 PHP 错误严重性:注意
消息:未定义索引:allowed_hours
文件名:admin/license.php
行号:25
遇到 PHP 错误严重性:注意
消息:未定义索引:allowed_hours
文件名:admin/license.php
行号:40
{"response_code":200,"device_id":"70D0D01FBAD2","allowed_hours":null,"product":"mlc","prov_ur":null}array(10) { ["Host"]=> string(14) ) "192.168.50.123" ["Connection"]=>
string(10) "keep-alive" ["Cache-Control"]=> string(9) …
在 Chrome 中 50.0.2661.94 m
\n\nvar a = new WebSocket(\'ws://192.168.0.153:9000/socket_listener_1_WINDOWS.php\');\nRun Code Online (Sandbox Code Playgroud)\n\n错误(从昨天下午开始 - 它适用于其他客户端电脑,但“ws://echo.websocket.org/”也可以使用我的电脑作为客户端)
\n\nWebSocket connection to \'ws://192.168.0.153:9000/socket_listener_1_WINDOWS.php\' failed: One or more reserved bits are on: reserved1 = 0, reserved2 = 1, reserved3 = 1\nRun Code Online (Sandbox Code Playgroud)\n\n(“reserved1、2和3”是什么以及在哪里???)
\n\n这是服务器的 PHP 脚本(使用 XAMPP 3.2.2 启动):
\n\n<?php\n\n//error_reporting(E_ALL);\n\nset_time_limit(0);\n\n$IP = isset($_SERVER[\'SERVER_ADDR\']) ? $_SERVER[\'SERVER_ADDR\'] : gethostbyname(gethostname());\n\necho $IP . \'\\r\\n\';\n\n$host = $IP; //$_SERVER[\'SERVER_ADDR\']; //host\n$port = 9000; //port\n$null = NULL;\n$read = NULL;\n$except = NULL;\n\nfunction send_message($msg) {\n global $clients;\n foreach ($clients as $changed_socket) {\n @socket_write($changed_socket, …Run Code Online (Sandbox Code Playgroud) 我已经实现了通过浏览器进行视频音频通话的WebRTC。我正在使用最新的adapter.js. 我还为原生 Android 应用程序实现了 WebRTC。我的信令服务器基于 php WebSocket(Ratchet websocket)。当我在两个浏览器(chrome-chrome 或 chrome-firefox 组合)中测试我的实现时,我发现该协议工作正常。我的意思是视频音频通话正常。当我测试我的 Android 应用程序时,我可以看到它也适用于应用程序到应用程序的通信。
但问题是,当我尝试从 Android 应用程序调用 Web 应用程序时,我发现 setRemoteDescription 不起作用,而是生成以下错误:
Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote answer sdp: Media section has more than one track specified with a=ssrc lines which is not supported with Unified Plan.
Run Code Online (Sandbox Code Playgroud)
在我的 gradle(app) 脚本中,我实现了 WebRTC 库,如下所示:
implementation 'org.webrtc:google-webrtc:1.0.+'
Run Code Online (Sandbox Code Playgroud)
这就是为什么我认为最新的adapter.js(对于 Web 部分)和 Android 库应该兼容,并且不存在与 Web 实现和 Android 实现之间的版本不兼容相关的问题。
为了更好地理解,我在这里分享生成报价时发现的 SDP 消息。
v=0
o=- 7452034467634633423 2 IN IP4 127.0.0.1 …Run Code Online (Sandbox Code Playgroud) 我在这里浏览了论坛,这是我发现的最接近的问题:
如何(de)在WebSockets hybi 08+中构建数据框架?
不同之处在于我无法获得成功的握手.我假设在握手完成之后,框架不会发挥作用,这是正确的吗?
当Chrome方便地更新到使用HyBi 10 websocket协议(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10)的版本14时,我即将发布概念验证.根据握手规范中的信息(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10#section-5.2.2),我已经能够成功创建一个Sec-WebSocket - 接受键(基于他们的例子成功),但在客户端,socket.onopen函数永远不会触发.
上次我遇到了WebSocket协议握手的问题,这是一个用正确的字节终止握手的问题(或者我认为字符更准确?).我正在使用PHP进行当前的实现,这意味着尝试解码Python或C#实现,到目前为止还没有成功.
以下是我在Chrome 14(适用于Windows)中运行的客户端Javascript:
var socket;
socket = new WebSocket(host);
socket.onopen = function(msg){
// process onopen
};
socket.onmessage = function(msg){
// process message
};
socket.close = function(msg){
// process close
};
Run Code Online (Sandbox Code Playgroud)
这是我的握手服务器端PHP代码:
function dohandshake($user,$buffer){
// getheaders and calcKey are confirmed working, can provide source if desired
list($resource,$host,$origin,$key,$version) = $this->getheaders($buffer);
$request = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: WebSocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: " . $this->calcKey($key) . …Run Code Online (Sandbox Code Playgroud) 我想开始使用websockets建立到PHP套接字服务器的连接.如果数据库中的某些内容发生了变化,该服务器应该以一定的间隔进行检查,然后它应该将更改发送回客户端.因此,当连接客户端时,只要客户端(本例中为webbrowser)在页面上,连接就应该保持打开状态.
然后服务器应该以一定的间隔检查数据库并在需要时发回数据.我知道问题不在于websockets(除了并非所有主流浏览器都支持它).主要是我担心的是PHP.我想用PHP创建服务器,但是我可以保持连接打开PHP代码,只要我想要吗?
间隔怎么样.通常在C#.NET exe应用程序中,我只会创建一个计时器.怎么可以在PHP中完成?
如果这一切都可能,我可以简单地在Apache网络服务器中运行我的PHP代码吗?
我对这个Websockets真的很新,我正在尝试连接这个websocket:phpwebsocket和WAMP服务器,首先,在我的httpd.conf中我写了听9300,如果我去localhost:9300它工作正常,但是当我去控制台写道:
php -q C:\wamp\www\demos\server.php
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:

这是server.php的代码:
<?php
set_time_limit(0);
require 'class.PHPWebSocket.php';
function wsOnMessage($clientID, $message, $messageLength, $binary) {
global $Server;
$ip = long2ip( $Server->wsClients[$clientID][6] );
if ($messageLength == 0) {
$Server->wsClose($clientID);
return;
}
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
foreach ( $Server->wsClients as $id => $client )
if ( $id != $clientID )
$Server->wsSend($id, "Visitor $clientID ($ip) said \"$message\"");
}
function wsOnOpen($clientID) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个在线视频聊天应用程序,其中一组用户可以查看并向他们所在的样板房发送消息.为此我使用websocket和php.
但是当用户发送任何消息时,它将发送给所有用户而不是他/她所在的房间.以下是我的示例代码.
function send_message($msg) {
global $clients;
foreach ($clients as $changed_socket) {
@socket_write($changed_socket, $msg, strlen($msg));
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
请提供宝贵的反馈意见.
您好我试图在客户端和服务器之间实现websocket通信.问题是当我试图在命令行中启动服务器时出现此错误
# php -q htdocs\socket\server\startDaemon.php
2012-07-23 10:10:02 System: Socket Resource id #7 cre
2012-07-23 10:10:02 System: Socket bound to localhost
2012-07-23 10:10:02 System: Start listening on Socket
Strict Standards: Only variables should be passed by reference in
C:\xampp\htdocs\socket\server\socketWebSocket.class.php on line 35
Run Code Online (Sandbox Code Playgroud)
第35行的代码如上:
$num_sockets = socket_select($changed_sockets,$write=NULL,$exceptions=NULL,NULL);
Run Code Online (Sandbox Code Playgroud)
我找了答案,但没有任何作用.有谁能够帮我?感谢名单
我尝试通过 Thruway 设置一个可以管理多个组的 websocket 服务器。类似于聊天应用程序,每个客户端可以同时订阅一个或多个,并将消息广播到整个聊天室。我设法用一个古老版本的 Ratchet 做到了这一点,但由于它运行得不是很流畅,我想切换到高速公路。可悲的是,我找不到任何可以管理群组的东西。到目前为止,我作为 websocket-manager 有以下内容,并且客户端正在使用 Autobahn|js (18.x) 的当前版本。
有没有人知道是否可以使用以下内容管理订阅组?
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Thruway\Peer\Router;
use Thruway\Transport\RatchetTransportProvider;
$router = new Router();
$router->addTransportProvider(new RatchetTransportProvider("0.0.0.0", 9090));
$router->start();
Run Code Online (Sandbox Code Playgroud) 我被要求在工作中使用 websocket 和 php Ratchet 进行 api 调用。由于我对websocket完全不熟悉,所以我通过google和观看youtube视频来解决这个问题,但是我搜索的越多,我就越觉得用websocket调用api是不可能的。
是我遗漏了什么还是websocket调用api真的不可能?如果可能的话,您能给我举个例子吗?
我知道我可能听起来很尴尬,因为我对网络套接字没有深入的了解,英语甚至不是我的母语,但我真的很绝望,请帮助我
phpwebsocket ×13
websocket ×11
php ×9
javascript ×4
android ×1
apache ×1
autobahn ×1
codeigniter ×1
datatables ×1
html ×1
html5 ×1
http-headers ×1
jquery ×1
long-polling ×1
mysql ×1
ratchet ×1
thruway ×1
wamp ×1
webrtc ×1