swoole web服务器的webSocket类没有connections属性吗

swoole的webSocket类没有connections属性吗_百度知道
swoole的webSocket类没有connections属性吗
我有更好的答案
Firefox,目前流行的浏览器都支持这个协议,例如Chrome,Safariswoole的websocket类没有connections属性 WebSocket是html5新增加的一种通信协议,Opera,IE等等,对该协议支持最早的应该是chrome
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。\swoole_websocket_server
class swoole_websocket_server extends swoole_http_server
继承自 swoole_http_server 类
No constants found
No protected methods found
No protected properties found
No private methods found
No private properties found
swoole_websocket_server
Class hierarchy
\swoole_websocket_server
Properties
$master_pid
$master_pid : integer
& 前服务主进程 master 的 PID
None found
$manager_pid
$manager_pid : integer
& 当前服务管理进程 manager 的 PID
None found
$worker_pid
$worker_pid : integer
& 当前 Worker 进程的操作系统进程ID。与posix_getpid()的返回值相同。
None found
$taskworker
$taskworker : boolean
& true表示当前进程是Task工作进程,false表示当前进程是Worker进程
None found
$setting : array
swoole_server::set() 函数所设置的参数会保存到 swoole_server::$setting 属性上。在回调函数中可以访问运行参数的值。
& 数组,保存通过 set() 设置的参数属性列表
None found
__construct()
__construct(string
$serv_host, integer
$serv_port)
__construct swoole_http_server 构造函数
Parameters
$serv_host
服务要监听的 ip 地址
$serv_port
服务要监听的 port 端口
$event_name, callable
$callback) : boolean
注册 Server 的事件回调函数
Parameters
$event_name
事件名,不区分大小写
swoole_server 事件列表
master 进程,master 进程启动后触发该事件
函数原型:function onStart(swoole_server $server);
在此事件之前Swoole Server已进行了如下操作:
已创建了manager进程。
已创建了worker子进程。
已监听所有TCP/UDP端口。
已监听了定时器。
Shutdown master 进程,master 进程退出后触发该事件
函数原型:function onShutdown(swoole_server $server);
在此之前Swoole Server已进行了如下操作:
已关闭所有线程。
已关闭所有worker进程。
已close所有TCP/UDP监听端口。
已关闭主Rector。
ManagerStart manager 进程,manager 进程启动后触发该事件
函数原型:function onManagerStart(swoole_server $serv);
在这个回调函数中可以修改管理进程的名称
ManagerStop
manager 进程,manager 进程退出后触发该事件
函数原型:function onManagerStop(swoole_server $serv);
WorkerError
manager 进程,worker 进程出错后触发该事件
函数原型:function onWorkerError(
swoole_server $serv,
int $worker_id, int $worker_pid,
int $exit_code, int $signal);
$worker_pid 是异常进程的ID。
$exit_code 退出的状态码,范围是 1 ~255。
$signal 进程退出的信号。
worker 进程,客户端连接后触发该事件
函数原型:function onConnect(swoole_server $server,
int $fd, int $from_id);
$server 是 swoole_server 对象。
$fd 是连接的文件描述符,发送数据/关闭连接时需要此参数。
$from_id 来自那个 Reactor 线程。
worker 进程,收到客户端发送的数据后触发该事件
函数原型:function onReceive(swoole_server $server, int $fd,
int $reactor_id, string $data);
$server 是 swoole_server 对象。
$fd 是连接的文件描述符,发送数据/关闭连接时需要此参数。
$from_id 来自那个 Reactor 线程。
$data 收到的数据
//receive 事件回调示例
$server-&on('Receive',
function($serv, $fd, $from_id, $data) {
$serv-&send($fd, 'Swoole: '.$data);
worker 进程,客户端关闭连接后触发该事件
函数原型:function onClose(swoole_server $server,
int $fd, int $reactorId);
$server 是swoole_server对象。
$fd 是连接的文件描述符。
$reactorId 来自那个reactor线程。
worker 进程,Udp server 收到客户端发送数据后触发该事件
函数原型:function onPacket(swoole_server $server, string $data,
array $client_info);
$server,swoole_server对象。
$data,收到的数据内容,可能是文本或者二进制内容。
$client_info,客户端信息包括address/port/server_socket 3项数据。
task 进程,worker 进程向 task 进程发送数据后触发该事件
函数原型:function onTask(swoole_server $serv, int $task_id,
int $src_worker_id, mixed $data);
$src_worker_id 发送数据的 worker_id
要发送的数据
worker 进程,task 进程调用 finish 接口或 return,worker 进程触发该事件
函数原型:function onFinish(swoole_server $serv,
int $task_id, string $data);
$task_id是任务的ID,
$data是任务处理的结果内容。
WorkerStart worker/task 进程,worker/task 进程启动后触发该事件
函数原型:function onWorkerStart(swoole_server $server,
int $worker_id)
可以通过$worker_id参数的值,判断worker是普通worker还是task_worker。
$worker_id&= $serv-&setting['worker_num'] 时表示这个进程是task_worker。
$worker_id是一个 [0, $worker_num] 之间的数字,
表示这个worker进程的ID,$worker_id和进程PID没有任何关系
WorkerStop
worker/task 进程,worker/task 进程退出后触发该事件
函数原型:function onWorkerStop(swoole_server $server,
int $worker_id);
$worker_id 退出进程的 id 号
PipeMessage worker/task 进程,调用 $server-&sendMessage 接口后,收到消息的进程触发
函数原型:function onPipeMessage(swoole_server $server,
int $from_worker_id,
string $message);
$from_worker_id 消息来自哪个进程
$message 消息内容
swoole_http_server 新增事件
worker 进程,服务端收到一个完整的 http 请求后,调用此函数。
onRequest 回调会销毁 $request 和 $response 对象
$http_server-&on('Request', function ($request, $response) {
$response-&end("&h1&Hello Swoole. #".rand()."&/h1&");
swoole_websocket_server 独有事件:
HandShake worker 进程,WebSocket建立连接后进行握手。
WebSocket服务器已经内置了handshake,
如果用户希望自己进行握手处理,可以设置onHandShake事件回调函数。
函数原型:function onHandShake(swoole_http_request $request,
swoole_http_response $response);
onHandShake事件回调是可选的;
设置 onHandShake 回调函数后不会再触发 onOpen 事件,需要应用代码自行处理;
onHandShake 函数必须返回true表示握手成功,返回其他值表示握手失败;
内置的握手协议为Sec-WebSocket-Version: 13,低版本浏览器需要自行实现握手;
worker 进程,当WebSocket客户端与服务器建立连接并完成握手后会回调此函数。
函数原型:function onOpen(swoole_websocket_server $svr,
swoole_http_request $req);
$req 是一个Http请求对象,包含了客户端发来的握手请求信息;
onOpen 事件函数中可以调用push向客户端发送数据或者调用close关闭连接;
onOpen 事件回调是可选的;
worker 进程,必须设置onMessage回调,收到来自客户端的数据帧时会回调此函数
函数原型:function onMessage(swoole_server $server,
swoole_websocket_frame $frame);
$frame 是swoole_websocket_frame对象,包含了客户端发来的数据帧信息;
onMessage回调必须被设置,未设置服务器将无法启动;
客户端发送的ping帧不会触发onMessage,底层会自动回复pong包;
发生 $event_name 事件时的回调函数
& 成功返回 true,失败返回 false
push(string
$data, integer
$opcode = 1, boolean
$finish = true) : boolean
向对端推送数据,长度最大不得超过2M,只用于 websocket
Parameters
要发送的数据内容
[optional]
指定发送数据内容的格式,默认为文本 WEBSOCKET_OPCODE_TEXT_FRAME,值为 1。
发送二进制内容$opcode参数需要设置为WEBSOCKET_OPCODE_BINARY_FRAME,值为 2。
[optional]
一个message分为多个frame传输时,finish为 fakse 表示 message 未完,为 true 代表最后一个frame。
& 执行成功返回 true,失败返回 false
exist(integer
$fd) : boolean
exist 检测 $fd 对应的连接是否存在
Parameters
要检测的连接的 $fd
& 连接存在返回 true,不存在返回 false
start() : boolean
start 启动 Http 服务器
& 启动成功返回 true,失败返回 false
listen(string
$host, integer
$port, integer
$sock_type) : \swoole_server_port|false
增加一个Server要监听的端口
Parameters
要监听的ip地址
要监听的端口
$sock_type
socket类型,参考构造函数中的 $sock_type
& 成功返回 swoole_server_port 对象,失败返回 false
addlistener()
addlistener(string
$host, integer
$port, integer
$sock_type) : \swoole_server_port|false
增加一个Server要监听的端口,意义同 listen 接口
Parameters
要监听的ip地址
要监听的端口
$sock_type
socket类型,参考构造函数中的 $sock_type
& 成功返回 swoole_server_port 对象,失败返回 false
$zset) : boolean
set 设置 swoole_websocket_server 的配置选项
Parameters
数组,key-&value 形式的配置项
参考 swoole_server-&set 中配置选项,http_server 额外增加了如下配置:
upload_tmp_dir
设置上传文件的临时目录
http_parse_post 设置POST消息解析开关,选项为true时自动将Content-Type
为x-www-form-urlencoded的请求包体解析到POST数组。
设置为false时将关闭POST解析。
& 成功返回true,失败返回 false
protect(integer
$conn_fd, boolean
$is_protected = null) : boolean
protect 从心跳管理中隔离连接,用于保护某些连接不被心跳线程切断
Parameters
要保护的连接 $fd
$is_protected
[optional] 可选参数,默认为 true
& 成功返回 true,失败返回 false
sendfile()
sendfile(integer
$conn_fd, string
$filename) : boolean
sendfile 发送文件到 TCP 客户端连接
sendfile 函数调用 OS 提供的 sendfile 系统调用,由操作系统直接读取文件并写入 socket。
sendfile 只有2次内存拷贝,使用此函数可以降低发送大量文件时操作系统的 CPU 和内存占用。
Parameters
指定目的客户端
要发送的文件路径,如果文件不存在会返回 false
& 操作成功返回 true,失败返回 false
close(integer
$fd, boolean
$reset = false) : boolean
关闭客户端连接
Parameters
要关闭的客户端连接
[optional] 是否强制关闭,默认为否,设置为 true 会强制关闭连接,丢弃发送队列中的数据
& 操作成功返回 true,失败返回 false
task(mixed
$data, integer
$worker_id) : integer|boolean
task 非阻塞投递任务到task_worker 池子中,此函数是非阻塞的,执行完毕会立即返回,worker进程可以继续处理新的请求。
Parameters
非资源类型的任意 php 变量
$worker_id
[optional]
可选参数,默认值为 -1。投递目标task_worker 进程id,默认 -1,设置范围 0 - (serv-&task_worker_num -1)
integer|boolean
& 调用成功,返回值为整数 $task_id,表示此任务的 ID。如果有 finish 回应,onFinish 回调中会携带 $task_id 参数
调用失败,返回 false
finish(mixed
$data) : boolean
用于在 task 进程中通知 worker 进程,投递的任务已完成,此函数可以传递结果数据给 worker 进程
要在 task 进程中调用 finish 函数,必须为 Server 设置 onFinish 回调函数。
此函数只可用于 task 进程的 onTask 回调中
在 task 进程中,return 数据同样会触发 onFinish 事件。
Parameters
task 进程要传递给 worker 进程的数据
& 成功返回 true,失败返回 false
reload() : boolean
重启所有worker 进程
Reload操作只能重新载入Worker进程启动后加载的PHP文件,建议使用get_included_files函数来列出哪些文件是在WorkerStart之前就加载的PHP文件,
在此列表中的PHP文件,即使进行了reload操作也无法重新载入。比如要关闭服务器重新启动才能生效。
& 调用成功返回 true,调用失败返回 false
shutdown()
shutdown() : void
关闭服务器,可以用在worker 进程内。向主进程发送SGITERM也可以实现关闭服务器。
stop() : boolean
停止当前worker进程,并立即触发onWorkerStop回调函数,停止其它worker进程需要指定 $worker_id 的值。
& 调用成功返回 true,调用失败返回 false
getLastError()
getLastError() : integer
getLastError 获取最近一次操作错误的错误码,业务代码中可以根据错误码类型执行不同的逻辑。
常见发送失败错误
1001 连接已经被Server端关闭了,出现这个错误一般是代码中已经执行了$serv-&close()关闭了某个连接,但仍然调用$serv-&send()向这个连接发送数据
1002 连接已被Client端关闭了,Socket已关闭无法发送数据到对端
1003 正在执行close,onClose回调函数中不得使用$serv-&send()
1004 连接已关闭
1005 连接不存在,传入$fd 可能是错误的
1007 接收到了超时的数据,TCP关闭连接后,可能会有部分数据残留在管道缓存区内,这部分数据会被丢弃
1008 发送缓存区已满无法执行send操作,出现这个错误表示这个连接的对端无法及时收数据导致发送缓存区已塞满
常见发送失败错误
& 返回一个整型数字错误码
heartbeat()
heartbeat(boolean
$if_close_connection = false) : void
检测服务器所有连接,并找出已经超过约定时间的连接。
如果if_close_connection=true,则自动关闭超时的连接。否则仅返回连接的fd数组。
Parameters
$if_close_connection
[optional] 可选参数,默认为 false,
getClientInfo()
getClientInfo(integer
$fd, integer
$from_id) : array|false
该函数用来获取连接的信息
Parameters
woker 进程的编号
[optional] 可选参数,若设置该参数,则只获取通过 reactor 线程 id 为 $from_id 的连接信息
array|false
& 如果传入的 fd 存在,将会返回一个数组。如果传入的 fd 不存在或已关闭,返回 false。
[server_fd] =& 3
[socket_type] =& 1
[server_port] =& 9501
[remote_port] =& 56119
[remote_ip] =& 127.0.0.1
[from_id] =& 0
[connect_time] =&
[last_time] =&
getClientList()
getClientList(integer
$start_fd, integer
$find_count) : array|false
遍历当前Server所有的客户端连接,getClientList 方法是基于共享内存的,不存在IOWait,遍历的速度很快。
另外 getClientList 会返回所有 TCP 连接,而不仅仅是当前 worker 进程的 TCP 连接。
Parameters
[optional] 起始 $fd,默认是 0
$find_count
[optional] 每页取多少条,默认是 10,最大值不得超过 SW_MAX_FIND_COUNT,即100
array|false
& 调用成功返回一个数字索引,元素是取到的 $fd。数组会按从小到大排序,
最后一个 $fd 作为新的 start_fd 再次尝试获取,调用失败返回 false
denyRequest()
denyRequest(integer
$worker_id) : boolean|void
denyRequest id 号为 $worker_id 的 worker 进程不再接收新的请求
Parameters
$worker_id
指定worker 进程 id
boolean|void
& 失败返回 false
sendMessage()
sendMessage(string
$msg, integer
$work_id) : boolean
向任意 worker 进程或着 tasker 进程发送消息。不能在主进程和管理进程中使用,收到消息的进程会触发 onPipeMessage 事件
Parameters
要发送的消息内容
目标进程 id,范围是0 ~ (worker_num + task_worker_num - 1)
& 成功返回 true,失败返回 false
addProcess()
addProcess() : integer|false
addProcess
添加一个用户自定义的工作进程
integer|false
& 成功返回该工作进程的 worker id,失败返回false
stats() : array
stats 统计当前server 活动tcp 的连接数/启动时间/接受、关闭次数等信息
& 返回 server 的统计信息,示例如下:
[start_time] =&
[connection_num] =& 1
[accept_count] =& 1
[close_count] =& 0
[tasking_num] =& 0
[request_count] =& 0
[worker_request_count] =& 0
getSocket()
getSocket(integer
$port) : resource
getSocket 获取监听套接字的socket句柄
此方法需要依赖PHP的sockets扩展,并且编译swoole时需要开启--enable-sockets选项
Parameters
[optional] 指定端口,不填表示不指定,则取第一个监听的套接字
& 返回 sockets 资源句柄
bind(integer
$fd, integer
$uid) : boolean
bind 将连接 $fd 绑定到用户自定义$uid,设置 dispatch_mode=5,设置此 $uid 值进行 hash 固定分配,
可以保证某一个 $uid 的连接全部会分配到同一个Worker进程。
在默认的dispatch_mode=2设置下,server会按照socket fd来分配连接数据到不同的worker。
因为fd是不稳定的,一个客户端断开后重新连接,fd会发生改变。这样这个客户端的数据就会被分配到别的Worker。
使用bind之后就可以按照用户定义的ID进行分配。即使断线重连,相同uid的TCP连接数据会被分配相同的Worker进程。
Parameters
要连接的文件描述符
用户自定义的 UID
& 成功返回 true,失败返回 false
Documentation is powered by
and authored
on August 14th, 2017 at 08:52.利用Swoole实现PHP+websocket 聊天室 - 简书
利用Swoole实现PHP+websocket 聊天室
Websocket只是一个网络通信协议
就像 http、ftp等都是网络通信的协议;不要多想;
相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议;
WebSocket和HTTP的关系
WebSocket和HTTP的关系
websocket+http.png
有交集,但是并不是全部。
Websocket只是借用了HTTP的一部分协议来完成一次握手。(HTTP的三次握手,此处只完成一次)
http和websocket 请求头对比:
http请求头.jpg
websocket请求头.png
原来的时候,客户端通过http(骑马)带着信请求服务器,服务器处理请求(写回信),再次通过http(骑马)返回;链接断开;
WebSocket:
客户端通过http(骑马)带着信请求服务器,但同时,携带了Upgrade:websocket和Connection:Upgrade(两根管子),服务器如果支持WebSocket协议(有两根管子的接口),使用Websocket协议返回可用信息(丢弃马匹),此后信息的传递,均使用这两个管子,除非有一方人为的将管子切断;若服务器不支持,客户端请求链接失败,返回错误信息;
http和websocket 响应头对比:
http响应头.jpg
websocket响应头.jpg
websocket和ajax轮询、long poll的区别
首先是 ajax轮询 ,ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息
场景再现:
客户端:啦啦啦,有没有新信息(Request)
服务端:没有(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:没有。。(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:好啦好啦,有啦给你。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:。。。没。。。。没。。没有
long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不在论述;
从上面可以看出,轮询其实就是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。同时,http的每一次请求与响应结束后,服务器将客户端信息全部丢弃,下次请求,必须携带身份信息(cookie),无状态性;
Websocket的出现,干净利落的解决了这些问题;
所以上面的情景可以做如下修改。
客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
客户端:balab开始斗图alabala
服务端:苍井空ala
客户端:流鼻血了,我擦……
服务端:哈哈布尔教育牛逼啊哈哈哈哈
服务端:笑死我了哈哈
但是,为了用PHP配合HTML5完成一次WebSocket请求和响应,哥走过千山万水,在密林深处,发现了Swoole : ;
PHP语言的异步、并行、高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。
支持的服务:
HttpServer
WebSocket Server
TCP Server
TCP Client
Async-IO(异步)
Task(定时任务)
环境依赖:
仅支持Linux,FreeBSD,MacOS,3类操作系统
Linux内核版本2.3.32以上
PHP5.3.10以上版本
gcc4.4以上版本或者clang
cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmake
必须保证系统中有以下这些软件:
php-5.3.10 或更高版本
gcc-4.4 或更高版本
Swoole是作为PHP扩展来运行的
安装(root权限):
./configure
sudo make install
配置php.ini
extension=swoole.so
想研究Swoole的同学,自己去看手册(虽然写的不好,但是还是能看懂的)
做一个聊天室
服务器端:socket.php
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);
$ws-&user_c = [];
//给ws对象添加属性user_c,值为空数组;
//监听WebSocket连接打开事件
$ws-&on('open', function ($ws, $request) {
$ws-&user_c[] = $request-&
//$ws-&push($request-&fd, "hello, welcome\n");
//监听WebSocket消息事件
$ws-&on('message', function ($ws, $frame) {
'from'.$frame-&fd.":{$frame-&data}\n";
foreach($ws-&user_c as $v){
$ws-&push($v,$msg);
// $ws-&push($frame-&fd, "server: {$frame-&data}");
// $ws-&push($frame-&fd, "server: {$frame-&data}");
//监听WebSocket连接关闭事件
$ws-&on('close', function ($ws, $fd) {
//删除已断开的客户端
unset($ws-&user_c[$fd-1]);
$ws-&start();
客户端:Socket.html
&!DOCTYPE html&
&html lang="en"&
&meta charset="UTF-8"&
&title&Title&/title&
&div id="msg"&&/div&
&input type="text" id="text"&
&input type="submit" value="发送数据" onclick="song()"&
var msg = document.getElementById("msg");
var wsServer = 'ws://192.168.1.253:9502';
//调用websocket对象建立连接:
//参数:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen监听连接打开
websocket.onopen = function (evt) {
//websocket.readyState 属性:
CONNECTING
The connection is not yet open.
The connection is open and ready to communicate.
The connection is in the process of closing.
The connection is closed or couldn't be opened.
msg.innerHTML = websocket.readyS
function song(){
var text = document.getElementById('text').
document.getElementById('text').value = '';
//向服务器发送数据
websocket.send(text);
//监听连接关闭
websocket.onclose = function (evt) {
console.log("Disconnected");
//onmessage 监听服务器数据推送
websocket.onmessage = function (evt) {
msg.innerHTML += evt.data +'&br&';
console.log('Retrieved data from server: ' + evt.data);
//监听连接错误信息
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
websocket API 手册:
PHP开发者,全栈工程师;微信公众号xilinglaoshi
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
WebSocket 协议 此文仅作为 RFC6455 的学习笔记。篇幅太长超过了简书的单篇最大长度,故分为两篇,此篇记录 1~4 节,其余见 WebSocket 协议 5~10 节; 1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用...
WebSocket简介 谈到Web实时推送,就不得不说WebSocket。在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上...
作者介绍:史燕飞(英文名:Jeri),16年毕业于武汉大学并加入腾讯。目前在腾讯云从事前端开发工作,喜欢研究前端相关技术(如:计算机网络、WebKit内核、React等),也喜欢关注数据挖掘及机器学习等前沿科技。版权归原作者所有,未经作者同意,请勿转载文章来源:腾讯云技术社...
Websocket只是一个网络通信协议就像 http、ftp等都是网络通信的协议;不要多想;相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议; WebSocket和HTTP的关系 WebSocket和HTTP的关系 有交集,但是并不是全部。W...
傅斯年鄙视钱穆。钱的《国史大纲》新鲜出炉,洛阳纸贵,好事者问傅对该书怎么看。 “不看。” 我想这才是对本片应该有的态度。 但是很遗憾,出于种种私人原因,我还是在一个热天下午引颈就戮。 电影院不错,靠背倾斜的角度正合我意。旁边一位抖腿狂魔,频率大概200赫兹。前面小伙的头发一...
无针吸脂的适应症非常广泛,不论男女,不论年龄有多大,都是可以用无针吸脂来解决哪些肉肉呢,而且怀孕了也不影响使用,更何况是已经生完宝宝了的呢?
一般而言,生完宝宝以后,腰腹部的赘肉会增多,而且肚皮会很松,还会产生妊娠纹,这个时候不要惊慌,无针吸脂还是很适合一些产后...
7月21日咖啡冥想 1、家里最近修窑洞,是小姐夫、三哥、老公三个人干活,大姐昨天回去做饭,大哥也送来西瓜,老公昨晚给我说家人齐心协力,很感动,看到大家庭和谐是无比荣幸。今天我请假和老公回去,我负责做饭。 一早买好东西回到家,三哥在厨房炒菜,说是剩最后一道菜,好感动,因为除了...
*因缘际会 今天在永澄哥的朋友圈里看到有趣的玩法,但是想要进群得先说出你的“优势”。我觉得,在犯错的时候,内心有个“我”变身为美图秀秀,PS后的美肌,遮瑕成功;夸自己的时候,内心有个“我”,变身要挑战冰桶,一桶接一桶泼冷水。于是,我冒出个想法,何不学习第二期我一定能某些伙伴...
你今年不到三十,你可能经常回想自己曾经所谓的辉煌,每每想起,依然不失自信。你或许庆幸自己在铺天盖地的压力袭来之前已小有成就,工作几年虽然没车没房但也有几万块存款;或者你先开上了一台车子,十来万三厢合资车,也可以,每个月还着两三千的贷款,也或者付了首付买了一套房,还不错,最起...}

我要回帖

更多关于 swoole websocket 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信