Swoft

PHP 开启 Opcache 功能提升程序处理效率

♀尐吖头ヾ 提交于 2020-05-08 14:28:26
简介 Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件。Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速 PHP 的执行。 正常的执行流程如下: 开启 Opcache 后的执行流程如下: Yum 安装 php -v yum list *opcache* yum -y install rh-php71-php-opcache.x86_64 kill -USR2 cat `/usr/local/php/var/run/php-fpm.pid` nginx -s reload 配置 zend_extension=opcache.so [opcache] ;开启opcache功能 opcache.enable=1 ;CLI环境下,开启opcache功能 opcache.enable_cli=1 ;OPcache共享内存的大小,单位MB opcache.memory_consumption=128 ;字符串在进程间驻留科使用的内存大小,单位MB opcache.interned_strings_buffer=8 ;内存中可以缓存的文件量。200-1000000之间 ;可以使用“find

PHP架构师教程—swoole教程从入门到精通

混江龙づ霸主 提交于 2020-05-04 08:06:36
众所周知,Swoole 和我们传统的 PHP 开发差别是有的,需要理解的概念也是有的。使用目前一些基于 Swoole 的框架开发的话,从开发习惯上和传统的TP 框架相差不多。根据官方介绍它是一个底层通信框架,最大的优势在于: 常驻内存,避免重复加载带来的性能损耗,提升海量性能 协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等) 方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件通信 PHP 高性能微服务架构成为现实 那么很多人学习swoole都遇到了很多困难,那么我将在这里分享一套PHP架构师路线路以及教程,主要针对1到5年及以上的PHP开发人员,里面的技术包涵了PHP高并发、分布式、微服务、框架内核、高性能等技术,这些也是目前中大型互联网企业比较常用的技术,那么来详细看看。 一:常见模式与框架 学习PHP技术体系,设计模式,流行的框架 常见的设计模式,编码必备 Laravel、ThinkPHP开发必不可少的最新框架 YII、Symfony4.1核心源码剖析 二:微服务架构与性能优化 业务体系越来越复杂,Swoole协程编程,PHP并发编程、MySQL底层优化是架构升级的必经之路,PHP性能优化和微服务相关的技术有哪些呢? Tars分布式RPC框架 Swoft微服务框架 服务器性能优化 算法与数据结构 三:工程化与分布式架构

浅述PHP7底层设计01-PHP7语言执行原理

蓝咒 提交于 2020-04-30 11:24:49
PHP作为一种解释型语言,不同于编译型语言编译结果即为当前CPU体系的指令,PHP源代码只有编译成opcode才能够被zend虚拟机直接执行。 下面就简单描述PHP7语言执行原理: 1. 源代码首先利用Re2c实现的词法分析器进行词法分析,将源代码切割为多个字符串单元,分割后的字符串称为Token; 2. 基于Bison实现的语法分析器将Token和符合BNF文法规则的代码生成抽象语法树; 3. 抽象语法树(AST)编译生成opcode; 我们常常讨论的解释型语言执行效率较低,原因在于PHP执行过程中要多了翻译为opcode的过程。 不仅如此,与常驻内存的Java等语言不同,PHP代码在执行过后,内存会马上释放,基本上所有数据都会在此时销毁(仅有极少数数据会缓存)。 这种执行机制的优点在于有效避免内存泄漏,内存回收机制更简单,缺点就是每个PHP请求都得重复执行请求-翻译-执行的过程。 备注:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 为了弥补不是常驻内存的缺憾,引入opcode缓存,zend虚拟机会将第一次执行的PHP代码编译结果缓存到内存或者硬盘中,当下次执行该部分代码时直接读取缓存,一定程度上可以提高PHP运行速度。 参考资料 1. 陈雷

彻底搞懂 Redis 事务

∥☆過路亽.° 提交于 2020-04-23 18:33:19
提到redis的事务,相信很多初学的朋友会对它的理解和使用有些模糊不清,料想它和我们常见的关系型数据库(mysql 、mssql等)中的事务相同,也支持回滚,但这样理解就进入了一个误区,首先:关系型数据中的事务都是原子性的,而redis 的事务是非原子性的。再多说一句,什么是程序原子性?简单的理解就是:整个程序中的所有操作,要么全部完成,要不全部不完成,不会停留在中间某个环节。那么非原子性就是不满足原子性的条件就是非原子性了。我们用例子来解释一下: 原子性 :数据库中的某个事务A中要更新t1表、t2表的某条记录,当事务提交,t1、t2两个表都被更新,若其中一个表操作失败,事务将回滚。 非原子性 :数据库中的某个事务A中要更新t1表、t2表的某条记录,当事务提交,t1、t2两个表都被更新,若其中一个表操作失败,另一个表操作继续,事务不会回滚。(当然对于关系型数据库不会出现非原子性) Redis事务相关命令: MULTI : 开启事务,redis会将后续的命令逐个放入队列中,然后使用 EXEC命令来原子化 执行这个命令系列。 EXEC: 执行事务中的所有操作命令。 DISCARD: 取消事务,放弃执行事务块中的所有命令。 WATCH: 监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。 UNWATCH:

分布式消息队列应用场景之异步处理、应用解耦、流量削锋和消息通讯理解分析

你说的曾经没有我的故事 提交于 2020-04-20 11:07:37
摘要:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka等。 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。 1.异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 (1)串行方式:将注册信息持久化后,发送注册邮件,再发送注册短信。三个业务全部完成后,返回给客户端。 (2)并行方式:将注册信息持久化后,发送注册邮件的同时,发送注册短信。三个业务全部完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用100毫秒钟,不考虑其他开销,则串行方式的时间是300ms,并行的时间可能是200毫秒。则串行的方式1秒内可处理3次请求,并行方式1秒内可处理5次请求,综上所述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢? 引入消息队列,将不是必须的业务逻辑,异步处理。如下图所示 按照上图,用户的响应时间相当于是注册信息写入数据库的时间和将消息插入消息队列,也就是105毫秒。注册邮件,发送短信消息写入队列后,直接返回

分布式消息队列应用场景之异步处理、应用解耦、流量削锋和消息通讯理解分析

一笑奈何 提交于 2020-04-20 10:51:35
摘要:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka等。 消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。 1.异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 (1)串行方式:将注册信息持久化后,发送注册邮件,再发送注册短信。三个业务全部完成后,返回给客户端。 (2)并行方式:将注册信息持久化后,发送注册邮件的同时,发送注册短信。三个业务全部完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用100毫秒钟,不考虑其他开销,则串行方式的时间是300ms,并行的时间可能是200毫秒。则串行的方式1秒内可处理3次请求,并行方式1秒内可处理5次请求,综上所述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢? 引入消息队列,将不是必须的业务逻辑,异步处理。如下图所示 按照上图,用户的响应时间相当于是注册信息写入数据库的时间和将消息插入消息队列,也就是105毫秒。注册邮件,发送短信消息写入队列后,直接返回

PHP7的一些特性用法

跟風遠走 提交于 2020-04-18 11:38:18
1.use的用法 <?php // PHP 7 之前版本用法 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ 用法 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC}; ?> 2.序列号函数unserialize的新增了过滤功能 // 转换对象为 __PHP_Incomplete_Class 对象 $data = unserialize($foo, ["allowed_classes" => false])

Swoft是如何利用注解实现各种功能的

随声附和 提交于 2020-04-07 06:34:42
PHP中的注解 注解(Annotations) 是Swoft里面很多重要功能特别是AOP,IoC容器的基础。 注解的定义是: “附加在数据/代码上的元数据(metadata)。” 框架可以基于这些元信息为代码提供各种额外功能。 以另一个框架PHPUnit为例,注解@dataProvider声明一个方法作为测试用例方法的数据提供器。当PHPUnit框架执行到某一个测试用例方法时,会迭代该数据提供器,并将其返回的数据作为参数传入测试用例方法,为测试用例方法提供一套用例所需的测试数据。 //摘自phpseclib库的单元测试 public function formatLogDataProvider() { return array( array( //该参数会作为$message_log参数传到testFormatLog()测试用例方法中 array('hello world'), array('<--'), //$message_number_log "<--\r\n00000000 68:65:6c:6c:6f:20:77:6f:72:6c:64 hello world\r\n\r\n"//$expected ), array( array('hello', 'world'), array('<--', '<--'), "<--\r\n00000000 68:65:6c:6c:6f

php进程daemon化的正确做法

偶尔善良 提交于 2020-03-27 17:05:49
3 月,跳不动了?>>> daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 . 守护进程简单地说就是可以脱离终端而在后台运行的进程 . 这在Linux中是非常常见的一种进程 , 比如apache或者mysql等服务启动后 , 就会以守护进程的方式进驻在内存中 . 以PHP为例 , 假如我有个耗时间的任务需要跑在后台 : 将所有mysql中user表中的2000万用户全部导入到redis中做缓存预热, 那么这个任务估计一时半会是不会结束的 , 这个时候就需要编写一个php脚本以daemon形式运行在系统中 , 结束后自动退出. 在Linux中 , 大概有三种方式实现脚本后台化 : 1 . 在命令后添加一个&符号 , 比如 php task.php & . 这个方法的缺点在于 如果terminal终端关闭 , 无论是正常关闭还是非正常关闭 , 这个php进程都会随着终端关闭而关闭 , 其次是代码中如果有echo或者print_r之类的输出文本 , 会被输出到当前的终端窗口中 . 2 . 使用nohup命令 , 比如 nohup php task.php & . 默认情况下 , 代码中echo或者print_r之类输出的文本会被输出到php代码同级目录的nohup.out文件中 .

PHP实现简单RPC

谁都会走 提交于 2020-03-26 10:11:18
3 月,跳不动了?>>> 1.什么是rpc RPC全称为Remote Procedure Call,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2.从通信协议的层面 基于HTTP协议的(例如基于文本的SOAP(XML)、Rest(JSON),基于二进制Hessian(Binary)) 基于TCP协议的(通常会借助Mina、Netty等高性能网络框架) 3.从不同的开发语言和平台层面 单种语言或平台特定支持的通信技术(例如Java平台的RMI、.NET平台Remoting) 支持跨平台通信的技术(例如HTTP Rest、Thrift等) 4.从调用过程来看 同步通信调用(同步RPC) 异步通信调用(MQ、异步RPC) 5.常见的几种通信方式 远程数据共享(例如:共享远程文件,共享数据库等实现不同系统通信) 消息队列 RPC(远程过程调用) 6.php实现简单的rpc 目录结构 rpc服务端 <?php /** * User: yuzhao * CreateTime: 2018/11/15 下午11:46 * Description: Rpc服务端 */ class RpcServer { /** * User: yuzhao * CreateTime