Swoole

微服务框架TARS再添PHP

那年仲夏 提交于 2020-12-04 19:02:42
引言 TARS作为由Linux基金会的优秀RPC框架与服务部署运维解决方案,被阅文集团引入了实际实践中,同时阅文集团对TARS在PHP语言层面进行了能力的补全,令TARS如虎添翼。TARS-PHP的解决方案兼具简单高效、接口维护方便容易扩展、代码自动生成,以及集成寻址、服务发现、监控、上报等功能。经历了阅文集团线上业务的考验与洗礼,充分证明了该解决方案的优势。 “PHP是世界上最好的语言” 众所周知,在PHP诞生之初,就是WEB站点的开发而生。但是一直以来,都无法摆脱弱类型、脚本语言的性能之殇的帽子。随着互联网行业的不断发展,以及用户需求和基础架构的不断变化,PHP语言本身也一直在发展。无论是SWOOLE的出现,还是PHP7对性能的提升,都丰富和助力了PHP本身的应用。 相信大家在开发中也会发现,作为经常处在WEB中间层的PHP,其实有很多的痛点。既要接收前端的HTTP请求,又要调用各式各样的后台服务与存储服务,常常成为一个站点的性能瓶颈。其中HTTP协议的过分冗余以及上层封装带来的损耗,就是一个比较突出的问题。 开发者不但要应对使用同步的HTTP的调用库所带来的吞吐量的下降,还要忍受HTTP协议本身,以及JSON、XML协议在信息传输上的低效率。为了解决这一问题,一套在TCP协议层的,使用简单的二进制协议。才能保证业务用更少的传输带宽,承载更多的传输内容

swoole协程

末鹿安然 提交于 2020-12-04 06:12:30
swoole协程要点: 上下文换入换出 swoole协程使用boost.context进行上下文的换入换出,从而保存C栈和寄存器的执行数据 swoole在保存C栈的同时需要存储没有分配在C栈上的php上下文,在yield和resume时调用相应的回调函数保存恢复php的上下文 调度方式 使用reactor事件循环 同步I/O操作会开启进程或线程池处理,处理完成后通知reactor恢复对应的协程上下文 来源: oschina 链接: https://my.oschina.net/u/3687259/blog/3067378

Swoole 协程与 Go 协程的区别

对着背影说爱祢 提交于 2020-12-04 04:54:31
Swoole 协程与 Go 协程的区别 进程、线程、协程的概念 进程是什么? 进程就是应用程序的启动实例。 例如:打开一个软件,就是开启了一个进程。 进程拥有代码和打开的文件资源,数据资源,独立的内存空间。 线程是什么? 线程属于进程,是程序的执行者。 一个进程至少包含一个主线程,也可以有更多的子线程。 线程有两种调度策略,一是:分时调度,二是:抢占式调度。 协程是什么? 协程是轻量级线程, 协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。 协程是属于线程,协程是在线程里执行的。 协程的调度是用户手动切换的,所以又叫用户空间线程。 协程的调度策略是:协作式调度。 Swoole 协程 Swoole 的协程客户端必须在协程的上下文环境中使用。 // 第一种情况:Request 回调本身是协程环境 $server->on('Request', function($request, $response) { // 创建 Mysql 协程客户端 $mysql = new Swoole\Coroutine\MySQL(); $mysql->connect([]); $mysql->query(); }); // 第二种情况:WorkerStart 回调不是协程环境 $server->on('WorkerStart', function() { // 需要先声明一个协程环境

swoole中的php代码热更新

微笑、不失礼 提交于 2020-11-23 13:41:31
这里以ZPHP框架作为演示,实现swoole的代码热更新,在WorkerStart回调函数中,载入ZPHP框架: use ZPHPZPHP ; $zphp = null ; $mimes = null ; $http = new swoole_http_server( '0.0.0.0' , 9501 ); $http->on( 'request' , function (swoole_http_request $request, swoole_http_response $response) { //...... }); $http->on( 'WorkerStart' , function ($serv, $worker_id) { //框架载入 require __DIR__ . DIRECTORY_SEPARATOR . 'zphp' . DIRECTORY_SEPARATOR . 'ZPHP' . DIRECTORY_SEPARATOR . 'ZPHP.php' ; global $zphp; $zphp = ZPHP::run( __DIR__ , false , 'default' ); global $mimes; $mimes = require "mimes.php" ; }); $http->start(); 文件名为http_server.php

websocket 断线重连

烈酒焚心 提交于 2020-11-22 06:46:51
服务端为swoole 的websocket 客户端js代码: // 1.创建websocket客户端 var wsServer = 'ws://ip/' ; var limitConnect = 3; // 断线重连次数 var timeConnect =0 ; webSocketInit(wsServer); // socket初始化 function webSocketInit(service){ var ws = new WebSocket(service); ws .onopen = function () { console . log ("已连接TCP服务器" ); }; ws .onmessage = function (msg) { console . log (msg); }; ws .onclose = function () { console . log ('服务器已经断开' ); reconnect(service); }; ws .onerror = function (err) { // console.log("服务器报错:"); reconnect(service); }; // 重连 function reconnect(service) { // lockReconnect加锁,防止onclose、onerror两次重连 if

swoole踩坑

社会主义新天地 提交于 2020-11-08 05:27:48
前言 最近在做一个项目,需要用到类似通讯,第一想法就是socket,然后一顿百度发现了swool这个东西,之前有在项目中使用过workman,心想应该是差不多的吧,但是后面才发现两者其实还是有挺大差异的 安装 workman是一个类似packages的东西,我们之间使用composer来安装就可以了 swoole不一样,他是官方插件,所以我们需要用平时安装php插件的方法来安装 使用 官方那边有很详细的文档,我在这里就不一个一个说了,就说我遇到的一些坑把 * 多个线程之间的变量共享,不能使用global,而要用官方的swoole_table 我的项目里面,是需要在一个server文件里面启动两个端口监听的,一个用来和浏览器沟通的websocket,一个是和内部沟通的普通TCP,而这两者之间是需要数据交流的,我之前在使用workman的时候是这样使用的 use Workerman\Worker; use PHPSocketIO\SocketIO; // 用户组(记录所有在线的用户) $userList = array(); $socket = new SocketIO(9527); $socket->on('connection', function ($socket) { // 声明userList是全局变量 global $userList; //

玩转dnmp之自定义PHP容器

痴心易碎 提交于 2020-11-02 14:25:31
文章简介 在前面几篇文章中,我们使用dnmp搭建了一个完整的docker开发环境。这篇文章接着分享如何在dnmp的基础上搭建一个自定义的PHP容器,实现多版本的PHP容器。 前期准备 首先我们下载 dnmp仓库 。 复制docker-compose.sample.yml文件为docker-compose.yml cp docker-compose.sample.yml docker-compose.yml 复制env.sample为.env cp env.sample ./env 修改配置 首先我们根据需要在.env文件中配置好PHP容器需要映射的端口等信息。添加如下配置(可放在任意位置): # # PHP73 # PHP73_VERSION=7.3.22 PHP73_PHP_CONF_FILE=./services/php73/php.ini PHP73_FPM_CONF_FILE=./services/php73/php-fpm.conf PHP73_LOG_DIR=./logs/php PHP73_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache PHP_SWOOLE1_PORT=9504 PHP_SWOOLE2_PORT=9505 PHP_SWOOLE3_PORT=9506 PHP_SWOOLE4_PORT=9507

PHP实现对短信验证码发送次数的限制(防机刷验证码)

本秂侑毒 提交于 2020-10-27 16:54:36
场景 在注册,修改密码,找回密码等场景里,我们都会遇到发送手机短信进行验证码验证,我们都知道,手机的这个短信接口是需要购买了,为了防刷,我们就会对短信验证码发送次数的限制,我们应该如何防止呢? 很多人都会这样做:对用户获取短信验证码的手机号、ip、和浏览器(使用唯一标识)进行限制。 本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不发验证码。方法是通过在服务器端将用户的手机号、ip、ur_r标识记录并写入文件,再通过读取文件记录判断用户请求发送验证码的次数来做限制。 方法如下: 这里是获取短信验证码页面: <!DOCTYPE html> < html > < head ></ head > < body > <!-- 隐藏表单uv_r标识,用于对获取验证码的浏览器进行限制,唯一标识存储于浏览器cookie中。在用户进行获取短信验证码操作时将标识传入后台代码(可以通过js传入后台,此处未提供js代码) --> < input type = "hidden" name = "uv_r" value = "" id = "uv_r" > </ body > < script type = ”text/javascript” > /* 使用js获取cookie中ur_r唯一标识,如果不存在

PHP解耦的三重境界(浅谈服务容器)

混江龙づ霸主 提交于 2020-10-24 11:05:17
在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就“失控”了,渐渐“丑陋接口,肮脏实现”,项目维护成本和难度上升,到了难以维持的程度,只有重构或者重新开发。 第一重境界 假设场景:我们需要写一个处理类,能够同时操作会话,数据库和文件系统。我们或许会这么写。 境界特征:可以运行,但是严重耦合 class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $writer->write(); 写法缺点: 1

PHP的架构及原理概述

£可爱£侵袭症+ 提交于 2020-10-23 18:51:32
PHP 的特点 多进程模型 PHP是以多进程模型设计的,这样的好处是请求之间互不干涉,一个请求失败也不会对其他进程造成影响,作为最开始仅仅用于个人网站的一个工具集这样的设计并没有什么不妥,随着PHP的应用变大,访问量增加这种方式显然是不合适的,因为启动一个进程的开销对于海量请求是不划算的,所以现在PHP基本都是运行在PHP-FPM的管理下的,这是一个PHP进程管理器,它常驻内存启动一些PHP进程待命,当请求进入时分配一个进程进行处理,PHP进程处理完毕后回收进程,但并不销毁进程,这让PHP也能应对高流量的访问请求。 当然现在也有PHP多线程的解决方案和基于协程的解决方案,比如swoole让PHP更高效的处理WEB请求。 弱类型 与 JAVA、C/C++ 不同,PHP是一门若类型的语言,变量在声明的那一刻是不需要确定它的类型的,而在运行时类型也会发生显式或隐式的类型改变,这也是PHP开发应用迅速、方便的原因之一。 其他 Zend 引擎 + Ext 扩展 的模式降低了内部耦合,可以方便的为PHP本身增加功能和去除功能。 语法简单,没有太多强制规范,编程风格上既可以用过程式、也可以用面向对象的方式进行开发,当然函数式也可以。 PHP 的架构 以目前的 PHP 主流版本 PHP7 和 PHP5 来说架构是如上图所示,主要有四层体系构成,从下到上依次是 Zend 引擎、Extensions