【swoole.2.05】使用协程前需要了解的:Generator,Iterator,yield

之前应该有说过,协程是语言层面的多进程,其主要思想是遇到io阻塞的时候保存当前栈信息作为上下文,让出代码执行权限,等io有返回之后再回去执行协程未执行完的代码。看起来比较难理解,所以在了解协程之前,先带大家了解下yield,Generator和Iterator 名词解释 IteratorIterator是一个迭代器接口,写php的朋友们可能对这个词比较陌生,写java的朋友们一眼就认出来了,这就是java中用来遍历数组的最简单的包:java.util.Iterator。当然其他语言
阅读全文

【swoole.2.04】多进程示例:使用swoole实现多进程处理费时任务--弹性伸缩子程序

回顾上一篇解决了回复僵尸进程的问题,但是在现实环境中,昂贵的服务器不会允许我们一直起多个worker进行处理,这里来解决一下怎么弹性伸缩worker。这里以消息队列中的待消费消息为例,当然也可以以其他指标为例,如cpu利用率,内存利用率等。 代码```phpclass Job{ protected $masterPid; protected $workerNumber = 2; protected $maxWorkerNumber = 10;
阅读全文

【swoole.2.03】多进程示例:使用swoole实现多进程处理费时任务--处理未回收的僵尸子进程

回顾上一篇实现了一个简单的多进程结构,但是当主进程退出时子进程并不会回收,会变成僵尸进程常驻在系统中浪费系统资源。那么现在来解决这个问题 代码```phpclass Job{ protected $masterPid; protected $workerNumber = 4; protected $queueKey = 1; protected $queueMod = 2 | \Swoole\Process::IPC_NOWAI
阅读全文

【swoole.2.02】多进程示例:使用swoole实现多进程处理费时任务

前言在使用协程之前还是先了解下多进程的实现,正好swoole里也有Process进程管理模块,不想看的话可以直接跳过。 需求现在有一张巨型表的数据需要做迁移,同时中间涉及到很复杂的逻辑。使用sql进行直接迁移难度很高并且会导致数据库长期拿锁影响线上业务。这里需要单独写一个进程进行该数据的无感迁移。 架构分析首先,我们需要一个主进程来投递原始任务给子进程。 代码```php<?php// 子进程数量$workerNumber = 5;
阅读全文

【swoole.2.01】多进程,多线程和协程

  • 龚学鹏
  • 2019-02-26 12:07:02
  • PHP
  • php
前言在体验swoole的协程功能之前,需要先知道多进程,多线程和协程的区别。 多进程典型的多进程结构就是耳熟能详的masterworker结构。swoole本身也是由mastermanegerworker(task)组成的多进程结构。多进程将多个任务分配到不同的cpu上,从而实现同一时刻,处理多个任务。适用于cpu集型场景。1. 创建:fork创建子进程1. 通信:IPC进程间通信1. 开销:创建进程开销是非常大的1. 并发:并发能力在多进程,多线程和协程之间
阅读全文

【swoole.1.05】swoole粘包问题解决及一些牢骚

时隔一个月我又更新了!上一篇讲到了tcp协议中会碰到的粘包问题及解决思路,即增加包头和增加结束符。这一篇来介绍下通过配置swoole设置选项来达到解决粘包的效果。处理粘包很简单,修改一下服务的配置就行了,详情自行查看文档吧。打开EOF检测:启用EOF自动分包:设置EOF字符串:打开包长检测特性:至于为什么这次更新内容这么简单,请看下面的牢骚吧。 发牢骚中有一个月没更新了,主要是最近有几个朋友和前同事在看了我的博客后觉得博客内容太基础了,包括几
阅读全文

【设计模式】AD-原型模式(Prototype)

前言原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。php中底层已实现`__clone()`魔术方法,不需要其他操作即可进行对象的克隆。 使用场景在原型实例化需要使用大量资源的情况下,new一个类的实例是很浪费的行为,而有的时候我们又需要多个实例对应用进行服务。此时可以直接使用`clone $obj`来进行原型复制,跳过复杂的实例化和配置行为。 实现方法可直接使用php魔术方法`__clone(
阅读全文

【设计模式】AC-工厂模式(Factory Pattern)

前言工厂模式可以通过一个工厂类生产出所需要的对象,这样的好处是1. 在你需要修改需要实例化的类的时候不需要修改外部实例化的代码1. 在需要通过判断来实例化类的时候不需要写大量的ifelse或者switch 应用场景1. 大部分同样功能实例化可能会切换的类的时候都可以用到,如:已编写一个自己的Log类,外部已经多处引用,此时迭代了一个更好的Log类但是不想改变外部代码,可直接在工厂类中生产新的Log类。1. 可能通过配置切换不同对象来进行后续操作,如:平台支
阅读全文

【设计模式】AB-单例模式(Singleton Pattern)

前言在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。了解php内存管理的人都知道,一个类文件(xxxx.class.php)在加载后会先进入代码区以字符串的形式保存起来,在实例化的时候才会在堆中生成对应的对象占用部分内存。在有些场景中,为了防止对象被重复实例化,会使用此模式来保证只能创建一个实例。如:在封装一个数据库连接交互的类库的时候,为了避免多次连接数据库,可能会使用到单例模式来保证一次脚本运行只创建一个连接,或者使用
阅读全文

【设计模式】AA-说明

简介此篇将记录本人学习设计模式的全过程。全部学习来自以下文章:将会使用涉及到的设计模式来重构一个简单的日志记录demo,本篇先放出最原始的日志demo。为了方便工厂,适配,桥接等多模型设计模式,此处有2个demo:FileLog和CliLog。FileLog:```php<?phpnamespace Demo\AADemo\Classes;class FileLog{ public function l
阅读全文