Rumah pembangunan bahagian belakang tutorial php PHP之微服务协程框架Swoft

PHP之微服务协程框架Swoft

Jun 17, 2020 pm 05:17 PM
aplikasi 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 文件,根据需要调整相关环境配置
Salin selepas log masuk

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

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

docker run -p 18306:18306 --name swoft swoft/swoft
Salin selepas log masuk

在浏览器中输入 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
Salin selepas log masuk
复制代码

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');
    }
Salin selepas log masuk
复制代码

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

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

Atas ialah kandungan terperinci PHP之微服务协程框架Swoft. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Aplikasi PHP: gunakan tarikh semasa sebagai nama fail Aplikasi PHP: gunakan tarikh semasa sebagai nama fail Jun 20, 2023 am 09:33 AM

Dalam aplikasi PHP, kadangkala kita perlu menyimpan atau memuat naik fail menggunakan tarikh semasa sebagai nama fail. Walaupun boleh memasukkan tarikh secara manual, ia adalah lebih mudah, lebih cepat dan lebih tepat untuk menggunakan tarikh semasa sebagai nama fail. Dalam PHP, kita boleh menggunakan fungsi date() untuk mendapatkan tarikh semasa. Kaedah penggunaan fungsi ini ialah: tarikh(format, cap masa); di mana format ialah rentetan format tarikh, dan cap masa ialah cap masa yang mewakili tarikh dan masa Jika parameter ini tidak diluluskan, ia akan digunakan

Tutorial: Gunakan Pemesejan Awan Firebase untuk melaksanakan fungsi tolak mesej berjadual dalam aplikasi PHP Tutorial: Gunakan Pemesejan Awan Firebase untuk melaksanakan fungsi tolak mesej berjadual dalam aplikasi PHP Jul 25, 2023 am 11:21 AM

Tutorial: Menggunakan Pemesejan Awan Firebase untuk melaksanakan fungsi tolak mesej berjadual dalam aplikasi PHP Gambaran Keseluruhan Pemesejan Awan Firebase (FCM) ialah perkhidmatan tolakan mesej percuma yang disediakan oleh Google, yang boleh membantu pembangun menghantar mesej masa nyata ke aplikasi Android, iOS dan Web. Tutorial ini akan membawa anda menggunakan FCM untuk melaksanakan fungsi tolak mesej berjadual melalui aplikasi PHP. Langkah 1: Buat projek Firebase Pertama, dalam F

Pengaturcaraan generik dalam PHP dan aplikasinya Pengaturcaraan generik dalam PHP dan aplikasinya Jun 22, 2023 pm 08:07 PM

1. Apakah pengaturcaraan generik? Pengaturcaraan generik merujuk kepada pelaksanaan jenis data biasa dalam bahasa pengaturcaraan supaya jenis data ini boleh digunakan pada jenis data yang berbeza, dengan itu mencapai penggunaan semula dan kecekapan kod. PHP ialah bahasa yang ditaip secara dinamik Ia tidak mempunyai mekanisme jenis yang kuat seperti C++, Java dan bahasa lain, jadi ia tidak mudah untuk melaksanakan pengaturcaraan generik dalam PHP. 2. Pengaturcaraan generik dalam PHP Terdapat dua cara untuk melaksanakan pengaturcaraan generik dalam PHP: menggunakan antara muka dan menggunakan ciri. Buat antara muka dalam PHP menggunakan antara muka

Operasi ungkapan biasa Redis dalam aplikasi PHP Operasi ungkapan biasa Redis dalam aplikasi PHP May 16, 2023 pm 05:31 PM

Redis ialah sistem storan nilai kunci berprestasi tinggi yang menyokong pelbagai struktur data, termasuk rentetan, jadual cincang, senarai, set, set tersusun, dsb. Pada masa yang sama, Redis juga menyokong padanan ungkapan biasa dan operasi penggantian pada data rentetan, yang menjadikannya sangat fleksibel dan mudah dalam membangunkan aplikasi PHP. Untuk menggunakan Redis untuk operasi ungkapan biasa dalam aplikasi PHP, anda perlu memasang sambungan phpredis terlebih dahulu. Sambungan ini menyediakan cara untuk berkomunikasi dengan pelayan Redis.

Tutorial: Gunakan sambungan Baidu Push untuk melaksanakan fungsi push mesej dalam aplikasi PHP Tutorial: Gunakan sambungan Baidu Push untuk melaksanakan fungsi push mesej dalam aplikasi PHP Jul 26, 2023 am 09:25 AM

Tutorial: Gunakan sambungan Baidu Cloud Push (BaiduPush) untuk melaksanakan fungsi push mesej dalam aplikasi PHP Pengenalan: Dengan perkembangan pesat aplikasi mudah alih, fungsi push mesej menjadi semakin penting dalam aplikasi. Untuk merealisasikan pemberitahuan segera dan fungsi tolak mesej, Baidu menyediakan perkhidmatan tolak awan yang berkuasa, iaitu Baidu Cloud Push (BaiduPush). Dalam tutorial ini, kami akan mempelajari cara menggunakan Sambungan Tekan Awan Baidu (PHPSDK) untuk melaksanakan fungsi tolak mesej dalam aplikasi PHP. Kami akan menggunakan Baidu Cloud

Kaedah pengesahan tandatangan dan aplikasinya dalam PHP Kaedah pengesahan tandatangan dan aplikasinya dalam PHP Aug 06, 2023 pm 07:05 PM

Kaedah dan Aplikasi Pengesahan Tandatangan dalam PHP Dengan perkembangan Internet, keselamatan aplikasi Web menjadi semakin penting. Pengesahan tandatangan ialah mekanisme keselamatan biasa yang digunakan untuk mengesahkan kesahihan permintaan dan menghalang akses tanpa kebenaran. Artikel ini akan memperkenalkan kaedah pengesahan tandatangan dan aplikasinya dalam PHP, dan memberikan contoh kod. 1. Apakah pengesahan tandatangan? Pengesahan tandatangan ialah mekanisme pengesahan berdasarkan kunci dan algoritma Parameter permintaan disulitkan untuk menghasilkan nilai tandatangan yang unik Pelayan kemudiannya menyahsulit permintaan dan mengesahkan tandatangan menggunakan algoritma dan kunci yang sama.

Log operasi Redis dalam aplikasi PHP Log operasi Redis dalam aplikasi PHP May 15, 2023 pm 08:10 PM

Log operasi Redis dalam aplikasi PHP Dalam aplikasi PHP, ia telah menjadi lebih dan lebih biasa untuk menggunakan Redis sebagai penyelesaian untuk caching atau menyimpan data. Redis ialah pangkalan data storan nilai kunci berprestasi tinggi yang pantas, berskala, sangat tersedia dan mempunyai struktur data yang pelbagai. Apabila menggunakan Redis, untuk lebih memahami pengendalian aplikasi dan untuk keselamatan data, kita perlu mempunyai log operasi Redis. Log operasi Redis boleh merekodkan semua pelanggan pada pelayan Redis

Carian teks penuh Redis dalam aplikasi PHP Carian teks penuh Redis dalam aplikasi PHP May 19, 2023 am 08:01 AM

Dengan perkembangan teknologi Internet yang berterusan, aplikasi enjin carian semakin meluas. Dalam konteks Internet, enjin carian telah menjadi salah satu cara utama untuk pengguna mendapatkan maklumat. Dalam proses ini, teknologi carian teks penuh memainkan peranan yang penting. Carian teks penuh mengindeks kandungan teks untuk mencari teks yang sepadan dengan cepat apabila pengguna bertanya. Terdapat banyak penyelesaian untuk melaksanakan carian teks penuh dalam aplikasi PHP, dan artikel ini akan menumpukan pada carian teks penuh Redis dalam aplikasi PHP. Redis ialah memori bukan hubungan berprestasi tinggi

See all articles