PHP 的异步并行和协程 C 扩展 Swoole

PHP 的异步并行和协程 C 扩展 Swoole

Apache2.0
C/C++ PHP
跨平台
2014-03-03
matyhtf

PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器异步TCP/UDP网络客户端异步MySQL异步Redis数据库连接池AsyncTask消息队列毫秒定时器异步文件读写异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端Http2.0服务器端

Swoole底层内置了异步非阻塞、多线程的网络IO服务器。PHP程序员仅需处理事件回调即可,无需关心底层。与Nginx/Tornado/Node.js等全异步的框架不同,Swoole既支持全异步,也支持同步。

除了异步IO的支持之外,Swoole为PHP多进程的模式设计了多个并发数据结构和IPC通信机制,可以大大简化多进程并发编程的工作。其中包括了并发原子计数器并发HashTableChannelLock进程间通信IPC等丰富的功能特性。

Swoole从2.0版本开始支持了内置协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。

Swoole可以广泛应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。

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

    Server

    $serv = new swoole_server("127.0.0.1", 9501);
    $serv->on('connect', function ($serv, $fd){
        echo "Client:Connect.\n";
    });
    $serv->on('receive', function ($serv, $fd, $from_id, $data) {
        $serv->send($fd, 'Swoole: '.$data);
        $serv->close($fd);
    });
    $serv->on('close', function ($serv, $fd) {
        echo "Client: Close.\n";
    });
    $serv->start();

    Client

    $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
    $client->on("connect", function($cli) {
        $cli->send("hello world\n");
    });
    $client->on("receive", function($cli, $data = ""){
        echo "Receive: ".$data.PHP_EOL;
    });
    $client->on("error", function($cli){
        echo "connect fail\n";
    });
    $client->on("close", function($cli){
        echo "connection close\n";
    });
    $client->connect('127.0.0.1', 9501, 0.5);

    Http服务器

    $serv = new swoole_http_server("127.0.0.1", 9502);
    
    $serv->on('Request', function($request, $response) {
        var_dump($request->get);
        var_dump($request->post);
    
        $response->cookie("User", "Swoole");
        $response->header("X-Server", "Swoole");
        $response->end("Hello Swoole!");
    });
    
    $serv->start();

    WebSocket服务器

    $serv = new swoole_websocket_server("127.0.0.1", 9502);
    
    $serv->on('Open', function($server, $req) {
        echo "connection open: ".$req->fd;
    });
    
    $serv->on('Message', function($server, $frame) {
        echo "message: ".$frame->data;
        $server->push($frame->fd, json_encode(["hello", "world"]));
    });
    
    $serv->on('Close', function($server, $fd) {
        echo "connection close: ".$fd;
    });
    
    $serv->start();
    的码云指数为
    超过 的项目
    加载中

    评论(13)

    久峰爱玩火

    引用来自“eechen”的评论

    很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP7网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发,项目实例可以是开发一个基于Web的即时通讯软件,高级部分还可以加入如何使用C开发PHP扩展。
    你这种想法好。但是怎么不考虑你去写。eechen不是php 大佬吗
    这波天秀
    这波天秀
    swoole都全协程化了,还async/await,逗我呢
    dosshell
    dosshell
    PHP缺乏async/await语法糖会导致使用#Swoole#陷入Callback Hell
    哈哈爱兮爱兮乎乎
    哈哈爱兮爱兮乎乎
    虽然不用php,还是支持
    宇润
    宇润
    只有swoole才可以救php!
    纯24K爷们儿
    纯24K爷们儿
    还是回归PHP7.2的好
    hell0cat
    hell0cat
    折腾了几天在FreeBSD上安装 swoole pecl还是源码编译都死活安装不上,放弃了,不知道是不是韩总不支持FreeBSD?#Swoole#
    eechen
    eechen
    很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP7网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发,项目实例可以是开发一个基于Web的即时通讯软件,高级部分还可以加入如何使用C开发PHP扩展。
    eechen
    eechen
    很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发, 项目实例可以是开发一个基于Web的即时通讯软件, 高级部分还可以加入如何使用C开发PHP扩展。
    Inhere
    Inhere
    好好好

    Swoole 2019 :化繁为简、破茧成蝶

    Swoole开源项目从2012年开始发布第一个版本,到现在已经有近7年的历史。在这七年的时间里: 提交了8821次代码变更 发布了287个版本 收到并解决1161次issue反馈 合并了603次pull request 共有...

    昨天 13:03

    Swoole 4.2.10 发布,BUG 修复版本

    增强 重构Coroutine\Http\Client,开发人员不再需要关心连接是否断开,除非网络异常(自动重新连接) 协程切换器添加了一些操作,因为PDO在IO请求时更改了全局BUG处理程序 支持使用内部C函数创...

    2018/12/21 09:48

    Swoole 4.1 发布,支持原生 Redis/PDO/MySQLi 协程化

    Swoole 4.1 发布了,更新如下: 重大新特性 支持 Redis/PDO/MySQLi 从4.1.0版本开始支持了对PHP原生Redis、PDO、MySQLi协程化的支持。 可使用Swoole\Runtime::enableCorotuine()将普通的同步...

    2018/09/06 13:36

    Swoole 4.1.0 发布,支持原生 Redis/PDO/MySQLi 协程化

    重大新特性 支持 Redis/PDO/MySQLi 从4.1.0版本开始支持了对PHP原生Redis、PDO、MySQLi协程化的支持。 可使用Swoole\Runtime::enableCorotuine()将普通的同步阻塞Redis、PDO、MySQLi操作变为...

    2018/08/31 21:52

    Swoole 4.0 正式版发布,面向生产环境的 PHP 协程引擎

    Swoole虽然在2016年就支持了协程特性,但由于底层是基于setjmp/longjmp实现的stackless方案。因此在某些场景下,如call_user_func、array_map、__destruct中无法使用协程。大型应用程序中逻辑...

    2018/06/14 17:52

    Swoole 2.1 正式版:协程+通道带来全新的 PHP 编程模式

    PHP 的异步、并行、高性能网络通信引擎 Swoole 已发布 2.1.0 版本。新版本提供了全新的短名 API,完整支持了协程(Coroutine)+通道(Channel)特性,为 PHP 语言带来了全新的编程模式。Swo...

    2018/02/09 16:38

    Swoole 1.10.0 发布,增加多项新特性

    PHP的异步、并行、高性能网络通信引擎 Swoole 已发布 1.10.0 版本。此版本增加了多项新特性。 自动 DNS 解析 新版本的异步客户端不再需要使用 swoole_async_dns_lookup 解析域名了,底层实现...

    2018/01/08 19:02

    没有更多内容

    加载失败,请刷新页面

    4
    回答
    既然韩天峰的Swoole4能实现了Golang的所有功能了,PHPer还有必要学Golang吗?

    既然韩天峰的Swoole4能实现了Golang的所有功能了,PHPer还有必要学Golang吗? 性能比较,Swoole和Golang性能也相差无几。 性...

    2018/12/04 10:54
    30
    回答
    【开源访谈】韩天峰:从 2.x 跃入 4.x ,Swoole 开发背后的故事

    6月14日,流行 PHP 协程引擎 Swoole 正式发布 4.0 版本,支持在 PHP 代码中的任意位置使用协程,并带来了全局变量隔离、支持 MySQL...

    2018/07/03 07:51
    7
    回答
    为什么基于 swoole 有那么多框架轮子,而不是提供一个好用的轮子?

    为什么基于 swoole 有那么多框架轮子,而不是提供一个好用的轮子?

    2018/06/22 10:22
    4
    回答
    swoole_process 多进程爬虫url去重和数据存储问题

    用swoole_process创建主进程,然后再开启多个子进程,从主进程首次爬取主页面,把爬取到的url过滤后平均分发给多个子进程,每个子进程去爬取收到的...

    2017/11/10 15:27
    2
    回答
    swoole,异步的PHP程序中可以使用Swoole\Http\Client作为WebSocket客户端?
    iGeek 的回答 2017/07/25 11:25
    最佳答案
    Server部分用PHP实现,Client部分没必要用PHP,有数据交互直接PHP内部就能解决,Client部分可以用HTML5实现。 websocket本身是长连接的协议,不用自己轮询。实现步骤PHP编写Server,前端页面js编写Client(相当于浏览器作为终端跟服务器连接)
    2
    回答
    swoole的httpserver中,怎么能够针对所有的$response->end()增加一个回调函数的操作呢?

    @matyhtf 你好,想跟你请教个问题: swoole的httpserver中,怎么能够针对所有的$response->end()增加一个回调函数的操作...

    2016/07/08 17:57
    2
    回答
    php swoole+amqp+rabbitmq整合多进程启动channel被locked问题

    运行环境:swoole 1.7.21 稳定版 ,mac os x 10.10 , php 5.5, rabbitmq3.5, amqp 1.6 <?php...

    2016/01/13 10:36
    4
    回答
    swoole_client网络问题不能实时触发onClose事件
    jocky_li 的回答 2016/09/16 13:22
    最佳答案
    引用来自“碳素云信息技术”的评论 有,建议你做状态监测,不能完全依靠swoole的连接 请问如何在swoole中监听呢?刚刚试了一下每秒定时器来获取连接状态,结果也是不行
    1
    回答
    swoole支持MongoDB异步吗?

    搜索了下官网,说要支持,又搜索了下源码,没发现

    2016/02/26 13:27

    没有更多内容

    加载失败,请刷新页面

    swoole tcp client/server-献给swoole初初初初初初学者们

    ## 环境 - PHP5.6.17 - Swoole 1.8.8-stable - Ubuntu 14.04 (use_namespace 需要开启命名空间) ## 学前提要 - Server 角色并不是一成不变的,当 Server 在请求数据时,实际上就是 Client,相...

    2016/08/29 17:45
    148
    1
    100行php代码实现加密端口转发

    如题,这个是100行php代码实现代理上网最终篇,玩具性质,个人用可以,因为1性能不高,2加解密IV重复使用。 用法就是socks5服务端和加密端口转发服务端运行在可自由上网的机器上,加密端口转...

    2016/05/17 18:14
    116
    2
    php异步高并发扩展 swoole-1.6.11 版发布

    简介: swoole是一个php版本的异步、高并发扩展,是国人被php官方pecl包收录的力作之一。 很高兴的通知大家,1.6.11版本发布了。 内核更新: - Disable by default async_mysql (默认关闭asy...

    2014/03/04 12:26
    49
    0
    thinkphp5.0框架swoole的使用

    PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器...

    2018/09/05 14:54
    228
    0
    centos7.5安装swoole扩展组件

    第一步: 下载解压swoole yum install unzip zip -y wget https://soft.itbulu.com/wdcp/swoole-src-swoole-1.7.21-stable.zip unzip swoole-src-swoole-1.7.21-stable.zip cd swoole-src-s...

    2018/11/02 13:31
    9
    0
    swoole入门教程01-环境搭建及扩展安装

    写在前面的废话 《swoole源码分析》已经写了13章,整个swoole的核心架构基本都分析的差不多了。于是心里一直以来想整理swoole的文档并写一份教程的想法就再度浮了出来。实话说,我接触swool...

    2015/09/24 21:15
    92
    0
    swoole入门教程02-Swoole的Task使用以及swoole_client

    第二章 Swoole的task使用以及swoole_client 环境说明: 系统:Ubuntu14.04 (安装教程包括CentOS6.5) PHP版本:PHP-5.5.10 swoole版本:1.7.6-stable 上一章已经简单介绍了如何写一个简单的...

    2015/09/24 21:15
    163
    0
    js + swoole 实现websocket

    js部分 <!DOCTYPE html> <html lang="en"> <head> <style> *{ margin:0px; padding:0px; } </style> </head> <body> <div style="margin-left:400px"> <d......

    2018/09/12 18:41
    32
    0
    Swoole 自定义项目初始化事件处理的实现

    最近使用基于 Swoole 开发的 imi 框架 开发项目,碰到一个需求,就是想要做项目初始化处理。当初始化处理完成前,不想让 Swoole 处理请求。因为可能有一些值没有加载进来,处理请求极有可能出...

    2018/09/13 14:38
    142
    0

    没有更多内容

    加载失败,请刷新页面

    返回顶部
    顶部