威尼斯手机平台-电子正规官网登录首页

热门关键词: 威尼斯手机平台,威尼斯登录首页,威尼斯正规官网
企业和个人开发者均可免费使用Swoole的代码,更新内容如下
分类:热门贴子

增强

  • 支持发送带Content-length但无主体的HTTP响应给HEAD请求 (#2690) (@matyhtf)
  • 支持获取任意协程的父协程ID (#2669) (@huanghantao)

修复

  • 修复ProcessPoolgetProcess问题 (#2522) (@matyhtf)
  • 修复某些特殊情况下异常被忽略的问题(VM陷入了事件循环而没有机会检查异常) (@twose)
  • 修复定时器在进程fork后产生的内存泄漏 (8f3abee7) (@twose)
  • 修复非Linux系统编译时timezone的问题 (#2584) (@devnexen)
  • 修复enable_coroutinetask_enable_coroutine一开一关的问题 (#2585) (@matyhtf)
  • 修复Http2的trailer方法不输出值为空的头 (#2578) (@twose)
  • 修复CoHttpClient->setCookies在特殊情况下的内存错误 (#2644) (@Yurunsoft)
  • 修复#2639 (#2656) (@mabu233)
  • 修复arginfo_swoole_process_pool_getProcess (#2658) (@mabu233)
  • 修复static_handler不支持软链接 (@matyhtf)
  • 修复OSX下卡死 (22504dd4) (@matyhtf)
  • 修复启用SSLtask进程使用Server->getClientInfo出错 (#2639) (@matyhtf)
  • 修复多协程操作同一个Socket的非法操作BUG (#2661) (@twose)

进程模型

我们来使用实例进行分析:

<?php
$server = new swoole_server("0.0.0.0",9053);//tcp_server

$server->set([
    'daemonize' => false,//是否后台运行
    'log_file' => 'swoole.log',
    // 'worker_num' => 2,
]);

$server->on('connect', function ($serv, $fd){ 
    echo "client connect. fd is {$fd}n";
});

$server->on('receive', function ($serv, $fd, $from_id, $data){
    echo "client connect. fd is {$fd}n";
});

$server->on('close', function ($serv, $fd){
    echo "client close. fd is {$fd}n";
});

// 以下回调发生在Master进程
$server->on("start", function (swoole_server $server){
    echo "On master start.n";
});
$server->on('shutdown', function (swoole_server $server){
    echo "On master shutdown.n";
});

// 以下回调发生在Manager进程
$server->on('ManagerStart', function (swoole_server $server){
    echo "On manager start.n";
});
$server->on('ManagerStop', function (swoole_server $server){
    echo "On manager stop.n";
});

// 以下回调也发生在Worker进程
$server->on('WorkerStart', function (swoole_server $server, $worker_id){
    echo "Worker startn";
});
$server->on('WorkerStop', function(swoole_server $server, $worker_id){
    echo "Worker stopn";
});
$server->on('WorkerError', function(swoole_server $server, $worker_id, $worker_pid, $exit_code){
    echo "Worker errorn";
});

$server->start();

我们使用 pstree -ap PID查看swoole进程数:

[root@9355490fe5da /]# pstree -ap 235
php,235 tcp_server.php
|-php,236 tcp_server.php
|   |-php,239 tcp_server.php
|   `-php,240 tcp_server.php

发现有4个进程。按PID从小到大分别是 Master进程、Manager进程、Worker进程(2个)。

基于此,我们简单梳理一下,当执行的start方法之后,发生了什么:

  • 守护进程模式下,当前进程fork出Master进程,然后退出,Master进程触发OnMasterStart事件。
  • Master进程启动成功之后,fork出Manager进程,并触发OnManagerStart事件。
  • Manager进程启动成功时候,fork出Worker进程,并触发OnWorkerStart事件。

非守护进程模式下,则当前进程直接作为Master进程工作。

所以,一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程、Manager进程和Worker进程。

事实上,一个多进程模式下的Swoole Server中,有且只有一个Master进程;有且只有一个Manager进程;却可以有n个Worker进程。

Master进程 是一个多线程进程,其中有一组非常重要的线程,叫做Reactor线程(组)。

每当一个客户端连接上服务器的时候,都会由Master进程从已有的Reactor线程中,根据一定规则挑选一个,专门负责向这个客户端提供维持链接、处理网络IO与收发数据等服务。

Manager进程 ,某种意义上可以看做一个代理层。

它本身并不直接处理业务,其主要工作是将Master进程中收到的数据转交给Worker进程,或者将Worker进程中希望发给客户端的数据转交给Master进程进行发送。

Manager进程还负责监控Worker进程,如果Worker进程因为某些意外挂了,Manager进程会重新拉起新的Worker进程。

Worker进程 其实就是处理各种业务工作的进程,Manager将数据包转交给Worker进程,然后Worker进程进行具体的处理,并根据实际情况将结果反馈给客户端。

版本更新

  • 调试器功能 : 通过Swoole企业版后台PHP进程列表的按钮,动态开启/关闭某一个PHP进程的内存泄漏检测,性能分析和阻塞检测,可以导出请求的函数调用性能分析图、火焰图
  • 应用追踪功能:将应用追踪(trace)与性能分析数据和阻塞检测的数据做关联,可以互相跳转,方便多维度定位性能问题
  • 报警功能:增加磁盘/cpu/内存使用率的监控报警,当系统资源超过阈值自动发微信/短信报警

 Swoole 4.4 正式版已发布,该版本包含大量更新,详细信息如下:

HttpServer

swoole内置Http服务器的支持。swoole版的http server相对于php-fpm,最大优势在于高性能:代码一次载入内存,后续无需再解释执行。缺点是调试没有nginx+php-fpm方便。

使用swoole,通过几行代码即可写出一个异步非阻塞多进程的Http服务器:

<?php
$server = new swoole_http_server("0.0.0.0", 9051);
$server->set([
    'daemonize' => false,//是否后台运行
    'log_file' => 'swoole.log',
]);

$server->on('Start', function() {
    swoole_set_process_name("swoole_http_server");
    echo "Startn";
});

$server->on('Request', function($request, $response) {
    print_r($request->get);
    // print_r($request->post);
    // print_r($request->cookie);
    // print_r($request->files);
    // print_r($request->header);
    // print_r($request->server);

    $response->cookie("User", "Swoole");
    $response->header("X-Server", "Swoole");
    $response->end("<h1>Hello Swoole!</h1>");
});

$server->start();

swoole_http_server继承自swoole_server,是一个完整的http服务器实现。

注意:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理:

server {
    root /data/wwwroot/;
    server_name local.swoole.com;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-e $request_filename) {
            proxy_pass http://127.0.0.1:9501;
        }
    }
}

操作演示

实验性内容

  • 可能在5.0新增的CoServerCoHttpServer
  • CURL Hook(暂时不支持curl_multi

(文/开源中国)    

是什么?

  • Swoole是一个PHP扩展,使用纯C语言编写。
  • Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
  • Swoole支持AsyncTask,消息队列,毫秒定时器,异步文件读写等功能。
  • Swoole从2.0版本开始支持了内置协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。
  • Swoole可以广泛应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。

Swoole 4.4.1 发布了,更新内容如下:

内核

  • 持续的底层代码质量优化工作 (@swoole)
  • 更多的单元测试, 并使用了基于 webmozart/assert 二次开发而来的断言库 swoole/assert (@twose)
  • 补全内存申请失败检测 (b19bebac) (5a1ddad3) (@matyhtf)
  • 彻底废除Windows支持计划
  • 将协程的一些功能整理划分到SystemScheduler模块, 废除util模块
  • CoHttp2Client底层协程化 (f64874c3) (@matyhtf)
  • 底层全面缓存了开发者注册的函数信息, 调用回调时速度更快 (@twose)

WebSocketServer

swoole增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器。

<?php
$server = new swoole_websocket_server("0.0.0.0", 9052);

$server->on('Start', function (swoole_websocket_server $server) {
    swoole_set_process_name("swoole_websocket_server");
    echo "Server Start... n";
});

$server->on('WorkerStart', function (swoole_websocket_server $server, $worker_id){
    if ($server->worker_id == 0){
        swoole_timer_tick(2000, function ($timer_id) { //2000ms
            echo "tick-2000msn";
        });
    }
});

$server->on('Open', function (swoole_websocket_server $server, $request) {
    echo "server: handshake success with fd:{$request->fd}n";
});

$server->on('Message', function (swoole_websocket_server $server, $frame) {
    echo "receive from fd:{$frame->fd}:{$frame->data}n";
    $server->push($frame->fd, "Hello fd:{$frame->fd}, I'm Server.n");
});

$server->on('Close', function ($ser, $fd) {
    echo "client fd:{$fd} closedn";
});

$server->start();

企业版

Swoole Enterprise 作为 Swoole 官方出品的一整套企业级PHPSwoole分析调试工具,可免费使用但不开源。

  • 时刻掌握应用架构模型: 自动发现应用依赖拓扑结构和展示,时刻掌握应用的架构模型
  • 分布式跨应用链路追踪:支持无侵入的分布式跨应用链路追踪,让每个请求一目了然,全面支持协程/非协程环境,数据实时可视化
  • 全面分析报告服务状况:各种维度统计服务上报的调用信息, 比如总流量、平均耗时、超时率等,并全面分析报告服务状况
  • 拥有强大的调试工具链:系统支持远程调试,可远程开启检测内存泄漏、阻塞检测和代码性能分析
  • 完善的系统监控:支持完善的系统监控,零成本部署,监控机器的CPU、内存、网络、磁盘等资源,可以很方便的集成到现有报警系统
  • 零成本接入系统:Swoole Enterprise系统客户端脚本一键部署,服务端可在Docker环境中运行,简单快捷

协程调度器?

  • 新增SwooleCoroutineScheduler调度器类作为cli命令行脚本的入口,取代go() + SwooleEvent::wait()的方式
  • 增加SwooleCoroutineRun函数,提供对SwooleCoroutineScheduler的封装
  • go() + SwooleEvent::wait()的运行方式可能被废除

实例讲解

修复

  • 修复 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER,解决SSL下大数据包发送失败 (#2667) (@twose)
  • 修复信号监听功能的BUG (#2675) (@matyhtf)
  • 修复MySQL客户端向下不兼容的变化 (#2674) (@twose)
  • 修复在Server启动之后添加事件失败 (#2673) (@matyhtf)
  • 修复static_handler没有解码url,现已支持中文路径 (#2676) (@twose)
  • 修复task进程由于平滑退出造成的警告 (#2689) (@Yurunsoft)
  • 修复 HttpRequest->rawContent在协程Server下的问题 (#2682) (@twose)
  • 修复 Timer::clearAll的内存错误 (6b0263b) (@matyhtf)
  • 修复CoroutineHttpClient在高并发下发送大数据包失败的BUG (432259d) (@twose)

增强

  • 全新的协程MySQL客户端驱动, 底层全面协程化 (#2538) (@twose)

    • 底层使用C++和协程的编程模式(同步阻塞写法, 异步性能)
    • 支持SSL连接 (connect时配置 ['ssl' => true]即可, 暂不支持证书等配置)
    • 支持超大数据发送 (无上限, 底层自动拼包, 上限为MySQL服务器配置上限)
    • 支持超大数据接收
    • 支持fetch按行读取 (现在的fetch为按需读取, 未fetch的数据不会耗费用户内存) (#2106)
    • 支持nextResult按需读取 (同上)
    • 客户端close后, 客户端持有的statements自动转为不可用状态, 避免边界问题
    • 优化掉了一些不必要的内存拷贝(协议解析时)
    • date相关类型小数精度支持
    • 错误代码和信息与PDO/mysqli保持一致
  • CoRedis兼容模式, 通过$redis->set(['compatibility_mode' => true])开启, 可使得hmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore等方法返回结果和phpredis保持一致 (#2529) (@caohao-php)

  • 默认允许有100K个协程同时存在 (c69d320b) (@twose)
  • 支持bailout机制 (协程内发生致命错误时能正确退出进程) (#2579) (@twose)
  • Server发生错误时会根据情况展示友好的400/404/503界面而不是没有任何输出 (@matyhtf) (f3f2be9d)
  • Server默认开启异步安全重启特性和超大数据发送的自动协程调度功能 (#2555) (9d4a4c47) (@matyhtf)
  • ServeronFinish回调支持自动协程环境 (@twose)
  • Http客户端默认开启websocket_mask, 不再会出现莫名其妙连不上websocket的问题 (c02f4f85) (@twose)
  • 不再允许在协程外使用Channel的调度操作 (519b6043) (@twose)
  • WebSocket握手失败时切断连接 (#2510) (@twose)
  • Linux下父进程异常退出时底层会自动发送信号杀死子进程 (4b833a3d) (@matyhtf)
  • Socket->recv的数据长度不足时回收末尾无用的内存 (642a3552) (@twose)
  • 浮点数计算误差优化 (#2572) (@tangl163)
  • 所有内置类都 禁止克隆/禁止序列化/禁止删除底层定义的属性 (f9c974b8) (@twose)
  • Server->binduid超过UINT32_MAX时会产生警告并返回
  • 兼容PHP7.4 (#2506) (@twose)

WebSocket客户端

最简单的是使用JS编写:

<script>
    socket = new WebSocket('ws://192.168.99.100:9052/'); 
    socket.onopen = function(evt) { 
        // 发送一个初始化消息
        socket.send('I am the client and I'm listening!'); 
    }; 

    // 监听消息
    socket.onmessage = function(event) { 
        console.log('Received a message: ', event.data); 
        alert(event.data);
    }; 

    // 监听Socket的关闭
    socket.onclose = function(event) { 
        console.log('Socket has closed',event); 
    }; 

    socket.onerror = function(evt) { 
        console.log('onerror',event); 
    }; 
</script>

废弃警告

  • 将废弃Buffer模块,废弃原因:可替代性强,使用率低,可用PHP字符串、fopen("memory")代替。
  • 将废弃Lock模块,废弃原因:在协程模式下加锁可能存在问题,可使用chan实现协程版本的锁
  • 由于引入了stream_socket_pair协程化, 建议开启hook时, 如有单独配置需求, 请使用SWOOLE_HOOK_STREAM_FUNCTION常量而不是SWOOLE_HOOK_STREAM_SELECT

参考资料

  • 官网:https://www.swoole.com/

新特性

  • 新增Library, 使用纯PHP编写内核功能而非C/C++, 提供了以下功能

    • 新增高质量PHP模块CoroutineWaitGroup (@twose)
    • 使用PHP代码实现CURL的hook, 一键使CURL协程化, 目前为实验特性, 需特别调用Runtime::enableCoroutine(SWOOLE_HOOK_CURL)来开启 (@matyhtf) (@Yurunsoft)
    • 使用PHP代码实现exec/shell_exec的协程化 (#2657) (@Yurunsoft)
    • 开启RuntimeHook时, 将替换函数array_walkarray_walk_recursive为swoole实现的版本, 解决原生函数不可重入的问题, 但会造成无法遍历object (@matyhtf) (@twose)
  • 新增协程抢占式调度器, 可防止协程占用CPU时间过长导致其它协程饿死, 通过php.ini配置swoole.enable_preemptive_scheduler = On 开启, 相关例子详见preemptive_scheduler (@shiguangqi)

  • 新增Timer::list()返回TimerIterator, 可遍历所有定时器, TimerclearAll清除所有定时器, Timerinfo(int $id)获取定时器信息, Timer::stats()获取全局定时器状态 (#2498) (@twose)
  • 新增 CoSocket的两个方法getOption 和 setOption (9d13c29) (@matyhtf)
  • 新增 ProcessPool$master_pid 属性和 shutdown方法 (a1d6eaa) (@matyhtf)
  • 新增ProcessPool的构造方法的第四个参数, 为true时底层将自动在onWorkerStart回调开启协程 (8ceb32cd) (@matyhtf)
  • 新增stream_socket_pair协程化支持 (#2546) (@matyhtf)
  • 新增HttpServerstatic_handler_locations设置, 可以设定静态文件路径 (@matyhtf)
  • 新增CoHttpClient->setBasciAuth方法, 用于自动发送Authorization头 (#2542) (@hongbshi)
  • 新增 CoHttp2Client->ping方法 (40041f6) (@shiguangqi)
  • 新增hook_flags配置项,用于取代Runtime::enableCoroutine()函数调用

可以免费使用吗

Swoole是开源免费的自由软件,授权协议是Apache2.0。企业和个人开发者均可免费使用Swoole的代码,并且在Swoole之上所作的修改可用于商业产品,无需开源(注:必须保留原作者的版权声明)。

向下不兼容改动

  • PHP官方保持一致, 不再支持PHP7.0 (@matyhtf)
  • 移除Serialize模块, 在单独的 ext-serialize 扩展中维护. 废弃原因: 由于PHP内核频繁变更, 导致无法实现稳定可用的模块, 与php serialize相比没有太大差异化定位
  • 移除PostgreSQL模块,在单独的 ext-postgresql 扩展中维护. 废弃原因: PostgreSQL使用了异步回调方式实现协程调度, 不符合目前内核协程化的统一规划。另外PostgreSQL目前用户量非常低, 并且缺少必要的单元测试, 无法保证质量
  • Runtime::enableCoroutine不再会自动兼容协程内外环境, 一旦开启, 则一切阻塞操作必须在协程内调用 (@matyhtf)
  • 由于引入了全新的协程MySQL客户端驱动, 底层设计更加规范, 但有一些小的向下不兼容的变化

    • fetch/nextResult优化为按需读取, 会产生IO调度
    • 启动defer特性时, statement发出的的请求, 需要使用statement->recv接收
    • 启动defer/fetch_mode特性时, 如有未接收完的数据, 将无法发起新的请求
    • 与异步不同, connected属性不再会实时基于事件更新, 而是在IO操作失败后更新

简介

版本选择

建议使用的版本:

  • 稳定版:v1.9.23
  • 预览版:v2.0.12

1.9.x分支已进入特性锁定期,不再开发新功能,仅修复BUG。

建议使用的PHP版本:

  • 威尼斯正规官网,PHP5.5或更高版本
  • PHP7.0.13或更高版本

本文由威尼斯手机平台发布于热门贴子,转载请注明出处:企业和个人开发者均可免费使用Swoole的代码,更新内容如下

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文