热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpwebmozart,PHP之微服务协程框架Swoft

简介有了swoole这样强大的扩展之后,越来越多的框架都是基于swoole被开发出来,Swoft就是其中一款不错的PHP框架。Swoft是一款基于Swo

cd3f763eb26ac4ffc9c1936d3c1119bd.png

简介

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

官方文档也有提示9bb03c1343c9cf36941c79e8cf93eb51.pnghttps://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扩展。5ed01333ec568f6e3ceb4712e8a1215f.png

当然使用docker方式会更加简单,执行下面命令docker run -p 18306:18306 --name swoft swoft/swoft681784c76c17f6eb430f70acc7e55d36.png

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

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

Swoft目录及文件说明

进入容器查看swoft目录0bfa2301005cabdd8901c38581e668a0-3.gifroot@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

`-- webmozart0bfa2301005cabdd8901c38581e668a0-3.gif

SwoftBean容器

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

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

Swoft注解(Annotations)机制

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

那么注解是什么样呢?下面是Swoft的一部分代码,在类、方法或成员变量上方的注释部分就有注解。0bfa2301005cabdd8901c38581e668a0-3.gifnamespace 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');

}0bfa2301005cabdd8901c38581e668a0-3.gif

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

注解其实是通过反射把注释当成代码的一部分,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教程》



推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
大大炮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有