- 博客(287)
- 资源 (1)
- 收藏
- 关注
原创 PhpSpreadsheet 读取 excel 里面的图片
使用 phpSpreadSheet 插件去读取 excel 里面的图片时发现坑点很多,这里做一个总结。这里会把excel里面的图片读取,然后存放到服务器指定的目录。解决方案:不要使用.xls格式的excel,使用.xlsx。在composer.json配置。我使用的是 tp 框架。composer安装。
2024-03-21 10:59:11 415
原创 Golang 方法的接收器 receiver 指针和值的区别
在 Go 语言中,如果一个方法的 receiver 是某个类型的指针,那么该类型的值和指针都可以调用这个方法。这是因为当 receiver 是指针类型时,Go 会自动进行指针解引用,以便让你方便地对这个类型的值进行操作。incr 方法的 receiver 是 Count 类型的指针。因此,既可以使用 Count 类型的值,也可以使用指向 Count 类型的指针来调用 incr 方法。
2024-03-07 10:55:16 364
原创 Golang 写日志到文件
os.O_EXCL: 与O_CREATE一起使用时,要求文件必须是新创建的,如果文件已经存在则返回错误。os.O_TRUNC: 如果可能,打开文件时先将文件内容清空。os.O_CREATE: 如果文件不存在则创建新文件。os.O_RDONLY: 以只读方式打开文件。os.O_WRONLY: 以只写方式打开文件。os.O_APPEND: 在文件末尾追加数据。os.O_SYNC: 打开文件用于同步I/O。os.O_RDWR: 以读写方式打开文件。
2024-03-07 09:38:34 534
原创 Golang 常用的时间转换
注意,这个时间2006-01-02 15:04:05完全不能改,是一个固定的时间(我不理解)Go 1.20之后增加的三个常量。
2024-03-06 15:38:14 428
原创 什么是 Golang 类型断言
在这里,areaIntf被赋值为sq1,而sq1是一个*Square类型的指针。因此,areaIntf包含了*Square类型的值,所以类型断言(areaIntf.(*Square))会返回一个非nil的*Square类型的指针,并且ok的值为true,表示类型断言成功。在Go语言中,类型断言返回两个值:转换后的值和一个布尔值,表示转换是否成功。类型断言:用于检查某个接口是否包含某个具体类型,语法x.(T),x是一个接口类型表达式,T是具体的类型,如果x包含的值可以被转换成T类型,则是ok。
2024-03-06 14:09:51 330
原创 Golang pprof 分析程序的使用内存和执行时间
也是可以通过 top 和 list 某个函数步骤去查看具体信息。-alloc_space:查看分配空间相关的信息。-inuse_space:查看当前内存使用情况。
2024-03-04 19:34:54 1110
原创 Golang Ants 构建协程池
2、当任务数大于协程数时,一个协程可以同时处理多个任务。3、监控是哪个协程ID处理了具体的任务。1、限制协程池里开启的协程数量。
2024-03-04 15:09:07 565
原创 Golang 函数中 defer 和 return 的调用顺序
2)关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数。2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=10。2)在函数最后返回前,执行defer()操作,对ret进行+1操作,这时候ret=2。1) 函数先是执行到return 1,然后根据函数的声明,把1赋值给ret。1) 函数先是执行到return 9,然后根据函数的声明,把9赋值给ret。3)函数最终返回ret,所以2被main()所打印。
2024-02-29 20:39:52 306
原创 Golang 关于 interface 接口的理解
因为 Redis 类型实现了 StorageManager 接口中定义的所有方法(记住,是所有方法都必须实现定义)。在Go语言中,如果一个类型包含了接口中定义的所有方法,那么该类型就隐式地实现了该接口。在这里,Redis 类型实现了 insertData 和 updateData 方法,因此它可以被当做 StorageManager 类型使用。
2024-02-26 19:31:04 475
原创 Golang 语法系列:结构体
以上面的Person为例子,其实是通过一个函数来返回一个结构体指针实现的。5)格式5:通过&运算符直接对结构体进行取地址操作,然后完成实例化。4)格式4:通过new()函数实例化。// name age字段可以省略。2)格式2:通过键值对声明。3)格式3:匿名结构体。结构体:相当于"类"
2024-02-21 14:19:37 483
原创 PHP 通过 Redis 解决并发请求的操作问题
SETNX(SET if Not eXists)是 Redis 中的一个原子命令,用于设置键-值对,但只有在键不存在时才执行设置操作。可以利用 SETNX 命令来实现并发请求的互斥处理,确保只有一个请求能够成功执行。需要注意的是,即使 SETNX 返回 1,表示当前请求获取到了锁并执行了业务逻辑,仍需要在合适的时机释放锁,以防止死锁情况的发生。如果 SETNX 返回 1,表示当前请求是第一个获取到锁的请求,可以执行相应的业务逻辑;如果 SETNX 返回 0,表示已经有其他请求获取到了锁,当前请求不处理。
2023-08-31 10:36:49 968
原创 Python 计算两篇文章的相似度
日常工作中,我们偶尔会遇到比如判断两篇文章是否雷同,可以通过计算两篇文章相似度去判断,下面是通过python实现的方式
2023-08-21 16:41:36 364
原创 Chatterbot 打造游戏AI客服机器人
这也是我自己探索出来的,之前没用分词工具的时候,发现拟合度很差,后面猜测是框架的计算对中文不准确,对中文的分词效果很差,导致计算出来的词向量其实是误差很大的。中文没有像英文一样的明显的单词边界,因此需要使用专门的中文分词工具将中文文本分成有意义的词语,这样计算出来的词向量才是比较精准的。简单来说,存储适配器提供了一个接口,允许ChatterBot连接到不同的存储技术,不指定默认使用 SQLite 数据库存储聊天记录,会在执行程序的目录生成一个db.sqlite3文件。如果存在,则返回包含结果的响应。
2023-06-20 10:02:51 2002
原创 Chatterbot 23.6.15 踩坑经历
执行报错:OSError: [E050] Can't find model 'en'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.在 segmentfault 上找到的大神的答案,要修改源文件 ...lib\site-packages\chatterbot\tagging.py。发现chatterbot使用的是旧的spacy模型,
2023-06-15 11:26:50 125
原创 基于 PHP 的 Kafka 底层公共类的封装和调用
以TP5.0框架为例,在extend/创建RdKafkaClient.php。如何在 Thinkphp 5.0 下使用 kafka,5分钟上手!注:本文用到的是rdkafka公共类库,
2023-05-06 20:09:32 436
原创 PHP Curl 使用 @ 上传文件失败的解决方法
遇到过一种情况,使用@+文件路径进行文件上传,然后Curl Post到另一个接口,发现测试环境是正常的,但正式环境却无法上传post不成功。如果不是上述php版本,则在curl配置。第一步,判断当前的 php 版本。
2023-04-18 19:31:19 342
原创 Json_decode 遇到非 UTF-8 等特殊字符解决方案
需要解析的字符串包含特殊符号,这时候直接通过 json_decode 返回 NULL。然后通过过滤得到字符串:甛?eЮ,然后再 json_decode 可以返回正常格式。我的解决方案,把特殊字符转成?
2022-09-05 15:44:29 779 1
原创 Git 版本管理工具最常用命令集合
GIT优势:分布式、多分支、速度快灵活、Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,所以处理起来速度飞快一、创建项目git init # 将一个目录初始化为 Git 仓库git clone [url] # 复制一个git仓库二、基本快照git add [file] # 添加文件到缓存git status -s # 查看你的文件在工作目录与缓存的状态,返回的文件状态 ...
2022-05-09 17:35:05 413 4
原创 MySQL 出现数据库表被锁解决方案
一、出现的现象页面出现502错误,数据库CPU持续飙升,大量事务堆积未提交成功(事务一直处于阻塞阶段)查看阻塞事务列表,发现其中有锁表现象。二、排查与解决思路1)查看数据库中是否有表被锁show open tables where in_use > 0;如果上述返回有结果,说明有表正在被使用,返回字段如下| Database | Table | In_use | Name_locked |2)查看进程(只会显示当前用户的进程,除非是root用户)show pr.
2022-05-04 19:41:13 11390
原创 利用 PHP Trait 提高代码复用性
一、什么是 traitTrait 是从 PHP 5.4 加入的一种细粒度代码复用的语法。以下是官方手册对 Trait 的描述:Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 t
2022-05-01 16:42:42 152
原创 Linux 系统级别与进程级别的文件句柄数限制
一、控制单个shell进程的资源命令 ulimithelp ulimit参数: -a 显示目前资源限制的设定。 -c <core文件上限> 设定core文件的最大值,单位为区块。 -d <数据节区大小> 程序数据节区的最大值,单位为KB。 -f <文件大小> shell所能建立的最大文件,单位为区块。 -H 设定资源的硬性限制,也就是管理员所设下的限制。 -m <内存大小>...
2022-04-30 23:00:00 554
原创 Swoole 介绍以及三步快速安装 swoole 教程
通过 swoole 可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 服务确保系统已经安装以下软件php-7.2 或更高版本gcc-4.8 或更高版本makeautoconf一、获取源码https://pecl.php.net/package/swoole二、编译安装wget https://pecl.php.net/get/swoole-4.8.9.tgztar -zxvf swoole-4.8.9.tgzcd swoo
2022-04-28 11:41:36 2807
原创 手把手写一个简单的 PHP 扩展
手把手教你写一个PHP扩展,以下通过PHP7.4版本实现,其他版本可能有差异,但整体流程相当。一、从官网下载源码包PHP: Downloads二、创建模块解压源码,找到 ext 目录,通过下面命令创建一个扩展模块./ext_skel.php --ext mymodel创建成功后,会有以下提示:三、编写模块的函数找到创建的模块路径 ext/mymodel1)在头文件声明函数找到 php_mymodel.h在这个头文件中声明了一个名为 mymodel的PHP空间
2022-04-26 19:42:23 1244
原创 分享一段 PHP 数组打印格式美化的函数
function print_R($vars, $label = '', $return = false) { if (ini_get('html_errors')) { $content = "<pre>\n"; if ($label != '') { $content .= "<strong>{$label} :</strong>\n"; } $content .=.
2022-04-25 16:34:02 822
原创 Php://input 和 $_POST / $http_raw_post_data 区别
一、php://input 介绍官网原话:php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-dataphp://
2022-04-25 15:28:14 2368
原创 Redis 大键值对 Big Key 懒惰删除机制
一、懒惰删除介绍在删除元素数量很多的集合(set/hash/list/sortedSet)时,无论是使用DEL命令删除还是redis为了释放内存空间而进行的删除,在删除这些big key的时候,会导致redis主线程阻塞。在redis 4.0版本中,提供了lazy free(懒惰删除)的特性解决 big key 删除导致的主线程阻塞的问题。使用lazy free删除big key时,和一个O(1)指令的耗时一样,亚毫秒级返回(返回结果不会产生等待阻塞),真正删除key的耗时动作交由后台子线程执行
2022-04-25 14:39:33 1129
原创 Redis 过期 key 清理删除策略汇总
Redis 底层使用了三种策略来清理过期的key一、被动清理触发条件:读/写一个已经过期的key当读写一个key时,Redis首先检查key是否存在,若存在且已经过期,则删除key的同时返回nil给客户端二、定期清理触发条件:Redis定期检查redis会定期执行清理过期key的任务,运行频率由redis.conf中的hz参数决定,取值范围1~500,默认是10,代表每秒运行10次。清理过程如下:1)遍历所有的db2)从db中设置了过期时间的key的集合中随机检查20个
2022-04-22 15:55:03 2633
原创 Redis 内存占满导致的 Setnx 命令执行失败
一、问题发生正常情况下,通过 setnx 设置的一个锁,应该会1s后过期(防止并发请求,处理相同逻辑),但是实际发生的情况是,第一次处理下面的逻辑,就抛出异常。说明 setnx 函数返回了 false。$redis_key_lock = 'lock'; //@todo 设置了一个1s的锁$lock = $redis->setnx($redis_key_lock, 1);//@todo 锁将会在1s后过期$redis->expire($redis_key
2022-04-22 11:39:16 2008
原创 Redis 异常 read error on connection 解决方案
造成原因与场景:在接口连接 redis 时,在 Redis->auth() 中抛出异常:PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection'出现原因:通过 pconnect 的 redis 长连接不会主动释放,会一直保持在php-fpm进程中,等待完成下一个请求的任务。这样会出现以下两种情况:1)假如这个连接已经断开了,下个请求可能直接使用上个断..
2022-04-20 14:31:07 4989
原创 常用的 Linux Curl 命令
一、a&b&c 格式curl -d "player_id=1&msg=2" http://test.com二、json 格式curl -H "Content-Type:application/json" -X POST -d '{"a":10,"b":"12"}' http://test.com
2022-04-18 16:28:00 386
原创 Php-fpm 与 FastCGI / CGI 的关系
一、CGI协议CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。运行原理客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器
2022-04-15 12:01:01 874
原创 GET 请求参数过大导致HTTP错误码 414 / 500 的问题
看了很多文章描述,通过修改nginx配置可以解决 414 Request-URI Too Large 的问题,比如可以调大这些参数:client_header_buffer_size 512k;large_client_header_buffers 4 512k;client_max_body_size 100m;如果调大后,重启nginx,发现请求变成了 500 Internal Server Error,查看具体的 nginx 错误日志:[alert] 8300#0: *173067
2022-04-12 19:25:16 4887 1
原创 Javascript 实现一个分钟秒钟倒计时器
<span id="minute">5</span>分<span id="second">0</span>秒<script>var minute = document.getElementById("minute");var second = document.getElementById("second");var timer = setInterval (function(){ .
2022-04-12 17:14:13 2167
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人