自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猛犸象

一只不知疲惫的猛犸

  • 博客(31)
  • 收藏
  • 关注

原创 mysql事务的四个特性和隔离级别

事务的四大特性(ACID)原子性(Atomicity)事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。一致性(Consistency)事务发生前和发生后,数据的完整性必须保持一致。隔离性(Isolation)事务和事务之间应该有一定的隔离措施来确保数据安全,在不同的隔离级别下,隔离性有不同的表现。持久性(Durability)一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允许撤销,只能通过“补偿性事务”对于 ACD 比较好理解

2020-12-31 17:48:03 735

原创 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 6157

原创 使用xdebug3的profile文件来分析php程序的性能-QCacheGrind

QCacheGrind 是一个通用的性能分析工具,可以用在PHP(XDebug工具), GoLang(pprof工具)等程序,只要生成的文件符合它的解析协议即可。关于如何使用xdebug以及如何获取profile文件,请先阅读 https://blog.csdn.net/raoxiaoya/article/details/111984667xdebug 官方描述:https://xdebug.org/docs/profiler我使用的额是windows系统,下载程序 qcachegrindqcach

2020-12-30 18:19:26 2223 1

原创 vscode使用xdebug3调试PHP脚本

我们直到在CLI模式下,PHP脚本可以被轻松的调试,但是在fastcgi模式下,xdebug在何种情况拦截请求并触发调试呢,实际上一套WEB API 只有极少有性能瓶颈的API才需要被debug,每个接口都去记录profile是没必要的。因此,无论是命令行下还是web下的调试都需要人为来触发,实际上,这是合理的,因为大部分时候我们是不需要调试的,一直开启xdebug没有必要,人为触发的方式参考。,那么每次运行php程序xdebug都会去连接服务端,如果你没有启动编辑器的调试,那么php就会抛出错误信息。

2020-12-30 15:14:01 5373 2

原创 thinkphp5.0的查询方法 where in 性能问题以及优化措施

最近在后台导出数据到Excel,考虑到可能数据量大使用了c扩展xlswriter来做Excel处理,首先在本地测试,1w条数据花费了40s,不太理想。thinkphp 版本为 5.0.4于是想知道在哪一步花费的时间比较多,打断点日志发现,导出过程只花了1秒,处理数据也只花了2s,但是有一个查询却花了36s,然后日志文件记录的该sql执行时间只有零点几秒,于是将这个sql拿到navicate执行,发现也只需要0.3s,好吧,找到原因了,应该是在组装sql的时候耗时较长。我的查询是这样的:$users =

2020-12-29 11:31:01 5298

原创 nginx 504 Gateway Time-out,设置超时时间

首先nginx配置nginx.conf中,设置以下几个参数,增加超时时间fastcgi_connect_timeoutfastcgi连接超时时间,默认60秒fastcgi_send_timeoutnginx 进程向 fastcgi 进程发送请求过程的超时时间,默认值60秒fastcgi_read_timeoutfastcgi 进程向 nginx 进程发送输出过程的超时时间,默认值60秒如果是针对某个项目,可以在 server{} 中覆盖此配置。其次php配置php.inimax_exe

2020-12-29 09:02:13 2175

原创 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 6286 2

原创 go generate 的用法

概述golang tools 是官方提供的工具集,是 Gophers 的工具宝库,值得好好探索一番,参见 GitHub,文档地址。里面有丰富的开发辅助工具,所有的 Go 开发插件都离不开这些工具的支持。例如goimports工具自动导入使用的包,去掉未使用的包;gorename用来重命名标识符。今天要使用的stringer工具也在tools工具包中。命令描述如下:go help generateusage: go generate [-run regexp] [-n] [-v] [-x] [bu

2020-12-25 18:24:41 3556

原创 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 2010 1

原创 golang使用Futures模式达到并行运算

所谓Futures就是指:有时候在你使用某一个值之前需要先对其进行计算。这种情况下,你就可以在另一个处理器上进行该值的计算,到使用时,该值就已经计算完毕了。Futures模式通过闭包和通道可以很容易实现,类似于生成器,不同地方在于Futures需要返回一个值。假设我们有一个矩阵类型,我们需要计算两个矩阵A和B乘积的逆,首先我们通过函数Inverse(M)分别对其进行求逆运算,再将结果相乘。如下函数InverseProduct()实现了如上过程:func InverseProduct() { a_in

2020-12-21 16:58:20 922

原创 golang中的生成器

生成器每次返回的是序列中下一个值而非整个序列;这种特性也称之为惰性求值:只在你需要时进行求值,同时保留相关变量资源(内存和cpu):这是一项在需要时对表达式进行求值的技术。例如,生成一个无限数量的偶数序列:要产生这样一个序列并且在一个一个的使用可能会很困难,而且内存会溢出!但是一个含有通道和go协程的函数能轻易实现这个需求。package mainimport ( "fmt")var resume chan intfunc integers() chan int { yield := m

2020-12-21 16:29:44 1089

原创 golang中的map以及并发问题

特点无序的键值对集合,使用key来获取,无法通过index来获取,返回顺序未知,因此每次打印的顺序可能不一样。可迭代 for range。使用hash表实现的,是引用类型。len()获取长度。key可以是所有可比较的类型:boolean, numeric, string, pointer, channel, interface, array, struct。非并发安全的。声明与初始化var m1 map[string]int // 只是声明,依然是 nilm2 := make(map[

2020-12-21 11:01:41 3708

原创 git深入理解(十):git stash保存现场与恢复现场

当前分支做了一些修改(工作区与暂存区),如果此时你要切换到别的分支,那么你的修改要么会污染别的分支,要么会在切换的过程中丢失,所以如果有个功能能够允许我在切换之前保存现场,再切换回来的时候恢复现场,就很完美了,那么 git stash 就是干这个的。当然,Git 会将现场保存在堆栈中,恢复的时候你可以将现场恢复进任何分支。git stash 会保存工作区和暂存区的内容。git stash 只会关注已经加入到版本控制的文件。$ git stash -husage: git stash list [&

2020-12-20 17:36:29 2194

原创 git深入理解(八):其他操作

gitlab包含本地仓克和远程仓库,例如 github,gitee,也可以自己搭建gitlab服务作为公司代码库。git库所在的文件夹中的文件大致有4种状态Untracked未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过 git add 将状态变为 Staged。Modified文件已修改,仅仅是修改,并没有进行其他的操作。这个文件也有两个去处,通过git add filename 可进入暂存 Staged 状态,git checkout – filename 则丢弃修

2020-12-18 18:27:47 853 2

原创 git深入理解(七):git rm详解

git rm 命令可以删除文件,那么它删除的是 index 还是 工作区呢,和手动删除文件有什么区别呢?相信你也有这些疑惑,请接着往下看。Remove files from the working tree and from the index说明 git rm 既能删除 Index 也能删除工作区的文件。$ git rm -husage: git rm [<options>] [--] <file>... -n, --dry-run dry run

2020-12-18 11:57:13 2747

原创 git深入理解(六):git checkout详解

Switch branches or restore working tree files$ git checkout -husage: git checkout [<options>] <branch> or: git checkout [<options>] [<branch>] -- <file>... -q, --quiet suppress progress reporting -b &l

2020-12-17 18:27:31 110673 6

原创 golang中的urlEncode和urlDecode

var urlStr string = "https://www.baidu.com"escapeUrl := url.QueryEscape(urlStr)fmt.Println("编码:",escapeUrl)enEscapeUrl, _ := url.QueryUnescape(escapeUrl)fmt.Println("解码:",enEscapeUrl)

2020-12-17 16:59:36 1875

原创 golang批量下载图片并打包zip的性能优化

golang批量下载图片并打包zip的性能优化关于如何使用golang来打包zip可以先参考 https://blog.csdn.net/raoxiaoya/article/details/111224599所以你应该知道,在zip文件里面创建文件是串行的,这是由它的特性决定的。// Create adds a file to the zip file using the provided name.// It returns a Writer to which the file contents

2020-12-17 14:03:06 2229

原创 golang中的原子化操作

多核CPU情况下,CPU对内存的操作不是原子的,这个和语言无关,实际上 n++ 操作就是CPU先从内存取回n的值,然后加1,再放回内存,显然是存在并发问题的。func TestNpp(t *testing.T) { n := 0 for i := 0; i < 20; i++ { go func() { n++ }() } fmt.Println(n)}结果并不是20...

2020-12-17 09:59:40 1881 2

原创 golang截取字符串substr,支持多字节字符

// 截取字符串,支持多字节字符// start:起始下标,负数从从尾部开始,最后一个为-1// length:截取长度,复数表示截取到末尾func SubStr(str string, start int, length int) (result string) { s := []rune(str) total := len(s) if total == 0 { return } // 允许从尾部开始计算 if start < 0 { start = total + sta

2020-12-16 11:06:28 2108

原创 golang创建zip压缩文件

golang基础包 archive/zip 提供了操作zip的能力。步骤如下:使用 os.Create 创建一个空的文件 file,如果存在则会被清空。使用 zip.NewWriter(file) 得到 *zip.Writer,使用它即可操作zip文件。示例,批量下载网络图片,保存到zip文件中,包含目录。func TestZip(t *testing.T) { file, err := os.Create("test.zip") if err != nil { fmt.Println

2020-12-15 17:05:51 3116 2

原创 golang反射(二):反射结构体切片读取数据

type Man struct { Id int Name string}s1 := make([]Man, 0)s1 = append(s1, Man{1, "a"})s1 = append(s1, Man{2, "b"})s1 = append(s1, Man{3, "c"})func(v interface{}) { getValue := reflect.ValueOf(v) // Value of v if getValue.Kind() != reflect.Slic

2020-12-14 18:09:10 4712

原创 golang反射(一):反射结构体类型读取数据

先看下面的例子,通过反射一个结构体对象来获取信息。type Man struct { Id int Name string}m := Man{1, "a"}func(v interface{}){ getValue := reflect.ValueOf(v) if getValue.Kind() != reflect.Struct { panic("need struct kind") } getType := reflect.TypeOf(v) // 或者 getType

2020-12-14 17:43:20 3459

原创 golang实现字符和数字之间的转换

A --> 65a --> 970 --> 489 --> 57中--> 20013在Go语言中,字符是用单引号括起来的一个字符,可以是单字节也可以是多字节字符,在GO中你可以将字符看做整型数字,所以Go使用 byte, intxx, uintxx, rune 来存贮字符。默认使用4个字节来存储字符,除非你有所指定。var a byte = 'A'var b = 'A'var c = '中'fmt.Println(a) // 65fmt.Println(

2020-12-13 17:09:59 3701

原创 golang 导出excel表格的两个包使用对比

第一种方法go get -u github.com/tealeg/xlsxfunc test1() { // rows 为查询出的多条记录 filename := fmt.Sprintf(test1.%d.xlsx", time.Now().Unix()) type item struct { Rank int Userid int UserName string NickName string Phone str

2020-12-11 18:15:52 2945 1

原创 git深入理解(五):git reset详解

Reset current HEAD to the specified state首先解释一下这句描述是什么意思,HEAD是指向某个commit的指针,既然如此,那么我们就可以操作HEAD来使其指向特定的commit。关于暂存区(index)的知识 https://blog.csdn.net/raoxiaoya/article/details/110824019关于什么是HEAD可阅读 https://blog.csdn.net/raoxiaoya/article/details/110862360

2020-12-08 18:33:43 3395

原创 git深入理解(四):git log详解

Show commit logs 用来查看commit日志git log -husage: git log [<options>] [<revision-range>] [[--] <path>...] or: git show [<options>] <object>... -q, --quiet suppress diff output --source show sou

2020-12-08 15:58:34 5336

原创 git深入理解(三):git diff详解

Show changes between commits, commit and working tree, etc是一个用来查看差异的工具。查看帮助$ git diff -husage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]信息量过少比较工作区和暂存区的差别git diff 比较暂存区和本库的差别git diff --cached 比较工作区和版本库的

2020-12-08 11:50:02 2268

原创 git深入理解(二):HEAD是什么

HEAD指的就是 .git/HEAD 文件,它存储着当前working directory所处的某次commit,打开文件内容为ref: refs/heads/masterrefs目录下存储的是仓库和tags,每个仓库下又有分支,每个tags下又有tag,一个tag对应的某次commit。存储 local master 分支的最新commit对象的SHA-1refs/heads/master存储远程仓库 master 分支的最新commit对象的SHA-1refs/remotes/origi

2020-12-08 11:18:48 22221 1

原创 git深入理解(一):暂存区(Stage),索引(index)

所谓的暂存区Stage只是一个简单的索引文件而已。指的是是 .git/index文件,理解了索引更加有助于理解git的内部原理。索引文件里面包含的是文件的目录树,像一个虚拟的工作区,在这个虚拟工作区的目录树中,记录了文件名、文件的最后修改时间、文件长度、文件类型以及最重要的SHA-1值,文件的内容并没有存储在其中。而这个SHA-1值就是某个文件的当前版本号。而文件的具体内容是在.git/objects目录下,你会发现这个目录占用空间比较大,因为它存储着当前项目文件各个版本的内容。进入objects目录,

2020-12-07 18:01:28 5684 1

原创 golang将静态资源文件打包进二进制文件

默认情况下,将项目打包成二进制的时候是不会加入静态资源文件的,因此在部署的时候还需要捎带上这些文件,比如,一些配置文件,图片,样式表等。很多时候,这些静态文件是不需要变的,如果能一并加入到二进制文件,就能减少部署时的依赖。于是有了很多第三方解决方案,将静态资源文件“嵌入”最终的 Go 二进制文件中。最知名的应该是 go-bindata,此外还有很多其他的:github.com/alecthomas/gobundlegithub.com/GeertJohan/go.ricegithub.com/go

2020-12-04 09:56:38 10907 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除