
正文
php实时发送数据 php发送post数据包
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
php实现websocket实时消息推送
一、socket协议的简介
WebSocket是什么,有什么优点
WebSocket是一个持久化的协议,这是相对于http非持久化来说的。应用层协议
举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client只需进行一次握手,成功后即可持续进行数据通信,值得关注的是WebSocket实现client与server之间全双工通信,即server端有数据更新时可以主动推送给client端。
二、介绍client与server之间的socket连接原理
1、下面是一个演示client和server之间建立WebSocket连接时握手部分
2、client与server建立socket时握手的会话内容,即request与response
a、client建立WebSocket时向服务器端请求的信息
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告诉服务器现在发送的是WebSocket协议
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin:
b、服务器获取到client请求的信息后,根据WebSocket协议对数据进行处理并返回,其中要对Sec-WebSocket-Key进行加密等操作
HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证
Sec-WebSocket-Protocol: chat
3、socket建立连接原理图:
三、PHP中建立websocket的过程讲解
SocketService.php:
web.html:
相关问答
Q1: PHP 如何向 MySQL 发送数据
姓: input type=text name=first_name size=25 maxlength=25
名: input type=text name=last_name size=25 maxlength=25 p input type=submit /form /body /html当你输入数据php实时发送数据,并按下 submit 按钮后,这个表单将把数据发送到 submitform.php(做为现在的主流开发语言)3 。再由这个 php(做为现在的主流开发语言) 脚本来处理收到的数据,下面就是 submitform.php(做为现在的主流开发语言)3 的代码php实时发送数据: html body ?php(做为现在的主流开发语言)
MySQL(和PHP搭配之最佳组合)_connect (localhost, username, password);
MySQL(和PHP搭配之最佳组合)_select_db (dbname);
MySQL(和PHP搭配之最佳组合)_query ("INSERT INTO tablename (first_name, last_name)
VALUES ($first_name, $last_name)");print ($first_name);
print (" ");
print ($last_name);
print (" p");
当你按下 submit 之后,可以看到你输入的名字被显示在一个新的页面中。再看一看浏览器的URL 栏,它的内容应该是像这样的:
… /submitform.php(做为现在的主流开发语言)3?first_name=Fredlast_name=Flintstone
因为我们用到的是表单 GET 方法,因此数据是通过 URL 来传送到 submitform.php(做为现在的主流开发语言)3的。显然, GET 方法是有局限性的,当要传递的内容很多时,就不能用 GET 了,只能用 POST 方法。但不管用什么方法,当数据传送完成后, php(做为现在的主流开发语言) 自动的为每一个表单中的字段建立一个和他们的名字(表单的 name 属性)相同的变量。
php(做为现在的主流开发语言) 变量都已用一个美元符号开头的,这样,在 submitform.php(做为现在的主流开发语言)3 脚本处理的过程中,就会有 $first_name 和 $last_name 这两个变量了,变量的内容就是你输入的内容。
我们来检查一下你输入的名字是否真的被输入到数据库中了。启动 MySQL(和PHP搭配之最佳组合),在 MySQL(和PHP搭配之最佳组合) 提示符下输入:
MySQL(和PHP搭配之最佳组合) select * from tablename;
你应该可以得到一个表,内容就是你刚才输入的了:
+------------+------------+
| first_name | last_name |
+------------+------------+|柳 | 如风+------------+------------+
1 rows in set (0.00 sec)
脚本的开始两行是:
MySQL(和PHP搭配之最佳组合)_connect (localhost, username, password);
MySQL(和PHP搭配之最佳组合)_select_db (dbname);
这两个函数调用用来打开 MySQL(和PHP搭配之最佳组合) 数据库,具体的参数的含义刚才已经说过了。
下面的一行是执行一个 SQL 语句 :
MySQL(和PHP搭配之最佳组合)_query ("INSERT INTO tablename (first_name, last_name)
VALUES ($first_name, $last_name)");MySQL(和PHP搭配之最佳组合)_query 函数就是用来对选定的数据库执行一个 SQL 查询。你可以在 MySQL(和PHP搭配之最佳组合)_query 函数中执行任何的 SQL 语句。
Q2: php中如何实现实时更新数据呢?jQuery?
网页一般是单向主动短链接php实时发送数据,实时更新实在有些不便php实时发送数据,即使一方掉线php实时发送数据,另一方也不能及时感知。一般所谓的实时刷新,大多采用定时刷新(轮询),或长轮询的方式做,ajax用于更新数据确实是比较简单方便的。
轮询你就settimeout,长轮询你就每次接收数据成功后,再来一次长轮询。但你链接别人的数据,了解一下供应商的刷新机制、周期再做考虑。
当然这些都是伪实时,真的实时用http协议是不合适的,你得用flash插件做。而你用的是api供应商的东西,这条路就基本走不通了。
Q3: 如何用php程序主动向html页面发送信息?
你说的应该是服务端主动向客户端推送消息, 这个只能使用Socket建立长连接来实现。
客户端实现比较简单, 大多数浏览器提供的应该都有接口, 几个方法就可以建立一个连接,然后进行消息监听就可以了,服务端实现稍微复杂点, 不过你根本不用自己写那些底层代码, php平台上有一个库叫 "Workerman", 里面所有功能已经帮你实现好了, 你看看文档就能直接调用了, 很简单的。
Q4: 如何在php后端及时推送消息给客户端
后端代码
push.php
?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一个worker容器,监听1234端口
$worker = new Worker('websocket://0.0.0.0:1234');
// 这里进程数必须设置为1
$worker-count = 1;
// worker进程启动后建立一个内部通讯端口
$worker-onWorkerStart = function($worker)
{
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker-onMessage = function($connection, $buffer)
{
global $worker;
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = json_decode($buffer, true);
$uid = $data['uid'];
// 通过workerman,向uid的页面推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果
$connection-send($ret ? 'ok' : 'fail');
};
$inner_text_worker-listen();
};
// 新增加一个属性,用来保存uid到connection的映射
$worker-uidConnections = array();
// 当有客户端发来消息时执行的回调函数
$worker-onMessage = function($connection, $data)use($worker)
{
// 判断当前客户端是否已经验证,既是否设置了uid
if(!isset($connection-uid))
{
// 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
$connection-uid = $data;
/* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
$worker-uidConnections[$connection-uid] = $connection;
return;
}
};
// 当有客户端连接断开时
$worker-onClose = function($connection)use($worker)
{
global $worker;
if(isset($connection-uid))
{
// 连接断开时删除映射
unset($worker-uidConnections[$connection-uid]);
}
};
// 向所有验证的用户推送数据
function broadcast($message)
{
global $worker;
foreach($worker-uidConnections as $connection)
{
$connection-send($message);
}
}
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker-uidConnections[$uid]))
{
$connection = $worker-uidConnections[$uid];
$connection-send($message);
return true;
}
return false;
}
// 运行所有的worker(其实当前只定义了一个)
Worker::runAll();
启动后端服务
php push.php start -d
前端接收推送的js代码
var ws = new WebSocket('ws://127.0.0.1:1234');
ws.onopen = function(){
var uid = 'uid1';
ws.send(uid);
};
ws.onmessage = function(e){
alert(e.data);
};
后端推送消息的代码
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'='uid1', 'percent'='88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
这里的uid不一定是用户的id,也可以理解为任务id即 taskid
Q5: php怎么才能实现即时通讯?
如下:
php实现实时通信一般有两种方式:socket或comet。
socket是比较好的解决方案,问题在于不是所有的浏览器都兼容,服务器端实现起来也稍微有点麻烦。
comet(基于HTTP长连接的"服务器推")实现起来更加方便,而且兼容所有的浏览器。comet也有好几种实现方式,如iframe, http long request等。
js用定时器周期性向服务器发送请求,模拟实时刷新。这里分长轮询和短轮询。
区别是:长轮询在没有数据更新时,不会立刻返回结果而是在服务器端hold住,直到有数据更新再返回结果。
短轮询无论数据是否有更新,都立刻返回结果。
这种做法服务器开销较大,2websokect,html5的新特性,可以在前后端建立双向通信
缺点是部分浏览器不支持。b/s架构的系统其实实现即使通信是比较有难度的,因为很难实现服务器推送
目前主流是用js轮询实现,但只要能通过代码减小服务器开销,也能达到比较好的效果。
php实时发送数据的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php发送post数据包、php实时发送数据的信息别忘了在本站进行查找喔。






