搜索
首页后端开发php教程PHP之微服务协程框架Swoft
PHP之微服务协程框架SwoftJun 17, 2020 pm 05:17 PM
php应用

PHP之微服务协程框架Swoft

简介

  有了swoole这样强大的扩展之后,越来越多的框架都是基于swoole被开发出来,Swoft就是其中一款不错的PHP框架。Swoft 是一款基于 Swoole 原生协程的注解式框架,自带常驻内存以及 Swoole 其它功能的封装。swoft中内置了协程客户端。同时swoft里面有了很多新的概念,比如Aop等。

  官网地址:https://www.swoft.org/

 使用Swoft框架注意事项

  因为Swoft是基于Swoole,所以和普通的PHP框架还是很不一样的,有些是需要注意的。

  1.不要再代码中执行sleep()以及其他睡眠函数,这样会导致整个进程阻塞。

  2.不要使用exit/die函数,这样会导致worker进程直接退出。

  3.进程隔离需要注意的,当修改了全局变量的值,会不生效,因为全局变量在不同的进程中,内存空间是隔离的。使用Swoft框架需要了解进程隔离问题。不同的进程中PHP变量不是共享,即便是全局变量。如果不同的进程需要共享数据,可以使用Redis,Mysql,消息队列,文件,Swoole/Table,APCu(php自带的缓存扩展),shmget(进程通信(IPC)共享内存)等工具。同时不同进程的文件句柄也是隔离的,所以在A进程创建的Socker连接打开的文件在B进程内是无效的。

  4.进程克隆,当server启动时候,主进程会克隆当前进程状态,此后开始进程内的数据互相独立,互不影响。

  5.不要再控制器写基类来写公共的变量,这样会造成数据污染,当下一个请求进来依然会请求到这个变量,因为常驻内存并且单利所以不会释放掉。

   官方文档也有提示

https://www.swoft.org/documents/v2/dev-guide/dev-note/

Swoft框架安装

   安装环境要求:

    1. gcc版本大于等于4.8。

    2. PHP版本大于7.1。

    3. Composer包管理工具。

    4. 安装Redis异步客户端hiredis,在最新版本的Swoole4.2.6之后已经内置了,不需要安装。

    5. Swoole扩展,这个是必须的。

    6.链接迭代器依赖库pcre。

    7. Swoole需要开启协程和异步redis。

  安装

git clone https://github.com/swoft-cloud/swoft
cd swoft
composer install
cp .env.example .env   #编辑 .env 文件,根据需要调整相关环境配置

 如果出现下面错误说明redis扩展没有,因为swoft需要redis扩展。

当然使用docker方式会更加简单,执行下面命令

docker run -p 18306:18306 --name swoft swoft/swoft

 在浏览器中输入 http://127.0.0.1:18306 就可以打开Swoft本地页面。

 关闭和开启运行命令 docker start/stop swoft

Swoft目录及文件说明

进入容器查看swoft目录

复制代码
root@880c142615c3:/var/www/swoft# tree -L 2
.
|-- CONTRIBUTING.md
|-- Dockerfile
|-- LICENSE
|-- README.md
|-- README.zh-CN.md
|-- app                        #应用目录
|   |-- Annotation        #定义注解相关目录|   |-- Application.php
|   |-- Aspect
|   |-- AutoLoader.php
|   |-- Common
|   |-- Console
|   |-- Exception
|   |-- Helper          #助手函数目录
|   |-- Http
|   |-- Listener         #事件监听器目录|   |-- Migration
|   |-- Model           #模型、逻辑等代码目录|   |-- Process
|   |-- Rpc            #RPC服务代码目录|   |-- Task            #任务投递管理目录,这里可以做异步任务或者定时器的工作
|   |-- Tcp
|   |-- Validator
|   |-- WebSocket         #WebSocket服务代码目录|   `-- bean.php
|-- bin
|   |-- bootstrap.php
|   `-- swoft            #Swoft入口文件|-- composer.cn.json
|-- composer.json
|-- composer.lock
|-- config
|   |-- base.php
|   |-- db.php
|   `-- dev
|-- database
|   |-- AutoLoader.php
|   `-- Migration
|-- dev.composer.json
|-- docker-compose.yml
|-- phpstan.neon.dist
|-- phpunit.xml
|-- public
|   |-- favicon.ico
|   `-- image
|-- resource                   #应用资源目录|   |-- language
|   `-- views
|-- runtime             #临时文件目录(日志、上传文件、文件缓存等)|   |-- logs
|   |-- sessions
|   |-- swoft.command
|   `-- swoft.pid
|-- test              #单元测试目录   
|   |-- apitest
|   |-- bootstrap.php
|   |-- run.php
|   |-- testing
|   `-- unit
`-- vendor
    |-- autoload.php
    |-- bin
    |-- composer
    |-- doctrine
    |-- monolog
    |-- myclabs
    |-- nikic
    |-- phar-io
    |-- php-di
    |-- phpdocumentor
    |-- phpoption
    |-- phpspec
    |-- phpunit
    |-- psr
    |-- sebastian
    |-- swoft
    |-- symfony
    |-- text
    |-- theseer
    |-- toolkit
    |-- vlucas
    `-- webmozart
复制代码

SwoftBean容器

   Bean容器是Swoft的核心,每一个Bean就是一个类对象的实例,容器就是一个工厂来存放和管理Bean。在HttpServer启动时候会扫描带有@Bean注解的类。传统的PHP是没有常驻内存的,每次请求都会重新初始化各种资源,每个对象也要重新实例化去申请内存,处理完请求后又被消耗,十分浪费资源。而Swoft在HttpServer启动后会将这些对象实例化并存放在内存中,下次请求就直接取出使用,减少对象创建资源的消耗。

    Bean容器底层是一个BeanFactory管理容器(Container)。

Swoft注解(Annotations)机制

注解是Swoft里面很多重要功能特别是AOP,IoC容器的基础。熟悉Java的朋友应该更加了解注解。 

那么注解是什么样呢?下面是Swoft的一部分代码在类、方法或成员变量上方的注释部分就有注解。

复制代码
namespace App\Tcp\Controller;

use App\Tcp\Middleware\DemoMiddleware;
use Swoft\Tcp\Server\Annotation\Mapping\TcpController;
use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping;
use Swoft\Tcp\Server\Request;
use Swoft\Tcp\Server\Response;
use function strrev;

/**
 * Class DemoController
 *
 * @TcpController(middlewares={DemoMiddleware::class})      #这个就是注解
 */
class DemoController
{
    /**
     * @TcpMapping("list", root=true)
     * @param Response $response
     */
    public function list(Response $response): void
    {
        $response->setData('[list]allow command: list, echo, demo.echo');
    }
复制代码

   注解是什么呢?有什么作用呢?

    注解其实是通过反射把注释当成代码的一部分,PHP可以通过ReflectionClass来获取一个类的信息,从而了解类里的信息,比如获取类中的所有方法、成员变量,并包括私有方法等,并根据这些信息实现一些操作。像很多PHP框架,比如laravel框架就利用PHP的反射机制来实现依赖注入。

    其实注解是配置的另一种方式,这里注解就可以起到一个配置作用。比如定义路由,定义配置定时任务,权限控制等。

    在Swoft中要是使用注解,需引入相关注解(Annotation)类,且必须以 /** 开始并以 */ 结束,否则会导致无法解析!

Aop切面编程

  Aop介绍

    1. Aspect(切面):通常是一个类,里面可以定义切入点和通知。

    2. JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用。

    3. Advice(通知):Aop在特定的切入点执行的增强处理,有before,after,afterReturning,afterThrowing,around。

    4. Pointcut(切入点):就是嗲有通知的连接点,在程序中主要体现为书写切入点表达式。

        Swoft新版的Aop设计建立在PHP Parser上面。

    PHP-Parser的项目主页是:https://github.com/nikic/PHP-Parser

            推荐教程:《php教程

以上是PHP之微服务协程框架Swoft的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:php100。如有侵权,请联系admin@php.cn删除
PHP应用:使用当前日期作为文件名PHP应用:使用当前日期作为文件名Jun 20, 2023 am 09:33 AM

在PHP应用中,我们有时需要使用当前日期作为文件名来保存或上传文件。虽然可以手动输入日期,但使用当前日期作为文件名可以更方便、快捷和准确。在PHP中,我们可以使用date()函数来获取当前日期。该函数的使用方法为:date(format,timestamp);其中,format为日期格式字符串,timestamp为表示日期和时间的时间戳,不传递该参数将使用

教程:使用Firebase Cloud Messaging在PHP应用中实现定时消息推送功能教程:使用Firebase Cloud Messaging在PHP应用中实现定时消息推送功能Jul 25, 2023 am 11:21 AM

教程:使用FirebaseCloudMessaging在PHP应用中实现定时消息推送功能概述FirebaseCloudMessaging(FCM)是谷歌提供的一种免费的消息推送服务,它能够帮助开发者向Android、iOS和Web应用发送实时消息。本教程将带领大家通过PHP应用使用FCM实现定时消息推送功能。步骤一:创建Firebase项目首先,在F

PHP中的泛型编程及其应用PHP中的泛型编程及其应用Jun 22, 2023 pm 08:07 PM

一、什么是泛型编程泛型编程是指在编程语言中实现一种通用的数据类型,使得这种数据类型能够适用于不同的数据类型,从而实现代码的复用和高效。PHP是一种动态类型语言,不像C++、Java等语言有强类型机制,因此在PHP中实现泛型编程不是一件容易的事情。二、PHP中的泛型编程方式PHP中有两种方式实现泛型编程:分别是使用接口和使用Trait。使用接口在PHP中创建一

Redis在PHP应用中的正则表达式操作Redis在PHP应用中的正则表达式操作May 16, 2023 pm 05:31 PM

Redis是一个高性能的key-value存储系统,它支持多种数据结构,其中包括字符串、哈希表、列表、集合、有序集合等。同时,Redis也支持对字符串数据进行正则表达式的匹配和替换操作,这使得它在开发PHP应用中具有很大的灵活性和便捷性。在PHP应用中使用Redis进行正则表达式操作,需要先安装好phpredis扩展,该扩展提供了与Redis服务器进行通信的

Redis在PHP应用中的操作日志Redis在PHP应用中的操作日志May 15, 2023 pm 08:10 PM

Redis在PHP应用中的操作日志在PHP应用中,使用Redis作为缓存或存储数据的方案已经变得越来越普遍了。Redis是一种高性能的键值存储数据库,具有快速、可扩展、高可用、数据结构多样等特点。在使用Redis时,为了更好地了解应用程序的运行情况,同时为了数据的安全性,我们需要有一份Redis操作日志。Redis操作日志能够记录Redis服务器上所有客户端

Redis在PHP应用中的全文搜索Redis在PHP应用中的全文搜索May 19, 2023 am 08:01 AM

随着互联网技术的不断发展,搜索引擎的应用越来越广泛。在互联网的背景下,搜索引擎已成为用户获取信息的主要途径之一。而在此过程中,全文搜索技术起到了至关重要的作用。全文搜索通过对文本内容的建立索引,在用户查询时快速定位到匹配的文本。在PHP应用中实现全文搜索,有很多的方案,而本文将重点介绍Redis在PHP应用中的全文搜索。Redis是一个高性能的非关系型内存

Redis在PHP应用中的Bitmap操作Redis在PHP应用中的Bitmap操作May 19, 2023 am 08:10 AM

在Web开发领域,Redis是一个非常流行的键值存储数据库,而PHP是一种广泛使用的Web编程语言。Redis提供了许多功能,其中一个非常有用的功能是Bitmap操作。Bitmap是Redis中的一种数据结构,它可以轻松地实现各种位图操作。本文旨在介绍Redis中的Bitmap操作,并演示如何在PHP中使用这些操作。什么是Bitmap?Bitmap是一种数据

如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音Jul 24, 2023 pm 06:33 PM

如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音引言:在移动应用开发中,消息推送是必不可少的功能之一。极光推送作为目前较为常用的推送平台之一,提供了丰富的功能来满足开发者的需求。本文将介绍如何使用极光推送扩展,在PHP应用中实现自定义消息推送样式和声音的功能。一、了解极光推送扩展极光推送扩展(JPush)是一款基于PHP语言开发的推送SDK,

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版