PHP
文章平均质量分 61
oye-game
这个作者很懒,什么都没留下…
展开
-
简单PHP代码实现一个orm
<?phpabstract class Model { protected $pk = 'id'; protected }原创 2021-03-02 15:38:04 · 325 阅读 · 0 评论 -
PHP7垃圾回收机制详解(附GC处理完整流程图)
垃圾回收:简称GC。顾名思义,就是废物重利用的意思。说垃圾回收机制之前,先接触一下内存泄漏。内存泄漏:某大神重口味充满画面感的形象解释:大概意思就是申请了一块地儿拉了会儿屎,拉完后不收拾,那么那块儿地就算是糟蹋了,地越用越少,最后一地全是屎。说到底一句,用了记得还。一定程度上说,垃圾回收机制就是用来擦屁股的。c语言垃圾回收机制:如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是手动垃圾回收,一般都是大神用这种转载 2021-03-01 16:26:08 · 354 阅读 · 0 评论 -
怎么理解PHP代理模式
本篇文章主要给大家用实例代码来详细介绍PHP代理模式。在前面的文章中,我们已经给大家简单介绍了PHP代理模式的基础概念,相信大家对代理模式也有了一点了解。本节内容就结合具体的代码示例,给大家介绍PHP代理模式。代码如下:/* * 代理模式 *///代理抽象接口interface shop { public function buy($title);}//原来的CD商店,被代理对象class CDShop implements shop { public funct转载 2021-02-04 18:14:35 · 156 阅读 · 0 评论 -
MySQL的连接池、异步、断线重连
MySQL长连接MySQL短连接每次请求操作数据库都需要建立与MySQL服务器建立TCP连接,这是需要时间开销的。TCP连接需要3次网络通信。这样就增加了一定的延时和额外的IO消耗。请求结束后会关闭MySQL连接,还会发生3/4次网络通信。close操作不会增加响应延时,原因是close后是由操作系统自动进行通信的,应用程序感知不到长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。提升了PHP程序的性能。断线重连在cli环境下,PHP程序需要长时间运行,客户端与MySQL服务器之转载 2021-01-04 11:42:54 · 561 阅读 · 0 评论 -
Laravel Broadcaster 进阶使用 & 原理分析
上一篇简单介绍了什么是 Laravel 广播,本篇我们来剖析一下 Laravel 广播的原理,以及使用时的注意事项。正好看到一篇老外写的搭建攻略,也非常不错:https://medium.com/@dennissmink/laravel-echo-server-how-to-24d5778ece8b开始使用Laravel App Server - 应用服务端修改 .env 的 BROADCAST_DRIVER = redis,同时启用 QUEUE_DRIVER 队列服务,广播队列应独立一条,默认走转载 2020-08-25 09:16:48 · 621 阅读 · 0 评论 -
Laravel Broadcasting广播机制(Redis + socket.io)-学习实例
借助Laravel Broadcasting你可以使用上时下很热的Websocket技术。注意:请务必使用较新版本的 Laravel。Laravel在最近几个版本进行过比较大的重构,比如路由从 app\Http\routes.php 拆分为到 routes 目录下的多个文件,包括广播在内的各个附加组件也都进行了重构并正式写入文档。所以网上有些教程(特别是入门教程)可能是根据旧版本来写的,容易让你迷惑。当安装完Laravel后执行以下命令查看Laravel版本php artisan --version如转载 2020-08-25 09:02:11 · 978 阅读 · 0 评论 -
实时聊天室:基于Laravel+Pusher+Vue通过事件广播实现
之前有说过要整理出一篇事件广播的教程,今天终于有时间把这篇文章给写了出来,本次的教程是基于Laravel+Pusher+Vue,以事件广播作为核心技术,让你可以快速搭建起一个实时聊天室应用,话不多说,让我们来直接看看具体的内容吧。应用初始化安装配置首先还是通过 Composer 安装一个全新的聊天室应用:1composer create-project laravel/laravel chatroom --prefer-dist由于要用到事件广播,所以需要取消 config/app.php 中广转载 2020-08-25 08:25:43 · 729 阅读 · 0 评论 -
深入浅出 Laravel Echo
看源代码,解析一次完整的 public channel 下发流程。此图来自网上,如有侵权,通知我删除通过上图,我们至少要知道两件事:Laravel 和我们的前端 (vue) 没有直接关联,它们通过 Socket.io Server 来做中转,这是怎么做到的呢?怎么发送 Brocadcasted Data?下面来一一解析。BroadcastServiceProviderBroadcastServiceProvider 主要包含了 Broadcast 相关的五个驱动器、Broadcast 事件转载 2020-08-24 08:53:52 · 396 阅读 · 0 评论 -
简单 16 步走一遍 Laravel Echo 的使用
官方文档推荐使用 Pusher 或者 laravel-echo-server (是一个使用 NodeJS + Socket.IO 实现的 WebSocket 服务端)。在国内,个人还是不推荐使用 Pusher,访问速度有所影响,而且其还是一个商业产品。今天利用最简便的「16」步,走一遍代码集成 laradock 和 laravel-echo-server 来使用 Laravel Echo。搭建基础环境// 1. new projectlaravel new echolearning// 2.转载 2020-08-24 08:17:01 · 1405 阅读 · 0 评论 -
Laravel Broadcast——广播系统源码剖析
在现代的 web 应用程序中,WebSockets 被用来实现需要实时、即时更新的接口。当服务器上的数据被更新后,更新信息将通过 WebSocket 连接发送到客户端等待处理。相比于不停地轮询应用程序,WebSocket 是一种更加可靠和高效的选择。我们先用一个电子商务网站作为例子来概览一下事件广播。当用户在查看自己的订单时,我们不希望他们必须通过刷新页面才能看到状态更新。我们希望一旦有更新时就主动将更新信息广播到客户端。laravel 的广播系统和队列系统类似,需要两个进程协作,一个是 laravel转载 2020-08-24 07:58:55 · 578 阅读 · 0 评论 -
基于socket.io的php扩展介绍---phpsocket.io
工具地址:https://github.com/walkor/phpsocket.iophpsocket.io是由workerman根据socket.IO扩展的用于php服务端通讯组件,后台服务用workerman监听端口,处理事件回调.socket.io-client客户端socket.io.js 供前端界面初始化io下面是phpsocket.io操作手册:安装请使用composer集成phpsocket.io。脚本中引用vendor中的autoload.php实现SocketIO相关类的加载转载 2020-08-22 18:48:20 · 358 阅读 · 1 评论 -
workerman和thinkphp完美结合使用源码
逛论坛看到很多thinkphper在问如何将workerman集成到thinkphp中, 现在特意奉上源码,经过本人自测可以运行下载workerman, 放入thinkphp,注意与Home平级,就把workerman当做是一个模块。进入Home/Controller目录,新建WorkermanController.class.php直接上源码,这里我是以守护进程方式运行的,调试的话,可以去掉daemonize = true 这行.<?phpnamespace Admin\Controlle转载 2020-08-22 18:45:56 · 378 阅读 · 0 评论 -
thinkphp5.0整合phpsocketio完整攻略(绕坑)
这篇文章主要介绍了thinkphp5.0整合phpsocketio完整攻略(绕坑),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧PHPSocket.IO是基于workerman开发的php版本的socket.IO服务。可用于服务器消息的推送、聊天室、客服系统的开发使用环境: thinkphp5.0项目需求前端下单,后台接受,并立即做出提示。例如:美团外卖,客户端下单成功后,商家端就会立即有接单语音提示。开发环境thinkphp5.0phpsocketio转载 2020-08-22 18:40:35 · 1191 阅读 · 1 评论 -
php使用socket.io进行tcp通讯
安装socket.io库切换国内镜像 composer config -g repo.packagist composerhttps://packagist.phpcomposer.com切换国外镜像: composer config -g repo.packagist composerhttps://packagist.org下载扩展库 composer require workerman/phpsocket.io启动入口文件<?php// [ 应用入口文件 ]namespac转载 2020-08-22 17:26:09 · 725 阅读 · 0 评论 -
Redis发布订阅(pub/sub)命令介绍
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。一:命令介绍PSUBSCRIBE pattern [pattern1 ....]说明:订阅一个或多个符合给定模式的频道,每个模式以*作为匹配符参数:pattern(给定的模式)返回:接受到的信息PUNSUBSCRIBE pattern [pattern1 ....]说明:用于退订所有给定模式的频道参数:pattern(给定的模式)返回:这个命令在不同的客户端中有转载 2020-08-22 15:14:15 · 650 阅读 · 0 评论 -
Laravel Queue——消息队列任务处理器源码剖析
运行队列处理器队列处理器的设置Laravel 包含一个队列处理器,当新任务被推到队列中时它能处理这些任务。你可以通过 queue:work 命令来运行处理器。要注意,一旦 queue:work 命令开始,它将一直运行,直到你手动停止或者你关闭控制台:php artisan queue:work可以指定队列处理器所使用的连接。 php artisan queue:work redis可以自定义队列处理器,方式是处理给定连接的特定队列。 php artisan queue:work redis -转载 2020-08-21 08:49:47 · 923 阅读 · 0 评论 -
Laravel Queue——消息队列任务与分发源码剖析
在实际的项目开发中,我们经常会遇到需要轻量级队列的情形,例如发短信、发邮件等,这些任务不足以使用 kafka、RabbitMQ 等重量级的消息队列,但是又的确需要异步、重试、并发控制等功能。通常来说,我们经常会使用 Redis、Beanstalk、Amazon SQS 来实现相关功能,laravel 为此对不同的后台队列服务提供统一的 API,本文将会介绍应用最为广泛的 redis 队列。本文参考文档资料:使用 Laravel Queue 不得不明白的知识Laravel 的消息队列剖析背景知识在讲转载 2020-08-20 09:24:05 · 518 阅读 · 0 评论 -
Laravel 的消息队列剖析
在实际工作中也不止遇见过一次这个问题,我在想着以前是怎么处理的呢?我记得当初在上家公司的时候直接使用的是 laravel 的 queue 来实现的。当然,这里说的 laravel 的 queue 实际上也是基于 redis 的队列实现的。正好今天遇上这个问题,追下底层机制。使用如下:http://learnku.com/docs/laravel/5.3/queues// 创建10分钟后执行的任务$job = (new ProcessPodcast($pocast)) ->转载 2020-08-20 08:43:26 · 485 阅读 · 0 评论 -
使用 Laravel Queue
背景首先说一下我写这篇文章的初衷,在我们打算使用 Laravel Queue 的时候,你的首选应该是去看文档,但是无奈 Laravel 的文档很多地方写得太简单,有时候想了解一个深入的问题,不得不去看源码,但是看源码确实费一些时间。所以我打算写一篇文章,把我在使用 Laravel Queue 过程中的方方面面都写一下,方便新手学习、老司机温习。因为 Redis Queue 是比较简单也很常用的一种队列,所以以下内容我都基于 Redis Queue。为什么使用队列?虽然这个问题不是今天文章的重点,但转载 2020-08-20 07:55:08 · 423 阅读 · 1 评论 -
Laravel 模型事件实现原理
Laravel 的 ORM 模型在一些特定的情况下,会触发一系列的事件,目前支持的事件有这些:creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored,那么在底层是如何实现这个功能的呢?1. 如何使用模型事件先来看看如何使用模型事件,文档里面写了两种方法,实际上总共有三种方式可以定义一个模型事件,这里以 saved 事件来做例子,其他事件都一样。events 属性直接转载 2020-08-19 08:02:47 · 393 阅读 · 0 评论 -
Laravel Event——事件系统的启动与运行源码分析
Laravel 的事件系统是一个简单的观察者模式,主要目的是用于代码的解耦,可以防止不同功能的代码耦合在一起。laravel 中事件系统由两部分构成,一个是事件的名称,事件的名称可以是个字符串,例如 event.email,也可以是一个事件类,例如 App\Events\OrderShipped;另一个是事件的 listener,可以是一个闭包,还可以是监听类,例如 App\Listeners\SendShipmentNotification。事件服务的注册事件服务的注册分为两部分,一个是 Applic转载 2020-08-18 08:32:54 · 401 阅读 · 0 评论 -
Laravel 5.1 定义事件、事件监听器以及触发事件实例教程
今天我们开始讲Laravel的事件,事件无处不在,比如用户登录、购买商品、搜索、查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制。本节我们通过一个简单的示例来讲述在Laravel中如何创建事件类、事件对应的监听器类,以及监听器如何监听事件发生并执行相应操作。这里我们基于之前基于模型+缓存对文章增删改查这篇文件对文章保存后缓存的处理做进一步优化。我们将文章保存(新建/修改)视为一个事件,将保存文章内容到缓存放到监听器转载 2020-08-17 08:31:46 · 338 阅读 · 0 评论 -
Laravel Session——session 的启动与运行源码分析
在网页开发中, session 具有重要的作用,它可以在多个请求中存储用户的信息,用于识别用户的身份信息。laravel 为用户提供了可读性强的 API 处理各种自带的 Session 后台驱动程序。支持诸如比较热门的 Memcached、Redis 和开箱即用的数据库等常见的后台驱动程序。本文将会在本篇文章中讲述最常见的由 File 与 redis 驱动的 session 源码。session 服务的注册与其他功能一样,session 由自己的服务提供者在 container 内进行注册:class转载 2020-08-17 07:47:11 · 426 阅读 · 0 评论 -
Laravel tap 用法
Laravel 5.3 中增加了一个新的全局帮助函数 tap(),改进了框架的声明能力。这个微妙的语法是从 Ruby 和 Lodash 借鉴而来,允许你去 tap 成链。先看看 tap() 帮助函数的代码,只有短短的几行:function tap($value, $callback){ $callback($value); return $value;}你需要传一个值和一个回调到方法中,值作为回调的参数,回调将执行,最后值被返回。执行中间操作从一个简单的例子开始,提取 Lara转载 2020-08-15 21:35:50 · 1047 阅读 · 0 评论 -
秒杀业务是这么做的
一、秒杀业务为什么难做1)im系统,例如qq或者微博,每个人都读自己的数据(好友列表、群列表、个人信息);2)微博系统,每个人读你关注的人的数据,一个人读多个人的数据;3)秒杀系统,库存只有一份,所有人会在集中的时间读和写这些数据,多个人读一个数据。例如:小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万。又例如:12306抢票,票是有限的,库存一份,瞬时流量非常多,都读相同的库存。读写冲突,锁非常严重,这是秒杀业务难的地方。那我们怎么优化秒杀业务的架构呢?二、优化方向转载 2020-08-15 21:33:49 · 407 阅读 · 0 评论 -
Laravel Database——Eloquent Model 更新关联模型
在前两篇文章中,向大家介绍了定义关联关系的源码,还有基于关联关系的关联模型加载与查询的源码分析,本文开始介绍第三部分,如何利用关联关系来更新插入关联模型。hasOne/hasMany/MorphOne/MorphMany 更新与插入save 方法正向的一对一、一对多关联保存方法用于对子模型设置外键值:public function save(Model $model){ $this->setForeignAttributesForCreate($model); return转载 2020-08-13 18:07:56 · 628 阅读 · 0 评论 -
Laravel Database——Eloquent Model 关联模型加载与查询
我们在上一篇文章中介绍了模型关系的定义初始化,我们可以看到,在初始化的过程中 laravel 已经为各种关联关系的模型预先插入了初始的 where 条件。本文将会进一步介绍如何添加自定义的查询条件,如何加载、预加载关联模型。关联模型的加载当我们定义关联模型后:class User extends Model{ /** * 获得与用户关联的电话记录。 */ public function phone() { $this->hasOne(转载 2020-08-13 17:46:44 · 1099 阅读 · 0 评论 -
Laravel Database——Eloquent Model 模型关联初始化源码分析
数据库表通常相互关联。laravel 中的模型关联功能使得关于数据库的关联代码变得更加简单,更加优雅。本文会详细说说关于模型关联的源码,以便更好的理解和使用关联模型。官方文档:Eloquent:关联所谓的定义关联,就是在一个 Model 中定义一个关联函数,我们利用这个关联函数去操作另外一个 Model,例如,user 表是用户表,posts 是用户发的文章,一个用户可以发表多篇文章,我们就可以这样写:$user->posts()->where('active', 1)->get();转载 2020-08-13 08:14:33 · 406 阅读 · 0 评论 -
Laravel Database——Eloquent Model 源码分析(下)
获取模型get 函数public function get($columns = ['*']){ $builder = $this->applyScopes(); if (count($models = $builder->getModels($columns)) > 0) { $models = $builder->eagerLoadRelations($models); } return $builder->getM转载 2020-08-11 08:13:33 · 275 阅读 · 0 评论 -
Laravel Database——Eloquent Model 源码分析(上)
前面几个博客向大家介绍了查询构造器的原理与源码,然而查询构造器更多是为 Eloquent Model 服务的,我们对数据库操作更加方便的是使用 Eloquent Model。 本篇文章将会大家介绍 Model 的一些特性原理。Eloquent Model 修改器当我们在 Eloquent 模型实例中设置某些属性值的时候,修改器允许对 Eloquent 属性值进行格式化。如果对修改器不熟悉,请参考官方文档:Eloquent: 修改器下面先看看修改器的原理:public function offsetS转载 2020-08-10 08:03:53 · 523 阅读 · 0 评论 -
Laravel Database——Paginate 分页服务源码分析
paginate 分页laravel 的分页用起来非常简单,只需要对 query 调用 paginate 函数,把返回的对象扔给前端 blade 文件,在 blade 文件调用函数 render 函数或者 link 函数,就可以得到 上一页、下一页 等等分页特效。实际上,我们可以简单地把分页服务看作一个前端资源,render 函数或者 link 函数的结果就是分页前端代码。如果你还对 laravel 的分页不是很熟悉,请先阅读官方文档 : 分页。分页服务的启动分页功能也是由一个服务提供者所启动的,转载 2020-08-09 10:04:31 · 930 阅读 · 0 评论 -
Laravel Database——查询构造器与语法编译器源码分析 (下)
insert 语句insert 语句也是我们经常使用的数据库操作,它的源码如下:public function insert(array $values){ if (empty($values)) { return true; } if (! is_array(reset($values))) { $values = [$values]; } else { foreach ($values as $key =&g转载 2020-08-05 08:30:11 · 175 阅读 · 0 评论 -
Laravel Database——查询构造器与语法编译器源码分析 (上)
前言在前两个文章中,我们分析了数据库的连接启动与数据库底层 CRUD 的原理,底层数据库服务支持原生 sql 的运行。本文以 mysql 为例,向大家讲述支持 Fluent 的查询构造器 query 与语法编译器 grammer 的原理。DB::table 与 查询构造器若是不想使用原生的 sql 语句,我们可以使用 DB::table 语句,该语句会返回一个 query 对象:public function table($table){ return $this->query()-转载 2020-08-18 07:35:01 · 438 阅读 · 0 评论 -
Laravel Database——查询构造器与语法编译器源码分析 (中)
join 语句join 语句对数据库进行连接操作,join 函数的连接条件可以非常简单:DB::table('services')->select('*')->join('translations AS t', 't.item_id', '=', 'services.id');也可以比较复杂:DB::table('users')->select('*')->join('contacts', function ($j) { $j->on('users.i转载 2020-08-04 08:34:52 · 275 阅读 · 0 评论 -
Laravel Database——数据库服务的启动与连接
前言数据库是 laravel 及其重要的组成部分,大致的讲,laravel 的数据库功能可以分为两部分:数据库 DB、数据库 Eloquent Model。数据库的 Eloquent 是功能十分丰富的 ORM,让我们可以避免写繁杂的 sql 语句。数据库 DB 是比较底层的与 pdo 交互的功能,Eloquent 的底层依赖于 DB。本文将会介绍数据库 DB 中关于数据库服务的启动与连接部分。在详细讲解数据库各个功能之前,我们先看看支撑着整个 laravel 数据库功能的框架:DB 也就是 Da转载 2020-08-18 07:35:23 · 1119 阅读 · 0 评论 -
Laravel HTTP——SubstituteBindings 中间件的使用与源码解析
前言当路由与请求进行正则匹配后,各个路由的参数就获得了它们各自的数值。然而,有些路由参数变量,我们还想要把它转化为特定的对象,这时候就需要中间件的帮助。 SubstituteBindings 中间件就是一个将路由参数转化为特定对象的组件,它默认可以将特定名称的路由参数转化数据库模型对象,可以转化已绑定的路由参数为把绑定的对象。SubstituteBindings 中间件的使用数据库模型隐性转化首先我们定义了一个带有路由参数的路由:Route::put('user/{userid}', 'UserC转载 2020-08-01 12:05:46 · 1374 阅读 · 0 评论 -
Laravel HTTP——控制器方法的参数构建与运行
前言经过前面一系列中间件的工作,现在请求终于要达到了正确的控制器方法了。本篇文章主要讲 laravel 如何调用控制器方法,并且为控制器方法依赖注入构建参数的过程。路由控制器的调用我们前面已经解析过中间件的搜集与排序、pipeline 的原理,接下来就要进行路由的 run 运行函数:protected function runRouteWithinStack(Route $route, Request $request){ $shouldSkipMiddleware = $this->转载 2020-08-01 11:21:28 · 229 阅读 · 0 评论 -
Laravel HTTP—— RESTFul 风格路由的使用与源码分析
我们在前面的文章已经讲了整个路由与控制器的源码,我们今天这个文章开始向大家介绍在 laravel 中创建 RESTFul 风格的控制器。关于什么是 RESTFul 风格及其规范可参考这篇文章:理解 RESTful 架构。关于 laravel 中 RESTFul 风格控制器的创建简要介绍 : HTTP 控制器实例教程 —— 创建 RESTFul 风格控制器实现文章增删改查创建 RESTFul 风格控制器要想在 laravel 中创建 RESTFul 风格控制器,只需要一句:Route::resou转载 2020-08-01 10:57:29 · 543 阅读 · 0 评论 -
Laravel HTTP—— 重定向的使用与源码分析
laravel 为我们提供便携的重定向功能,可以由门面 Redirect,或者全局函数 redirect() 来启用,本篇文章将会介绍重定向功能的具体细节及源码分析。URI 重定向重定向功能是由类 UrlGenerator 所实现,这个类需要 request 来进行初始化: $url = new UrlGenerator( $routes = new RouteCollection, $request = Request::create('http://www.foo.com/'))转载 2020-07-29 08:27:23 · 532 阅读 · 0 评论 -
Laravel ENV—— 环境变量的加载与源码解析
laravel 在启动时,会加载项目的 env 文件,本文将会详细介绍 env 文件的使用与源码的分析。ENV 文件的使用多环境 ENV 文件的设置laravel 支持在不同的环境下加载不同的 env 文件,若想要实现多环境 env 文件,需要做两件事:一、在项目写多个 ENV 文件,例如三个 env 文件:.env.development、.env.staging、.env.production,这三个文件中分别针对不同环境为某些变量配置了不同的值,二、配置 APP_ENV 环境转载 2020-07-28 09:13:14 · 832 阅读 · 0 评论