![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PHP
文章平均质量分 59
自由de单车
90后程序猿
展开
-
【PHP】PHP7中的引用计数
PHP的变量在底层有一个引用计数(refcount)属性,这个引用计数是为垃圾回收(GC)服务的,当引用计数变为0的时候,就代表这个变量可以被回收。但也不是所有的数据类型都支持引用计数,例如一些简单类型如整型、浮点型、布尔型、NULL等,它们就不支持(表现为 refcount 的值恒为0)。不支持 refcount 的数据类型,不会被GC回收,它们在请求结束时才会释放。可以使用函数查看变量的refcount(需要安装xdebug// 整型$a = 1;// 浮点型$a = 1.1;// 布尔型。原创 2024-04-22 17:57:56 · 1065 阅读 · 0 评论 -
【PHP】对称加密算法 AES-256-GCM 代码示例
下面介绍在PHP代码中,如何对数据进行 AES-256-GCM 加密和解密。原创 2023-11-02 15:46:56 · 1622 阅读 · 0 评论 -
【PHP】如何关闭buffer实时输出内容到前端
默认情况下,我们在PHP里使用echo等函数输出的内容,是不会马上发送给前端的,原因是有 buffer 的存在,buffer又分两处,一处是PHP本身的buffer,另一处是Nginx的buffer。原创 2023-09-28 10:51:02 · 398 阅读 · 0 评论 -
【PHP】一个简单的抽奖函数
设置N个奖品,为每个奖品设置一个抽中概率,然后程序根据概率进行抽奖。原创 2023-06-13 17:56:21 · 827 阅读 · 0 评论 -
解决PHP项目在Docker(WSL2)中运行缓慢的问题
最近在使用Docker容器运行PHP项目的时候,发现特别缓慢。原创 2023-03-28 01:37:26 · 4625 阅读 · 5 评论 -
Laravel门面实现原理
在Laravel中,门面为应用服务容器中绑定的类提供了一个“静态”接口,使得我们可以不用。的对象,服务容器会帮我们实例化出对应的对象(前提是已经绑定好)。方法,获取到一个service_id(暂且这么叫吧),然后传给。静态变量中,这样下次再获取相同对象时,就不用重复实例化了。方法创建出一个对象,然后在这个对象上真正执行我们的方法。这些类出来,就可以直接通过静态接口调用这些类中的方法。当我们静态调用一个不存在的方法时,例如。,这个魔术方法就会被调用。这里通过我们自定义门面类中的。是一个对象,但它实现了。原创 2023-02-08 22:56:49 · 994 阅读 · 0 评论 -
用GBK编码写PHP代码会发生什么事情?
在互联网领域,UTF-8编码已经几乎成为了标配,无论是网页、数据库还是代码文件等等,都广泛使用UTF-8作为编码方式。我平时写PHP代码时,文件的编码也都是使用UTF-8,今天突然想尝试一下,如果使用其它编码,会有什么后果呢?原创 2022-05-22 18:07:39 · 308 阅读 · 0 评论 -
[PHP] unicode码、UTF-8码、字符的相互转换
unicode与UTF-8unicode是一个大型字符集,unicode字符集收录了世界上所有的字符,并且为每一个字符分配了一个唯一的数字类型的ID值,这个ID在英文中叫unicode code point,下文统称为unicode码。例如中文的 “严” 字,它的unicode码是\x4e25(十六进制)。因此unicode本质上是一个key-value映射表,key是unicode码,value是对应的字符。下文中的十六进制数字,统一会在数字的前面加上 \x 前缀,方便识别。接下来的问题是,这个原创 2022-05-21 18:31:12 · 2557 阅读 · 0 评论 -
在PHP中如何截断带HTML标签的富文本字符串
前言在开发中,截断字符串是一个常见的操作。在PHP中,截断字符串十分方便,使用mb_substr函数就可以。但这只是针对普通的字符串而言,如果要截断的是一个带HTML标签的富文本字符串,就不能简单的使用这个函数了。大部分HTML标签都是成对出现的,我们不能在一对标签的中间进行截断,也不能把标签本身截断,否则就会出问题。代码为了解决这个问题,我使用了DOMDocument这个类(需要安装libxml扩展)来实现HTML字符串的截断操作,代码如下:<?phpclass HtmlText{原创 2022-05-11 00:10:53 · 711 阅读 · 0 评论 -
CORS跨域不能携带cookie的问题
环境Chrome浏览器100.0.4896.127正式版前言最近在做web需求时,遇到了一个跨域的问题:浏览器有一个cookie,这个cookie的domain是.rocky.com,path是/。网页域名是 www.rocky.com,网页会使用ajax请求sub.rocky.com域名下的一个接口获取数据,奇怪的是,在请求ajax接口时浏览器没有在请求头里带上cookie。最后通过网上查资料得知,原来这个ajax请求跨域了,原因是接口域名(sub.rocky.com)跟网页域名( www.r原创 2022-04-30 15:17:30 · 3353 阅读 · 0 评论 -
使用docker搭建LNMP开发环境
宿主机环境系统:ubuntu 18.04docker版本:18.03.1-cedocker的安装请自行参考官方文档。前言这篇文章用于介绍如何使用docker搭建一个LNMP开发环境,下面我们将会编写Dockerfile,基于官方docker hub的镜像,分别构建我们自己的镜像,然后运行。要构建的镜像有:PHP-FPM 7.4Nginx 1.19MySQL 5.7Redis 6.2为什么不直接使用官方镜像,而是自己再构建一个?因为官方镜像一般安装的东西都很少,例如PHP-FPM的原创 2022-04-01 14:08:19 · 6224 阅读 · 2 评论 -
使用composer时需注意的问题
composer install使用此命令必须先创建composer.json文件。composer.lock不存在时:安装composer.json里指定的依赖包,并创建对应的composer.lockcomposer.lock存在时:忽略composer.json文件,如果composer.lock里指定的依赖包已全部安装好,则什么都不干;如果有依赖包还没安装,则进行安装。平时做开发时,除了composer.json以外,lock文件也应提交到代码库中。因为有了lock文件,其他团队成员就原创 2022-03-19 22:45:15 · 647 阅读 · 0 评论 -
ubuntu安装swoole后报错:undefined symbol: json_globals
环境Ubuntu Server 18.04PHP 7.2Swoole 4.8.7过程今天使用PECL的方式安装完swoole扩展后,按照官方文档指示,在php.ini文件中添加了extension=swoole.so但添加完后,执行php -m命令并没有发现有swoole扩展,说明扩展没有加载成功。首先是怀疑加载的php.ini文件路径不正确,于是使用php --ini命令查看文件路径:虽然配置文件路径正确,但看到有一个Warning错误:undefined symbol: json_原创 2022-03-08 21:35:34 · 780 阅读 · 0 评论 -
在Laravel中创建Service Provider和Facade
环境Laravel 5.4前言下面我们以“音乐播放器”为例子,介绍如何在Laravel中创建一个Service Provider,并且为这个Provider创建一个门面(Facade)。创建自定义Service Provider1)既然是音乐播放器,那肯定会有播放功能,因此先定义一个音乐播放器的接口,接口有一个play方法,文件路径app/Helpers/Contracts/MusicPlayerContract.php:namespace App\Helpers\Contracts;int原创 2022-03-06 16:32:04 · 944 阅读 · 0 评论 -
Laravel报错:Class ‘xxx‘ does not exist
环境Laravel 5.4前言最近在学习Laravel框架,想创建一个Service Provider(服务器提供者)练练手,但创建完之后,无论如何都无法通过make方法获取到服务对象,页面会报Class 'xxx' does not exist的错误,如下图:代码服务提供者:namespace App\Providers;use App\Helpers\MusicPlayer;use Illuminate\Support\ServiceProvider;class MusicPla原创 2022-03-05 22:19:58 · 1048 阅读 · 0 评论 -
PHP防范XSS攻击
定义XSS(Cross Site Scripting)攻击,中文名为跨站脚本攻击,是一种常见的网页攻击方式。攻击者在web页面中插入一些恶意的javascript或HTML代码,当用户浏览该页面的时候,嵌入到web页面中的javascript/HTML代码会被执行,从而达到攻击目的。一个简单的例子就是网页中的评论功能,用户编写一段javascript代码(见下面)提交到服务器,如果不做过滤就直接显示出来的话,就会导致用户一打开页面就会有弹窗提示“你被攻击了”。<script>window原创 2022-03-03 16:57:27 · 2784 阅读 · 0 评论 -
PHP使用pcntl扩展创建多进程高效处理任务
前言如果一个PHP脚本要处理10个任务,每个任务需要耗时1分钟,使用默认的单进程处理的话,需要耗时10分钟;但如果改成多进程的话,将这10个任务分配给10个进程处理,每个进程处理其中一个任务,则总耗时只需要1分钟,大大提高了效率。下面介绍如何使用PHP的pcntl扩展来创建多进程。代码<?php$parentPid = getmypid(); // 父进程ID$childNum = 3; // 要创建的子进程数量echo "父进程[$parentPid]准备fork $childNum原创 2022-02-24 18:25:35 · 822 阅读 · 0 评论 -
【PHP】苹果登录(sign in with apple)后端验证
第一种方法:通过苹果JWK来验证identityTokenAPP端登录成功后,会拿到一个identityToken的字段,里面的值是一个JWT,以.符号分隔,分为header、payload、signature三部分,类似长这样:eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLnJ1c3VwZXIueXkzZCIsImV4cCI6MTYyMjcz原创 2021-06-05 17:35:21 · 2849 阅读 · 1 评论 -
聊聊在PHP中如何处理错误
前言在PHP中,如果代码发生错误,PHP默认会把错误信息直接输出到页面,如下图:这样会将敏感信息暴露给用户,十分不安全,因此通常会使用set_error_handler设置一个自定义的错误处理函数,在此函数中我们可以对发生的错误做出统一处理,例如将错误信息记录到日志、结束脚本运行等等:set_error_handler(function($errno, $errstr, $errfile, $errline) { $errInfo = [$errno, $errstr, $errfile,原创 2021-06-03 23:03:17 · 313 阅读 · 2 评论 -
PHP中spl_autoload_register和__autoload区别
前言在PHP里,有两种方法可以实现类的自动加载,第一个是定义__autoload函数,第二个是使用spl_autoload_register函数。// 加载类时,PHP会自动调用此函数,无需手动调用function __autoload($class) { // 自动加载逻辑}spl_autoload_register(function($class) { // 自动加载逻辑});区别__autoload只能有一个自动加载逻辑,而spl_autoload_registe原创 2021-05-25 16:04:43 · 328 阅读 · 0 评论 -
PHP curl并发请求
前言使用PHP的curl函数调用多个外部HTTP接口时,默认情况下是需要一个一个执行的,第一个请求结束后才会发起第二个请求,这样会显得效率低。如果各个请求之间没有强依赖关系,可以使用curl的多线程函数来发起请求,这样可以节省很多时间,提高效率。代码<?phpfunction main() { $requests = [ [ 'url' => 'https://www.baidu.com', // 请求URL 'me原创 2021-03-18 15:22:02 · 1435 阅读 · 1 评论 -
慎用ubuntu的apt autoremove命令
前言最近线上有好几台服务器的PHP定时脚本突然报错了,报错信息是Class 'Memcache' not found,看起来像是PHP没安装memcache扩展导致的,用php -m命令查看下扩展列表,确实没安装。原因但是之前一直好好的,为什么现在才突然报错呢?用history命令查看最近执行过的命令,发现运维人员执行过apt autoremove命令,这个命令会把所有自动安装且不再使用的软件包卸载掉,网上比较多人说这个命令会误把一些仍然有在使用的包卸载,从而导致一系列问题。因此怀疑是这个命令把PHP原创 2021-03-07 13:49:58 · 1933 阅读 · 0 评论 -
PHP之memcache扩展和memcached扩展
前言在PHP里,如果想连接memcache服务器,需要安装扩展。PHP提供了两个扩展,一个叫memcache,一个叫memcached。下面是两者的区别:memcached扩展的发布时间比memcache晚memcached扩展需要依赖libmemcached,libmemcached是memcache提供的官方客户端,因此memcached扩展是libmemcached的二次封装。而memcache扩展不需依赖libmemcachedmemcached扩展不支持windows系统,只支持linu原创 2021-03-06 16:12:03 · 453 阅读 · 0 评论 -
PHP使用http2协议调用苹果APNs接口
前言旧版的苹果APNs接口将会在2021年3月9日废弃,因此需要迁移到新的http2协议接口。准备工作在调用新接口前,需要先确认服务器是否支持http2协议,在Linux服务器上执行以下命令:curl --http2 'https://www.baidu.com'curl: (1) Unsupported protocol如果显示Unsupported protocol,则代表服务器不支持http2协议,需要升级curl,如果使用的是ubuntu系统,可以参考这篇文章升级。代码functi原创 2021-02-21 11:36:59 · 1503 阅读 · 0 评论 -
PHP cURL获取HTTP响应头
平时做开发时,经常会用到PHP的cURL扩展,用于请求外部HTTP接口。大多数情况下,我们只需要获取口返回的响应体(HTTP response body),但如果我们想获取响应头(HTTP response header)那可以怎么做呢?可惜的是,cURL扩展没有提供原生的方法让我们(以数组的形式)直接获取响应头,只能通过稍微复杂一点的方法来获取。直接上代码:<?phpfunction headerHandler($curl, $headerLine) { $len = strlen(原创 2021-02-08 15:27:43 · 5164 阅读 · 2 评论 -
PHP进程卡死和MySQL超时时间的设置方法
前言最近线上一台服务器的nginx每隔几分钟就会有几个请求(不是所有请求)报upstream timed out (110: Connection timed out) while connecting to upstream的错误,看起来像是后端的phpcgi进程出问题了,但如果phpcgi进程有问题,不是应该所有请求都会报错才对么,于是展开排查。查找原因在我们服务器上,phpcgi是使用9000端口进行监听的,执行sudo netstat -an | grep 9000命令查看相关进程的网络状态原创 2020-11-18 16:09:17 · 1099 阅读 · 2 评论 -
PHP如何限制mysql SQL语句的执行时间
前言当PHP查询mysql的时候,如果SQL语句的性能很低(例如全表扫描),或者mysql服务器负载很高,那么这个SQL语句可能要好几十分钟甚至更久才能查询完毕,PHP进程同样也会被这个查询语句阻塞很久,直至SQL执行完毕才能处理下一个请求,对于web请求来说这是不能忍受的,那么如何限制SQL语句的最大执行时间呢确认驱动PHP里可以使用pdo_mysql或mysqli扩展连接数据库(后续代码均已mysqli为示例),这两个扩展底层都是使用libmysql(又称MySQL Client Library)原创 2020-08-18 11:01:17 · 962 阅读 · 1 评论 -
CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT的区别
前言PHP的cURL函数中,有两个超时选项设置,CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT,这篇文章简单说下这两个设置的区别。区别CURLOPT_CONNECTTIMEOUT:连接对方主机时的最长等待时间,此设置限制的是建立连接过程的时间,其它过程的时间不在控制范围CURLOPT_TIMEOUT:整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的因此,两者是包含和被包含关系,CURLOPT_CONNECTTIMEOUT是CURLOPT_原创 2020-08-11 11:15:53 · 9823 阅读 · 0 评论 -
Yii2中集成Markdown编辑器
身为一个程序员,我们都知道Markdown编辑器在IT网站应用得非常广泛,比如GitHub、SegmentFault、CSDN博客、YiiChina上都可以见到它的身影,因此,下面介绍下怎么在Yii2框架中集成Markdown编辑器。在Yii2中集成Markdown编辑器,可以使用yii2-lepture-markdown-editor-widget这个第三方扩展。按照GitHub上的文档介绍,我们原创 2015-06-06 21:35:13 · 2018 阅读 · 0 评论 -
在PHP中var_dump()函数输出不完整的问题
php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符,较深的数组元素也被显示成省略号。这点会带来一些不便,我们修改配置文件,设置这些。在php.ini里的xdebug节点中,加入如下xdebug.var_display_max_children转载 2014-06-07 16:37:22 · 5717 阅读 · 0 评论 -
PHP如何获取世界各地的时间
在PHP里获取时间很简单,使用date函数就可以了,但date函数获取的是当前时区(php.ini文件里配置的时区)的时间,如果想获取其他时区的时间可以怎么做呢?获取其它时区的代码&lt;?php/** * 获取不同时区的时间字符串 * @param string $format 字符串格式 * @param string $timeZone 时区 * @return string...原创 2019-02-24 19:07:10 · 1987 阅读 · 0 评论 -
PHP进程信号处理
<?phpwhile (1) { echo "I am doing something important\n"; echo "If i am interruptted, the data will be corrupted\n"; echo "Be careful\n"; echo "\n\n"; sleep(5);}假设现在有以上这么一个P...原创 2018-05-01 14:37:05 · 747 阅读 · 0 评论 -
splFixedArray和PHP array的简单性能测试对比
自从5.3版本开始,PHP在SPL扩展中提供了一个叫做splFixedArray的数组[链接],splFixedArray数组相比标准的PHP数组更接近于C语言的数组,而且由于splFixedArray没有使用散列(Hash)存储方式,因此效率更高。下面我们就写一个简单的脚本来测试一下它们两者之间的性能差别。测试环境Windows 8.1 64位 WampServer 2.4测试脚本代码<?php原创 2015-03-29 12:56:36 · 3295 阅读 · 0 评论 -
使用composer安装Yii 2.0时遇到的一个问题
Yii 2.0相对1.0版本变化比较大,连安装方式都不一样了(变复杂了),按照官方网站的说明,他们建议使用composer这个程序来下载和安装,好吧,那我就按照他们的建议来安装,下载和安装好composer后,就输入安装指导文档上的命令来下载composer的插件,结果提示下面错误:去google了一下,发现如果是在windows上使用exe文件来安装composer的话,上面安装插件原创 2015-03-28 10:18:01 · 1120 阅读 · 0 评论 -
关于php.ini开启zlib压缩输出导致乱码的问题
关于php.ini开启zlib压缩输出导致输出乱码的问题原创 2014-12-06 11:58:14 · 2529 阅读 · 0 评论 -
PECL和PEAR有什么区别?
PEAR是“PHP Extension and Application Repository”的缩写,即PHP扩展和应用仓库。PEAR 将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈现、数据库访问、文件操作、数据结构、缓存操作、网络协议、WebService 等许多方面,用户可以通过下载这些类库并适当的作一些定制以实现自己需要的功能。避免重复发明“车轮”。PEAR 的出现转载 2014-12-21 14:44:32 · 765 阅读 · 0 评论 -
PHP批量移除UTF-8文件BOM头的代码实例
PHP程序猿应该都知道,对于PHP来说,BOM是一个大麻烦,原创 2014-10-16 14:23:10 · 741 阅读 · 0 评论 -
PHP的类型约束
PHP 5 可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字),接口,数组(PHP 5.1 起)或者 callable(PHP 5.4 起)。不过如果使用 NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。类型约束不能用于标量类型如 int 或 strin转载 2014-08-12 16:38:46 · 936 阅读 · 0 评论 -
PHP中如何检测一个值为null的变量是否存在
检测变量是否,通常想到的是使用isset()函数,但是原创 2014-09-21 17:24:34 · 4149 阅读 · 0 评论 -
在Yii框架中如何使用PathInfo形式的URL
第一次部署好Yii框架搭建的应用h原创 2014-07-31 15:44:23 · 1224 阅读 · 0 评论