php技巧

php桥接模式的实例用法及代码分析

2021-07-01
说明 1.将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 2.结构分为Abstraction抽象类.RefindAbstraction被提炼的抽象类.Implementor实现类.ConcreteImplementor具体实现类 .Client客户端代码. 实例 /** * 颜色抽象类 * Class Colour */ abstract class Colour { /** * @return mixed */ abstract public function

PHP中strval()函数实例用法

2021-06-04
1.函数说明 strval()函数是PHP中的内置函数,用于将任何标准值(字符串.整数或双精度)转换为字符串.我们不能在数组或对象中使用strval.如果使用该函数,该函数只返回需要转换的值的类型名称. 2.语法 string strval (mixed $var) 3.参数说明 $var: 可以是任何标量类型,但不能是数组或对象. 4.返回值 返回字符串. 5.实例 <?php$int_str= 123;var_dump($int_str);$str = strval(123);var_dum

Fatal error: &#39;break&#39; not in the &#39;loop&#39; or &#39;switch&#39; context in Function.php

2021-06-04
今天本地改代码改完做测试发现现在的文件中打开是Break' not in the 'loop' or 'switch' context"这样的:当时一脸懵逼,这是一个老项目最近也没动啊怎么回事,然后去线上测试是好的弄得我是没脾气,仔细排查发现是本地环境PHP版本升级的影响.这个项目是5.6的但是本地我切换的7忘了换回来了. 错误提示: Fatal error: 'break' not in the 'loop' or 'switch' context in Function.php on lin

PHP屏蔽错误的方法总结

2021-06-04
1.@屏蔽法 @在php中一个抑制错误的符号,即便是你开启了报错功能,只要在错误语句之前加上@符号,便可屏蔽了错误信息.使用@抑制错误之前,会出现一个警告错误. 2.error_reporting屏蔽法 在php文件开始之前,我们可以加上这样一句话error_reporting(0);这个函数的意思是设置 PHP 的报错级别并返回当前级别,0则代表禁用错误报告. 3.display_errors屏蔽法 前两种方法只能作用于单行或者单个文件,这个则是作用于所有的php文件.打开php.ini文件,

详解PHP解决守护进程Redis假死

2021-06-02
目录 一.一个简单的守护进程示例 二.一个不再假死(伪活)的 Redis 常驻进程示例 一.一个简单的守护进程示例 <?php $redis = new \Redis(); $redis->connect('localhost', 6379); $redis->auth('xxxxx'); // Redis 密码如果没有设置为空字符串. $redis->select(1); $queueKey = 'redis_queue_services_key'; // 业务数据队列. $qu

详解PHP多进程消费队列

2021-06-02
目录 引言 nginx进程模型 进程设计 进程信号量设计 PHP安装修信号量 信号量和系统调用 daemon(守护)进程 命令设计 启动命令 强制停止命令 强制重启命令 平滑停止命令 平滑重启命令 查看进程状态 引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了...... 这种方式每次都要修改crontab,如果进程挂掉了,不会及时的启动,要等到下次crontab执行的时候才会启动.关闭(重启)进程的时候

详解PHP接口签名验证

2021-06-02
目录 概览 常用验证 单向散列加密 对称加密 非对称加密 密钥安全管理 接口调试工具 在线接口文档 扩展 小结 概览 在设计签名验证的时候,一定要满足以下几点: 可变性:每次的签名必须是不一样的. 时效性:每次请求的时效性,过期作废. 唯一性:每次的签名是唯一的. 完整性:能够对传入数据进行验证,防止篡改. 下面主要分享一些工作中常用的加解密的方法. 常用验证 举例:/api/login?username=xxx&password=xxx&sign=xxx 发送方和接收方约定一个加密的盐值

分析PHP的垃圾回收机制

2021-06-01
如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式.很多高层次语言中,你这辈子都是接触不到内存管理的,比如世界上最好的语言php,这种语言替你管理了内存,你就安安心心写烂代码即可.写php的,你说你关心内存,我是不怎么相信的,一定是你在装逼.当然了,如果你用的swoole或者wm或者自己发明的常驻内存级php应用,那你将不得不关注内存泄露问题,也就说一定要记得释放无用变

如何从防护角度看Thinkphp历史漏洞

2021-05-31
目录 Thinkphp RCE漏洞和扫描流量 漏洞原理回顾 Thinkphp漏洞全网扫描 总结 Thinkphp RCE漏洞和扫描流量 漏洞原理回顾 5.0.x版本漏洞 原理在于Thinkphp处理请求的关键类为Request(thinkphp/library/think/Request.php),该类可以实现对HTTP请求的一些设置 Thinkphp支持配置"表单伪装变量",默认情况下该变量值为_method,因此在method()中,可以通过"表单伪装变量"进行

分析五个Laravel Dusk的使用技巧

2021-05-31
目录 1. 填充隐藏字段 2. 模拟 HTML 地理位置 3. 使用 XPath 选择器 4. 整页截屏 5. 访问浏览器错误日志 1. 填充隐藏字段 在测试某些 JS 组件时 (例如自动完成,日期选择器等) ,可能需要编写动作模拟操作与这些组件交互.犹豫这些组件中的大多数最终都会将值保存到隐藏字段中.那么将值直接填写到隐藏字段中可能更加方便.这可以防止不稳定的测试,并确保我们不测试自己不拥有 / 控制的东西 (第三方组件). 尽管 Laravel Dusk 没有为我们提供类似$browser-

详解Swoole TCP流数据边界问题解决方案

2021-05-30
目录 1. 数据发送过程 2. 什么是数据边界 2.1 代码演示 3.EOF 解决方案 3.1 open_eof_check 3.2 open_eof_split 3.3 open_eof_check 和 open_eof_split 差异 4. 固定包头 + 包体解决方案 5. 总结 6. 扩展知识 6.1 字节序 1. 数据发送过程 首先由客户端将数据发往缓冲区 (服务端并不是直接收到的), 对于客户端来说,这次的数据即是发送成功了, 对于服务端是否真正的收到他是不知道的, 然后再由服务端从

如何使用Laravel Eloquent来开发无限极分类

2021-05-30
目录 概述 数据库迁移 Eloquent 模型和关联关系 路由和控制器方法 视图和递归子视图 概述 我们会创建一个微型项目来展示儿童商店的分类,总共有 5 级,如下: 数据库迁移 简单的数据表结构: Schema::create('categories', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->unsignedBigInteger('catego

如何使用PHP对象POPO来优化你的代码

2021-05-29
目录 我们有如下的问题 结论 我们有如下的问题 1.那么在另一种编程语言中 POJO 的名字是什么呢? 关于普通旧对象的约定是 "普通旧编程语言对象".如果你在 Ruby 上,你可以调用 PORO(普通旧 Ruby 对象),也许 Rubyist 已经知道了.如果是在 PHP 中,则被称为 POPO(普通旧 PHP 对象).如果每种语言都有一个类,那么它们都可以实现普通的旧对象. 2.为什么在现代 PHP 编程中使用 POPO ? POPO 可以指导我们了解数据结构,并让我们清楚地了解对

浅谈减少Hyperf框架的扫描时间

2021-05-29
原因 Hyperf框架为了防止用户更新组件后,代理缓存没有更新导致启动报错.增加了以下钩子. { "scripts": { "post-autoload-dump": [ "init-proxy.sh" ] } } 而init-proxy.sh脚本,会执行php bin/hyperf.php di:init-proxy命令清理代理缓存,并重新生成. $ composer init-proxy > init-proxy.sh ../../ R

浅谈PHP7中的一些小技巧

2021-05-29
相同的命名空间,相同的 use 在 PHP 7 之前,开发者经常这么做: use Universe\Saiyan; use Universe\SuperSaiyan; 从 PHP 7 开始: use Universe\{Saiyan, SuperSaiyan}; 函数和常量也是一样的.如果它们属于同一命名空间,则可以对它们进行分组. 常量可以是数组 define('NAMES', [ 'first' => 'John', 'middle' => 'Fitzgerald', 'last' =&g

如何使用PHP7的Yaconf

2021-05-29
简介 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能有十几个甚至数十个.php配置文件, 里面都是各种各样的array, 还有甚者会把一些词典文件(比如中文/英文对照)也放到配置中去. 这就导致配置文件的解析耗费了很大的性能(诚然, 用了opcache能好点, 但是实际上还是有执行的过程). 除了PHP的, 还有用json的, yaml的, 一个共同的特点就是这些配置的可读性比较差. 另外, 他们也都要runtime解析. config目录往往和代码在一起, 首先会有安

详解Laravel服务容器的优势

2021-05-29
概述 laravel服务容器就像一个高度自动化的工厂,你需要的东西,定制好模型,使用特定接口来制造. 因为使用了服务容器,laravel中大部分对象实例化的方式是这样的: $obj1 = $container->make('class1', 'class2'); $obj2 = $container->make('class3', 'class4'); 但是在没有使用服务容器的情况下,以下这种方式同样可以做到: $obj1 = new class1(new class2()); $obj2 =

如何用RabbitMQ和Swoole实现一个异步任务系统

2021-05-28
系统介绍 从图中可以看到,我们这个系统是一个基于事件的异步任务系统.就是说当一个事件产生时,生产者将事件抛给调度器,调度器负责查询事件下有哪些任务,然后将这些任务丢到相应的队列中,最后由消费者消费任务队列中的任务. 在整个系统中主要分为三大部分 1.事件生产者,即产生消息事件的一方. 2.任务调度器(Scheduler),负责注册事件并调度任务. 3.消费者(Worker),负责消费任务队列中的任务. 事件生产者 事件生产者很简单,在业务系统中直接调用即可,代码如下. <?php require

浅谈Laravel中如何对大文件进行加密

2021-05-28
我已经搜索过用于解决此问题的软件包或解决方案,并遇到了这个 Stack Overflow 回答和这个 PHP 解决方案,该解决方案基本上是 Stack Overflow 所描述的解决方案的 PHP 实现. 我决定创建一个为 Laravel 设计的扩展包,使用简单,优雅的语法提供简单的文件加密 / 解密功能. 在这个教程中,我会详细描述加密大文件需要的所有步骤. 首先, 使用 Laravel 安装器创建一个新的 Laravel 项目, 命名为security-app: laravel new se

详解Laravel制作API接口

2021-05-28
需要注意的是:API有它的具体用途,我们应该清楚它是干啥的.访问API的时候应该输入什么.访问过API过后应该得到什么. 在开始设计API时,我们应该注意这8点.后续的开发计划就围绕着这个进行了. 1.Restful设计原则 2.API的命名 3.API的安全性 4.API返回数据 5.图片的处理 6.返回的提示信息 7.在线API测试文档 8.在app启动时,调用一个初始化API获取必要的信息 用laravel开发API 就在我上愁着要不要从零开始学习的时候,找到了这个插件dingo/api那