0

0

PHP Swoole 基本使用

Guanhui

Guanhui

发布时间:2020-05-06 09:38:15

|

3656人浏览过

|

来源于CSDN

转载

背景

项目中使用的PHP,但由于长耗时的任务,前端提交以后,需要服务端异步响应。

服务器异步有多种方案,包括MQ,fsocket,Swoole等。

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

最重要的是,完美支持PHP语言。于是使用Swoole搭建了一个异步服务器,提供异步响应,推送,定时任务等一系列工作。

立即学习PHP免费学习笔记(深入)”;

安装

Swoole是C语言编写,采用编译安装的方式。

安装依赖项有:

php-5.3.10 或更高版本

gcc-4.4 或更高版本

make

autoconf

pcre (centos系统可以执行命令:yum install pcre-devel)

eshop网上书店源码
eshop网上书店源码

适合初学的标准三层架构,采用ajax,页面布局div+css符合w3c,用vs自带的sqlserver,免配置sqlserver,使用方便,里面共有5个项目,点击最外层的.sln直接可运行。网站采用asp.net 用户角色配置(membership,UserRoles),用户角色、权限可在asp.net配置里修改,注册,登陆均采用asp.net登陆控件,网站根据用户角色自定义sitemap,基本上

下载

安装方式:

phpize #如果命令不存在 请在前面加上php的实际路径

./configure

make 

sudo make install

编译完成以后,需要在php.ini中添加扩展

extension=swoole.so

使用

服务端

class Server{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
 
            //'worker_num' => 1,  //一般设置为服务器CPU数的1-4倍
 
            'daemonize' => 1,  //以守护进程执行
            'max_request' => 10000,
            'task_worker_num' => 1,  //task进程的数量
 
            "task_ipc_mode " => 3 ,  //使用消息队列通信,并设置为争抢模式
            'open_length_check'    => true,
            'dispatch_mode'        => 1,
 
            'package_length_type'  => 'N',  //这个很关键,定位包头的
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
 
            'package_max_length'    => 2000000,  //协议最大长度
            "log_file" => "/tmp/swoole_test.log"  //日志
 
        ));
 
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Task', array($this, 'onTask'));
        $this->serv->on('Finish', array($this, 'onFinish'));
        $this->serv->start();
 
    }
 
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
 
        //放入任务队列,开始执行
        $task_id = $serv->task( $data );
 
    }
 
    public function onTask($serv,$task_id,$from_id, $data) {
      //做一些事情
 
    }

客户端

class Client{
 
    private $client, $ip, $port, $params;
 
    public function __construct($ip, $port, $params)
    {
 
        $this->ip = $ip;
        $this->port = $port;
        $this->params = $params;
 
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->set(array(
            'open_length_check'    => true,
            'package_length_type'  => 'N',
            'package_length_offset' => 0,      //第N个字节是包长度的值
            'package_body_offset'  => 4,      //第几个字节开始计算长度
            'package_max_length'    => 2000000,  //协议最大长度
 
        ));
 
        //设置事件回调函数
 
        $this->client->on('Connect', array($this, 'onConnect'));
        $this->client->on('Receive', array($this, 'onReceive'));
        $this->client->on('Close', array($this, 'onClose'));
        $this->client->on('Error', array($this, 'onError'));
 
        //发起网络连接
        $this->client->connect($ip, $port, 3);
    }
 
    public function onReceive( $cli, $data ) {
        echo "Received: " . $data . "\n";
 
    }
 
    public function onConnect($cli) {
 
        $data = pack('N', strlen($data)) . $data;
        $cli->send($data);
        $cli->close();
 
    }
 
    public function onClose( $cli)
    {
        echo "Connection close\n";
    }
 
    public function onError()
    {
        echo "Connect failed\n";
    }
 
}

注意问题

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N个字节是包长度的值
'package_body_offset'  => 4,      //第几个字节开始计算长度
'package_max_length'    => 2000000,  //协长度

这几个是定义帧定界的,因为Swoole的客户端和服务器端通信是TCP连接的,因此得给帧定界符,有多种帧定界方式,具体参考Swoole官方文档。这里其中是用头额外加长度的方式。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

3

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

30

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

2

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

8

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

3

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号