php技巧

详解PHP设计模式之依赖注入模式

2021-05-25
目的 实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码 用法 DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config .如果没有依赖注入模式, 配置将直接创建 DatabaseConnection .这对测试和扩展来说很不好. 例子 Doctrine2 ORM 使用依赖注入. 例如,注入到 Connection 对象的配置. 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 Connection 对象中. Symfo

浅谈并发处理PHP进程间通信之外部介质

2021-05-25
进程间通信 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法.进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有自己的一部分独立的系统资源,彼此是隔离的.为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信. 根据定义可知,要进行进程间通信,我们需要解决两个问题: 互相访问:消息传输和暂时存储介质选择问题: 协调工作:消息的存取冲突问题: 文章介绍的中心就是围绕着这么两点来说的, 为了更使文章更简明,这边以之前在公司做的一个需求为例: 需要一个循环ID生

详解PHP用mb_string处理windows中文字符

2021-05-25
我们都知道windows中(当然是中文版),文件名和文件内容等编码都是gbk,而我们在开发过程中,IDE里的编码则是UTF-8,(这里不讨论为什么等等问题,只考虑怎么把编码转变成一样的)所以导致我写的UTF-8编码的正则模式字符串中的中文在gbk编码的文件中并不能正确匹配. 一开始,我并没有什么办法,试过把PHP脚本文件的编码也改成GBK,也可以用,但是想到这种方法太low了,所以找一找PHP中有没有函数可以满足我的需求. 这时,我想到了以前在处理windows中的文件名时用的函数iconv()

详解PHP Swoole长连接常见问题

2021-05-25
连接失效问题 例子 其中,Redis常见的报错就是: 配置项:timeout 报错信息: Error while reading line from the server Redis可以配置如果客户端经过多少秒还不给Redis服务器发送数据,那么就会把连接close掉. MySQL常见的报错: 配置项:wait_timeout & interactive_timeout 报错信息: has gone away 和Redis服务器一样,MySQL也会定时的去清理掉没用的连接. 如何解决 1.用的时

详解PHP Swoole与TCP三次握手

2021-05-25
握手常见问题 1.连接拒绝 2.Operation now in progress 多是因为丢包.错误ip.backlog满了&阻塞&tcp_abort_on_overflow=0 3.min(maxconn, backlog) ss -lt 连接拒绝 在TCP三次握手的时候,客户端发送SYN这个包给服务端,服务端不接受这个请求,操作系统直接返回了一个RST的包,来拒绝连接的请求. 最常见的情况就是客户端去请求某个服务器,服务端没有绑定对应的端口. 测试代码如下,服务端代码: <?p

如何用PHP websocket实现网页实时聊天

2021-05-24
前言 最近艰难地"挤"出了一点时间,完善了很早之前做的 websocket "请求-原样返回"服务器,用js完善了下客户端功能,把过程和思路分享给大家,顺便也普及一下 websocket 相关的知识,当然现在讨论 websocket 的文章也特别多,有些理论性的东西我也就略过了,给出参考文章供大家选择阅读. 正文开始前,先贴一张聊天室的效果图(请不要在意CSS渣的页面): websocket 简介 WebSocket 不是一门技术,而是一种全新的协议.它应用 TCP

详解PHP调用Go服务的正确方式

2021-05-24
问题 服务耦合 我们在开发过程中可能会遇到这样的情况: 进程依赖于某服务,所以把服务耦合在进程代码中: 服务初始化耗时长,拖慢了进程启动时间: 服务运行要占用大量内存,多进程时内存损耗严重. 文本匹配服务,它是消息处理流程中的一环,被多个消息处理进程依赖,每次初始化进程要 6秒 左右时间构造 Trie 树,而且服务读取关键词大文件.使用树组构造 Trie 树,会占用大量(目前设置为 256M )内存. 我已经把进程写成了守护进程的形式,让它们长时间执行,虽然不用更多地考虑初始化时间了,但占用内存

详解PHP7开启OPcache和Swoole性能的提升对比

2021-05-24
前期准备 测试所用的主机为虚拟机,虚拟机配置在双核4GB的个人电脑中.虚拟机系统为linux,http服务器采用nginx,用lnmp脚本安装nginx.mysql.php.Laravel框架为7.X版本. 配置站点,在nginx的server块中配置虚拟主机 server{ listen 80; root "/vagrant/www/laravel7/public"; server_name test.laravel.com; index index.html index.php;

详解PHP优化巨量关键词的匹配

2021-05-24
问题由来 前些天工作中遇到一个问题: 有 60万 条短消息记录日志,每条约 50 字,5万 关键词,长度 2-8 字,绝大部分为中文.要求将这 60万 条记录中包含的关键词全部提取出来并统计各关键词的命中次数. 原始 - grep 设计 一开始接到任务的时候,我的小心思立刻转了起来,日志 + 关键词 + 统计,我没有想到自己写代码实现,而是首先想到了 linux 下常用的日志统计命令 grep. grep命令的用法不再多提,使用 grep 'keyword' | wc -l 可以很方便地进行统计

详解PHP服务器如何在有限的资源里最大提升并发能力

2021-05-24
概述 假设报考app是用5W rmb 向供应商采购,报名当天涌入海量考生,并发数飙升至30W+,导致系统宕机,拒绝服务,致使考生无法报名,那么5W rmb 能否支持30W+并发呢? 不过对于我们来说,不妨把问题上升一个角度:「如何在有限的资源里最大提升服务器并发能力」.假设你是一名技术负责人,你在面对一个并发量较大的项目时会如何设计和架构呢? 首先我们可以针对这个项目捋一下大体的思路,从上述描述中不难看出,该项目的瓶颈在于「并发写」而非「读」,因此从资源分配上我们可以向「写」倾斜,在此我将数据全

如何用PHP实现分布算法之一致性哈希算法

2021-05-24
传统算法缺陷 对于服务器分布,我们要考虑的东西有如下三点:数据平均分布,查找定位准确,降低宕机影响. 传统算法一般是将数据的键用算法映射出数字,对其用服务器数量取模,并根据结果选择要存储的服务器.其能达到数据平均分布和查找定位准确的要求,并且优点是算法简单,存取时的计算量都比较小(在数据非常大时才会明显). 但其有一个致命缺点,即一个服务器宕机后的影响很大,我们可以推算一下一台服务器宕机后的影响: 原有数据大部分丢失:服务器数量减少一台,取模数减1导致取模值错乱,如果以前有N台服务器,那么宕机后

PHP的命令行扩展Readline相关函数的使用

2021-05-15
readline 扩展函数实现了访问 GNU Readline 库的接口.这些函数提供了可编辑的命令行.一个例子是在 Bash 中允许你使用箭头按键来插入字符或者翻看历史命令.因为这个库的交互特性,这个功能在你写的 Web 程序中没多大用处,但是当你写的脚本被用在命令行中时非常有用. Readline 扩展的安装 Readline 扩展已经加入了 PHP 的官方安装包中,如果是新的 PHP 环境,那么在编译的时候加上 --with-readline 即可.另外,我们还需要安装操作系统的 Read

PHP的runkit扩展如何使用

2021-05-12
动态修改常量 define('A', 'TestA'); runkit_constant_redefine('A', 'NewTestA'); echo A; // NewTestA 是不是很神奇.这个 runkit 扩展就是在运行时可以让我们来动态的修改一些常量.方法体及类的功能扩展.当然,从系统安全的角度来来,这个扩展并不是很推荐.因为本身常量的含义就是不变的量,本身就不应该修改的.同理,在运行时动态的改变函数体或者类定义的内容都是会有可能影响到其它调用到这些函数或类的代码,所以,这个扩展是

如何在PHP中操作临时文件

2021-05-11
获取 PHP 的默认临时创建文件目录 学习过 Linux 操作系统的都会知道有一个目录是 /tmp 目录( Windows 中一般是:C:\Windows\Temp\ ),它是用来存放系统的一些临时文件的,所以,这个目录也叫做临时文件目录.很多软件都会将一些临时保存的文件放在这个目录里面,包括一些缓存.一些临时生成的脚本之类的.PHP 在默认情况下也会将临时文件目录指向这个目录,包括 SESSION 文件之类的临时文件都会保存在这里.它可以在 php.ini 文件中通过 sys_tmp_dir

你真的了解PHP中的引用符号(&)吗

2021-05-10
引言 最近接手了五六年前的老项目,用的是CI2.0框架,在看框架源码的时候有个地方让我楞了一下,于是有了这篇文章. 字符&的最早历史可以追溯到公元1世纪,最早是拉丁语et (意为and)的连写. &是指逻辑上表示两者属于缺一不可的关系,还表示意思是一个人和另外一个人之意,与and同义. &在PHP项目中是经常使用的一个操作符, 例如按位与丶逻辑操作丶引用变量丶引用传递丶引用返回. 按位与 $a & $b 将把 $a 和 $b 中都为1的位设为1. 奇偶数判断 整数与1进行按

PHP如何获取命令行参数

2021-05-05
使用 PHP 开发的同学多少都会接触过 CLI 命令行.经常会有一些定时任务或者一些脚本直接使用命令行处理会更加的方便,有些时候我们会需要像网页的 GET . POST 一样为这些命令行脚本提供参数.比如在针对某些日期做统计的脚本,就需要传递一个日期给它,这样我们就统计指定日期的一些数据.这类需求应该非常常见,那么,我们都是如何来接收这些命令行的参数的呢?今天,就来介绍一下这方面的内容. $argv 获得所有空格分隔的参数列表 这个变量估计是大家用得比较多的一个接参变量了.它是 PHP 为我们准

PHP中垃圾回收相关函数的使用

2021-05-05
之前我们已经学习过 PHP 中的引用计数以及垃圾回收机制的概念.这些内容非常偏理论,也是非常常见的面试内容.而今天介绍的则是具体的关于垃圾回收的一些功能函数.关于之前的两篇介绍文章,大家可以到文章底部查看. 再谈循环引用以及强制清理循环引用 我们为什么要强调 "循环引用" 呢?其实,在默认情况下,我们直接 unset() 掉一个没有被其他变量引用的变量时,就会让这个变量的引用计数变为0.这时,PHP 默认的垃圾回收机制就会直接清除掉这个变量.比如: $a = new stdClass;

PHP 引用的概念

2021-04-30
什么是引用? 在 PHP 中引用意味着用不同的名字访问同一个变量内容.它不是C的指针,保存的并不是内存地址,无法进行指针运算.引用只是符号表的别名.就像 Unix 系统中的硬链接, Windows 系统中的快捷方式. 上面是官方手册中的原文,怎么说呢,引用其实和我们印象中的C里面的指针并不是相同的概念.指针是针对真实内存的操作,引用是针对指向这个内存的符号表的操作.还是从操作系统的快捷方式来说,快捷方式是可以删的,这就是PHP的引用.而C不仅删了快捷方式,还把原文件也给删了,这就是C的指针操作.

PHP缓存系统APCu扩展的使用

2021-04-28
想必大家都使用过 memcached 或者 redis 这类的缓存系统来做日常的缓存,或者用来抗流量,或者用来保存一些常用的热点数据,其实在小项目中,PHP 也已经为我们准备好了一套简单的缓存系统,完全能够应付我们日常普通规模站点的开发.这一套扩展就是 APCu 扩展. APCu 扩展 APCu 扩展是 APC 扩展的升级,APC 扩展已经不维护了.这两套扩展其实都是基于 opcode caching .也就是 PHP 自身的 opcode 来实现的缓存能力. APCu 的安装就和普通的 PHP

详解PHP中的数据库连接持久化

2021-04-28
PHP中的数据库连接持久化 数据库的优化是我们做web开发的重中之重,甚至很多情况下其实我们是在面向数据库编程.当然,用户的一切操作.行为都是以数据的形式保存下来的.在这其中,数据库的连接创建过程有没有什么可以优化的内容呢?答案当然是有的,Java等语言中有连接池的设定,而PHP在普通开发中并没有连接池这种东西,在牵涉到多线程的情况下往往才会使用连接池的技术,所以PHP每次运行都会创建新的连接,那么这种情况下,我们如何来优化数据连接呢? 什么是数据库连接持久化 我们先来看下数据库连接持久化的定义