
PHP
文章平均质量分 55
raoxiaoya
这个作者很懒,什么都没留下…
展开
-
使用vscode编写插件-php语言
使用vscode编写插件-php语言原创 2023-08-21 16:06:20 · 1253 阅读 · 0 评论 -
PHP全部版本下载地址
https://windows.php.net/downloads/releases/archives/原创 2022-08-27 18:31:46 · 744 阅读 · 0 评论 -
捕获php中的错误与异常
捕获php中的错误与异常原创 2022-08-16 10:31:31 · 1134 阅读 · 0 评论 -
base64编码规则
概述当你用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。十六进制在PHP中有一个 bin2hex 可以实现这一点,它将二进制转换成十六进制来表示。$s = "asdfggg我们。。。。。。。。。。。。。。。。";bin2hex($s); //61736466676767e68891e4bbace38082e38082e38082e38082原创 2021-11-08 16:46:30 · 10243 阅读 · 0 评论 -
mb_ord 与 bin2hex
mb_ord返回的是字符在 Unicode 字典中的位置,对于单字节字符来说,这个值就是该字符在磁盘上实际存储的值,但是对于多字节而言,比如汉字,就不一定了,因为这还要取决于你使用的什么编码,比如 utf-8 ,不同的编码会导致存储和传输的规则不一样。比如我们实际存储的就是 utf-8 这一列,而 mb_ord 返回的是二进制这一列。参考所以说 mb_ord 并不能作为字符的二进制值。bin2hex它可以将字符转换成二进制,然后转换成十六进制,是实际存储的值,参考以上面的中字为例bin2h原创 2021-10-28 18:38:50 · 222 阅读 · 0 评论 -
二进制,十六进制 PHP
二进制,十进制,十六进制之间的转换bindec 二进制转十进制decbin 十进制转二进制hexdec 十六进制转十进制dechec 十进制转十六进制二进制转十六进制dechex(bindec("1110")) // e 十六进制转二进制decbin(hexdec("f")) // 1111 base_convert(string $number, int $frombase, int $tobase) 任意进制之间的转换base_convert("11111111",原创 2021-10-22 16:50:53 · 258 阅读 · 0 评论 -
尽量少用相对路径
相对路径,相对的是工作目录(working directory),也就是当前命令行所处的目录(pwd查看);目录结构:D:\dev\php\magook\trunk\server\testdira.php t/ b.php c.txt测试a.phpecho file_get_contents("t/c.txt");D:\dev\php\magook\trunk\server\testdir>php a.phpaaaaaaaaaaaaaaaD:\dev\php\ma原创 2021-10-18 14:42:38 · 242 阅读 · 0 评论 -
报错file_get_contents(): SSL operation failed with code 1
报错内容file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed这和本地环境有关,是否开启了ssl验证。解决方式:修改配置,或者修改代码$stream_opts = [ "ssl" => [ "verify_原创 2021-10-15 15:38:28 · 2315 阅读 · 0 评论 -
导出文件时文件名的处理
文件名首先受操作系统的限制,其次在下载的时候还会受到浏览器的限制,所以文件名需要做一些过滤处理。$filename = str_replace(["\\",'/','|',':','?','*','"','<','>',','], '', $filename);原创 2021-05-17 08:54:29 · 304 阅读 · 0 评论 -
PHP下载文件的正确方式
关于file_get_contents我们都习惯使用 file_get_contents 函数来很方便的实现读取文件,远程资源访问。file_get_contents ( string $filename , bool $use_include_path = false , resource $context = ? , int $offset = -1 , int $maxlen = ? ) : stringfilename要读取的文件的名称。use_include_path注意:As原创 2021-03-19 09:20:37 · 3071 阅读 · 0 评论 -
PHP中关于json_encode转换空数组返回[]而不是{}
在做接口开发的时候,经常需要将结果json化返回给前端,而如果结果集为空的时候,json_encode返回的是空数组[],而不是预期的{},这时候虽然不影响使用,但是前端同学会觉得很怪,需要多做一个判断。$aa = [];$bb = ['a'=>12];echo json_encode($aa), PHP_EOL, json_encode($bb);输出[]{"a":12}为了保持结果的结构一致性,我们需要在空数组的时候也返回空对象。那么应该在 json_encode 的第二个参数填原创 2021-03-08 09:11:18 · 850 阅读 · 0 评论 -
PHP单元测试框架 PHPUnit 提高
在 入门 的基础上再来看这一篇。1、使用注释 @test 来标注需要测试的方法你的测试方法可以是 test 前缀的方法,也可以是包含 @test 注解的方法。public function testSomething(){ $this->assertTrue(true, 'This should already work.');}/** * @test */public function something(){ $this->assertTrue(true, 'Thi原创 2021-03-03 15:49:40 · 407 阅读 · 1 评论 -
PHP单元测试框架 PHPUnit 入门
单元测试非常之重要,好的项目,测试代码比项目代码还多,即便在开发阶段不写单元测试,在项目上线后,功能迭代的时候如果项目很大,小的单元测试可以节省繁琐的深度测试的时间。这篇文章旨在入门 phpunit,虽然大部分框架都已经集成了 phpunit 来作为单元测试,但是你真的知道这里面的过程和细节吗?安装PHPUnit官网:http://www.phpunit.cn/composer global require phpunit/phpunit可以看到 composer 会提示将 phpunit 安装在原创 2021-03-03 11:34:07 · 1270 阅读 · 0 评论 -
左右值无限级分类算法(预排序遍历树算法)
1、为什么要使用左右值来表示无限极分类一般的,我们会使用parent标志来表示节点之间的上下级关系,好处是结构清晰,修改起来很方便,缺点是查找起来稍微麻烦一点,可能需要使用递归查询,递归的使用将会使性能大幅降低尤其是递归层级多的时候。有些查找,比如统计当前节点的所有子节点个数,这就必须要递归到最后一级,所以在类似于这种需要递归到最后一级才能返回结果的场景,我们可以补充以左右值来提升性能。以下是常规的数据结构,数据随机生成:/** * 生成测试数据 * php think data --action原创 2021-03-02 10:47:34 · 2686 阅读 · 0 评论 -
深入理解PHP中的ob_flush和flush的区别
ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情…ob_*系列函数, 是操作PHP本身的输出缓冲区.所以, ob_flush是刷新PHP自身的缓冲区.而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.在apache原创 2021-01-29 11:29:37 · 660 阅读 · 0 评论 -
微信的抢红包算法PHP版
在抢红包这个场景中,大都使用的是修正后的随机算法,从统计学意义上来讲要达到先抢后抢得到的红包是差不多的。微信红包算法的核心是:每次随机的基础是剩余金额除以剩余个数得到的平均值的两倍。class Test{ public $remainSize = 20; public $remainMoney = '10.00'; public $min = '0.01'; public $scale = 2; public function getRandomMoney()原创 2021-01-24 16:19:55 · 1048 阅读 · 1 评论 -
PHP高精度/金钱//数学函数库-bcmath
为什么要使用 bcmath首先我们要明白为什么要使用 bcmath,因为我们平时没怎么使用它们,但是我们在做高精度计算,或者金钱计算的时候对结果要尽可能的精确且可控,但是编程语言对浮点数和大整数的运算,表示,存储方面都存在一定的问题,这个和语言无关。先来看浮点数的问题$f = 0.58;$r = $f * 100;var_dump($r); // float(58)var_dump(intval($r)); // int(57)首先就是你看到的和实际内存中存储的不一致,实际存储可能是 0.5原创 2021-01-22 17:27:56 · 2590 阅读 · 1 评论 -
PHP中的json_encode与中文
我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似"\u***"的格式, 还会在一定程度上增加传输的数据量,一个字符变成了多个字符。类似于这样:<?php$a = [ "name"=>"明里紬", "age"=>21,];$str = json_encode($a);echo $str, PHP_EOL, strlen($str);{"name":"\u660e\u91cc\u7d2c","age":21原创 2021-01-20 14:56:45 · 5120 阅读 · 0 评论 -
PHP获取文件修改时间,访问时间,inode修改时间
<?php$file = "logs.log";var_dump(filectime($file)); // 1611038131var_dump(fileatime($file)); // 1611038134var_dump(filemtime($file)); // 1611038131var_dump(fileinode($file)); // 18182var_dump(filegroup($file)); // 1000var_dump(fileowner($file)原创 2021-01-19 15:31:41 · 900 阅读 · 0 评论 -
PHP中奇葩的 ?:,??,isset,empty
个人感觉,PHP中的关于判断变量是否存在或者为空的语法设计是失败的,分工不明确,界限不清楚,判断起来很容易遗留漏洞,使用PHP开发5年多了,经常看到因为输入参数问题导致的系统错误,即便是工作多年的PHPer,有人把这归结为灵活,但是经验越久越倾向于将函数设计的功能明确且单一,更倾向于确定性的东西,讨厌这种看起来功能多但是模糊的设计,这不能归结为PHP是弱类型语言,而是实现者的问题。isset检测变量是否已设置并且非 null,isset ( mixed $var , mixed $... = ? )原创 2021-01-18 11:02:26 · 755 阅读 · 0 评论 -
使用 PHP-Valgrind 扩展生成 profile 分析 PHP 脚本性能
之前我们使用 XDebug 工具来生成 profile ,后来鸟哥写了个更简单的扩展 php-valgrind ,它依赖于 valgrind 。安装 valgrindyum install -y valgrind或者去 官网 下载 tar 包cd /usr/local/srcwget https://sourceware.org/pub/valgrind/valgrind-3.16.1.tar.bz2tar -jxvf valgrind-3.16.1.tar.bz2cd valgrind-3原创 2021-01-12 16:20:13 · 1179 阅读 · 0 评论 -
PHP程序运行流程:语法分析(Parse)与抽象语法树(AST),PHP-Parser
什么是抽象语法树?在 PHP5中,从 php 脚本到 Opcodes 的执行的过程是:Lexing:词法扫描分析,将源文件转换成 Token 流;Parsing:语法分析,在此阶段生成 Opcodes。PHP7 中在语法分析阶段不再直接生成 opcodes,而是先生成 AST,所以过程多了一步:Lexing:词法扫描分析,将源文件转换成 Token 流;Parsing:语法分析,从 Token 流生成抽象语法树 AST (Abstract Syntax Tree);Compilation原创 2021-01-11 15:29:52 · 2143 阅读 · 0 评论 -
PHP程序运行流程:词法分析(Lexing,Tokenizing,Scanning)
在不开启 Opcache 的情况下,PHP解释器在解释PHP脚本的时候,首先会经过词法分析(Lexing),而词法分析的具体实现就是将PHP代码转换成 Tokens,此过程成为 Lexing / Tokenizing / Scanning 。那么 Tokens 是啥样的呢,Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l (Lex文件),来输入的 PHP代码进行词法分析,从而得到一个一个的“词”,PHP原创 2021-01-10 17:34:31 · 1220 阅读 · 0 评论 -
PHP使用vld扩展查看opcodes
PHP使用vld扩展查看opcodes需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode。下载安装vld扩展该扩展以收录在 PECL下载对应的版本安装修改 php.ini,增加 extension=php_vld.dllphp -m简单使用vld代码<?phpecho 1 + 2;执行$ php -dvld.active=1 test.phpFinding entry pointsBranch analy原创 2021-01-10 16:55:23 · 1056 阅读 · 0 评论 -
PHP程序运行流程:opcache,preload, JIT编译器简介
无opcachePHP是解释性的语言,程序的执行是由解释器来完成的,比如 PHP-FPM, CLI 都是解释器,分别用于不同的场景下。PHP解释器会将脚本以及依赖的其他文件加载到内存,成为待运行的代码。PHP解释器的过程如下:将PHP代码转换成语言片段 Tokens ,这个过程让解释器知道各个程序都写了哪些代码。 这一步称为 Lexing 或 Tokenizing 。将这些 Tokens 转换成抽象语法树(AST),这个过程成为 Parse 。AST 是一组简单而有意义的表达式。有了 AST ,可原创 2021-01-17 15:07:24 · 1133 阅读 · 2 评论 -
PHP8 JIT性能测试
测试代码 testjit.php<?phpfunction feb($n): int{ if($n == 1){ return 1; } if($n == 2){ return 2; } return feb($n-1) + feb($n-2);}$n = 40;$start = microtime(true);echo feb($n), PHP_EOL;$end = microtime(true);e原创 2021-01-07 09:59:29 · 1790 阅读 · 0 评论 -
composer 2.0 报错:No composer.json present in the current directory, this may be the cause of the foll
最近将composer升级到2.0,下载包的时候就报错了。去 packagist 网站能搜到这个包 https://packagist.org/?query=captcha那应该是源的问题吧,因为各种镜像源加速都是拷贝的官方的数据到国内。查看当前使用的哪个源$ composer config --list repos.packagist[repositories.packagist.org.type] composer[repositories.packagist.org.url] http原创 2020-12-31 15:50:21 · 6411 阅读 · 0 评论 -
使用xdebug3的profile文件来分析php程序的性能-QCacheGrind
QCacheGrind 是一个通用的性能分析工具,可以用在PHP(XDebug工具), GoLang(pprof工具)等程序,只要生成的文件符合它的解析协议即可。关于如何使用xdebug以及如何获取profile文件,请先阅读 https://blog.youkuaiyun.com/raoxiaoya/article/details/111984667xdebug 官方描述:https://xdebug.org/docs/profiler我使用的额是windows系统,下载程序 qcachegrindqcach原创 2020-12-30 18:19:26 · 2442 阅读 · 1 评论 -
vscode使用xdebug3调试PHP脚本
我们直到在CLI模式下,PHP脚本可以被轻松的调试,但是在fastcgi模式下,xdebug在何种情况拦截请求并触发调试呢,实际上一套WEB API 只有极少有性能瓶颈的API才需要被debug,每个接口都去记录profile是没必要的。因此,无论是命令行下还是web下的调试都需要人为来触发,实际上,这是合理的,因为大部分时候我们是不需要调试的,一直开启xdebug没有必要,人为触发的方式参考。,那么每次运行php程序xdebug都会去连接服务端,如果你没有启动编辑器的调试,那么php就会抛出错误信息。原创 2020-12-30 15:14:01 · 6160 阅读 · 2 评论 -
PHP使用xlswriter扩展优化Excel导出性能
关于xlswriterxlswriter 是一个 PHP C 扩展,旨在提升php在导出大数据量时的性能问题,支持 windows / Linux 。可用于在 Excel 2007+ XLSX 文件中读取数据,插入多个工作表,写入文本、数字、公式、日期、图表、图片和超链接。它具备以下特性:一、写入100%兼容的 Excel XLSX 文件完整的 Excel 格式合并单元格定义工作表名称过滤器图表数据验证和下拉列表工作表 PNG/JPEG 图像用于写入大文件的内存优化模式适用于 L原创 2020-12-28 15:49:23 · 6422 阅读 · 2 评论 -
PHP将图片验证码转换成base64格式
框架 TP5.0对应的图形验证码包 composer require topthink/think-captcha v1.0.8按照官方的描述其实是直接响应图片的可以查看entry方法:return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');对于前后端分离的项目,为了统一响应参数,需要将转换成base64的格式,转换后的串放到img标签的src字段即原创 2020-12-23 18:11:46 · 2150 阅读 · 1 评论 -
composer查看vendor目录下各包的版本号,升级,降级
有时候需要知道当前 vendor 下下载的各个包的版本号,可以打开 composer.lock 来查看,也可以使用 compoer 命令。查看全部包composer show -i查看指定包composer show guzzlehttp/guzzle -i查看帮助composer show -h...原创 2020-11-29 15:15:10 · 5850 阅读 · 0 评论 -
高性能的 PHP-to-Golang RPC编解码器库 - Goridge
Goridge是高性能的PHP到Golang编解码器库,它可以通过本地PHP套接字和Golang net / rpc包进行工作。 该库允许您以最小的占用空间,结构和[]字节支持从PHP调用Go服务方法。项目地址:https://github.com/spiral/goridge相关文章:https://www.cnblogs.com/tinywan/p/8628457.html...原创 2020-11-06 17:04:35 · 768 阅读 · 0 评论 -
PHPExcel设置数据格式,数据类型的几种方法
问题1:PHPExcel 长数字串显示为科学计数。在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。问题2:输入类似于 0123 的数据到单元格,会被替换为 123 。为了解决以上的问题,需要设置的单元格的数据类型为字符串。方法1、设置单元格为文本$objPHPExcel = new PHPExcel();$objPHPExcel->setActiveSheetIndex(0);$objP原创 2020-10-09 09:44:17 · 3375 阅读 · 0 评论 -
file_put_contents 函数的并发问题与write系统调用
你是否在一个高并发系统里使用过file_put_contents记录日志?那么,你有考虑过它的并发问题吗,它是怎么保证数据不会错乱的?首先来看看函数原型:file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : intflags FILE_USE_INCLUDE_PATH 在 include 目录里搜索 filename。 更多信息可参见 include_pat原创 2020-08-27 09:57:34 · 916 阅读 · 0 评论 -
PHP实现二维数组的横向转纵向 array_map
你或许有过这样的需求,将这样的二维数组 $x1 2 3 4 51 2 3 4 5转换成这样的结果 $y1 12 23 34 45 6一个便捷的方式是使用array_map函数array_map ( callable $callback , array $array1 [, array $... ] ) : arrayarray_map — 为数组的每个元素应用回调函数如果传入多个一维数组,那么这些一维数组的元素个数应该相等,如果不相等会被自动填充空。然后,这些一维数组在同一列原创 2020-08-11 16:40:07 · 1640 阅读 · 0 评论 -
字符串翻转函数 strrev && mb_strrev
strrev 可以实现字符串翻转,但是是针对单字节的操作,遇到多字节字符就会出现乱码,尤其是在前后端交互的时候,javascript是好的,而php结果就对不上。mb 扩展没有 mb_strrev 函数,但是没关系,原理很简单。function mb_strrev($str){ $r = ''; for ($i = mb_strlen($str); $i>=0; $i--) { $r .= mb_substr($str, $i, 1); } retu原创 2020-08-04 09:50:48 · 769 阅读 · 0 评论 -
composer报错:Fatal error: Uncaught PharException: phar “/usr/local/bin/composer“ has a broken signatu
报错内容:composer config -g repo.packagist composer https://mirrors.aliyun.com/composerPHP Fatal error: Uncaught PharException: phar “/usr/local/bin/composer” has a broken signature in /usr/local/bin/composer:23Stack trace:#0 /usr/local/bin/composer(23):原创 2020-07-28 08:29:21 · 2874 阅读 · 0 评论 -
php-fpm中master进程是如何分配任务到子进程的?
为了便于观察,只开启一个子进程vi /etc/php-fpm.d/www.confpm.start_servers = 1pm.min_spare_servers = 1pm.max_spare_servers = 1systemctl restart php-fpmmaster进程ID存放地址/var/run/php-fpm/php-fpm.pidps -ef |grep php-fpmroot 2753 1 0 11:58 ? 00:00:00原创 2020-07-20 18:24:28 · 1307 阅读 · 0 评论 -
php-fpm源码浅析
转载自 https://blog.youkuaiyun.com/barebear007/article/details/87165077php-src/sapi/fpm/fpm/fpm.c关于fpm初始化关键代码0 > fpm_php_init_main() ||0 > fpm_stdio_init_main() ||0 > fpm_conf_init_main(test_conf, force_daemon) ||0 > fpm_unix_init原创 2020-07-20 18:20:37 · 766 阅读 · 0 评论