首页
📷在线壁纸
🎬娱乐天地
🔖友情链接
更多
📝留言板
Search
1
【javascript】JS-向当前url追加参数
2,341 阅读
2
【PHP】生成随机昵称
2,195 阅读
3
【PHP】判断一个字符串是否属于序列化后的数据
2,022 阅读
4
【css】html+css给文章页,做阅读全文
1,973 阅读
5
【PHP】 设计模式(23种)
1,905 阅读
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇mysql
🍈Winform
🍓golang
🍉设计模式
🥝PHP
🍎python
🍊nginx
🍋网络安全
🍍javascript
🫑database
🍭文艺范
🍏mac
Search
标签搜索
php
typecho
代码注释
mysql
redis
nginx
thinkphp
golang
docker
html
curl
linux
go
mamp
laravel
跨域
http
rsa
sql
酒
依然范儿特西
累计撰写
128
篇文章
累计收到
26
条评论
首页
栏目
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇mysql
🍈Winform
🍓golang
🍉设计模式
🥝PHP
🍎python
🍊nginx
🍋网络安全
🍍javascript
🫑database
🍭文艺范
🍏mac
页面
📷在线壁纸
🎬娱乐天地
🔖友情链接
📝留言板
搜索到
111
篇与
🏳️🌈代码改变世界
的结果
2022-02-22
解决redis大key问题
很多朋友肯定在想redis的key能有多大呀? 这里就有个误区了,所谓的大key问题是某个key的value比较大,所以本质上是大value问题。
2022年02月22日
453 阅读
0 评论
3 点赞
2022-02-11
互联网工作生存指南
互联网工作生存指南
2022年02月11日
97 阅读
0 评论
1 点赞
2022-02-11
几款代码版的冰墩墩
1. 素描版冰墩墩github: https://github.com/XYZliang/iWantBingDunDun预览: https://www.jxufesoftware.club/iWantBingDunDun2. Three.js + React 版冰墩墩github: https://github.com/dragonir/3d/tree/master/src/containers/Olympic预览: https://dragonir.github.io/3d/#/olympic3. ptyhon 版冰墩墩github: https://github.com/crossin/snippet/tree/master/BingDwenDwen4. 桌面宠物版冰墩墩https://github.com/HITgzx/Bing_Dwen_Dwen5 go版本如何处理呢可以使用这个库:https://github.com/qeesung/image2ascii找一张冰墩墩的图片, 直接命令行image2ascii -f bingdundun.jpg
2022年02月11日
428 阅读
0 评论
2 点赞
2021-12-09
渗透测试
渗透测试原理由安全专家对网站应用系统,尤其是通过基于 web 的应用系统进行应用安全评估和渗透测试,发现和 弥补应用系统存在的弱点。安全专家模拟黑客全面检测 web 应用存在的漏洞并使用攻击向量对漏洞进行控 制操作,评估漏洞对企业平台功能或资产可以造成的损害,进面评估对企业业务的影响。原理如图所示:标准遵从国内标准:GB/T 17859-1999 计算机信息系统安全保护等级划分准则GB/T 20984-2007 信息安全技术 信息安全风险评估规范GB/T 19716-2005 信息技术 信息安全管理实用规则GB/Z 20986-2007 信息安全事件分类分级指南GB/T18336-2008 信息技术 安全性评估准则GB/T 20988-2007 信息系统灾难恢复规范GB/T 32213-2015 信息安全技术 公钥基础设施 远程口令鉴别与密钥建立规范GB/T 31722-2015 信息技术 安全技术 信息安全风险管理GB/T 35284-2017 信息安全技术 网站身份和系统安全要求与评估方法国际标准:ISO27000 系列ISO15408 信息技术安全评估准则Microsoft 和 IBM 软件开发生命周期OWASP TOP 10 Web 安全应用风险ISO13335 信息技术-IT 安全管理指南CC-ISO15408 信息技术安全性评估准则NIST SP 800-30 信息技术系统风险管理指南NIST SP 800-26 信息技术系统安全自我评估指南美国国家安全局 (NAS) 发布的 SSE-CMM V2.0 模型漏洞评级定义序号漏洞名称漏洞危害1核心功能认证缺失高2系统命令注入高3SQL 注入高4恶意文件/脚本上传高5访问控制失效(水平/垂直越权)高6敏感文件下载高7服务器端模板注入高8Python 代码注入高9相对路径遍历中10GET 方法提交敏感参数高11LDAP 注入高12XML 注入(XXE)高13XPath 注入高14存储型 XSS高15反射型 XSS中16DOM XSS中17敏感文件泄露高18访问控制失效(强制浏览)高19业务逻辑绕过高/中/低20不安全的密码重置功能(任意密码重置)高21短信轰炸、邮箱轰炸中22不可用的功能高23敏感信息被明文返回中24敏感信息未被加密存储在后端数据库中25敏感信息未加密中26CSRF中27暴力破解中28URL 重定向中29未加盐的密码哈希中30敏感错误信息泄露低31邮件地址泄露低32用户名枚举低33内部主机名泄露低34内部 IP 泄露低35通过 HTTP 请求的 SQL 语句枚举数据库信息高36超级管理员控制台可被 Internet 访问中37密码复杂度要求缺失中38登录后会话 ID 未更新中39允许未受信任的 SSL 证书中40可预测的会话 Cookie中41Cookie 存储敏感信息中42未强制加密中43未被设置为安全的会话 Cookie中44没有登出功能中45不过期的会话中46登出功能不终止会话中47应用允许同时登陆中48未启用端对端加密机制中49敏感信息缓存中50非必要的 HTTP 方法中51跨域资源共享(CORS)低52缺少更改密码功能中53表单开启自动填写功能低54服务器允许列出目录列表低55跨域脚本包含低56不完整的登出(子窗口不关闭)低57会话过期后无重定向低58Robots.txt 文件暴露网站结构低59敏感代码注释低60服务器信息泄露低61Cookie 未设置 HTTPOnly低62VIEWSTATE 参数泄露敏感信息低63过长的会话过期时间低64缺少 Strict Transport Security 头部低65HTTP.sys 远程代码执行中66OpenSSL 心跳信息泄露(心脏流血)中67软件版本过低低68操作系统版本过低低69脆弱的软件组件低70不受支持/易被攻击的版本低71Host 头部注入中72开放多余的服务中73脆弱的 SSL 版本(SSLv2,SSLv3)中74支持 SSL 脆弱加密套件中75跨框架脚本攻击(CFS)中76允许外域 Flash 访问中77服务器存在非必要文件低78Flash 参数“Allow Script Access”被设置为“Always”低79服务器隐藏目录被发现低80未设置 X-Frame-Options 头低81未设置 X-Content-Type-Options 头低82未设置 Cache-Control 头低83弱口令高84SNMP 弱口令中渗透测试工具集渗透测试团队用到的渗透测试工具集参考名称作用归属nmap端口扫描、主机发现信息收集subDomainsBrute子域名发现信息收集firebug数据分析信息收集wireshark数据分析信息获取Fiddler数据分析信息收集whois收集信息信息收集DirBrute目录扫描信息收集wpscan漏洞扫描漏洞发现Burpsuite综合利用工具信息收集AWVS漏洞扫描器漏洞发现Beef XSS综合利用漏洞利用hydra暴力破解漏洞利用metasploit渗透测试框架漏洞利用sqlmapSQL 注入利用漏洞利用HavijSQL 注入利用漏洞利用struts2利用工具 针对 struts2 漏洞漏洞利用中国菜刀管理 webshell漏洞利用nc端口转发内网渗透lcx端口转发内网渗透reGeorgproxy流量转发内网渗透proxychain代理工具内网渗透reDug流量转发内网渗透Tunna流量转发内网渗透mimikatzwindows 密码获取内网渗透AndroidKiller反编译 apk 文件源码获取ApkToolkit反编译 apk 文件源码获取APKIDE反编译 apk 文件源码获取jd-guijava 反编译源码分析Winhex编辑工具二进制分析常见漏洞测试方法SQL 注入测试将数据包中存在参数的值修改为测试语句,并观察返回包数据常见测试语句内容如下:AND 1=1/ AND 1=2 'AND '1'='1/'AND '1'='2 "AND "1"="1/"AND "1"="1━ XSS 漏洞测试将数据包中存在参数的值修改为测试语句,并观察返回包数据常见测试语句内容如下:“;prompt(document.cookie);// ‘“><script>alert(document.cookie)</script>━ 越权漏洞测试将数据包中参数进行修改,观察返回数据包中是否包含超出用户权限的数据。━ 逻辑漏洞测试将数据包中参数进行修改,观察返回数据包中违反正常业务逻辑是否可被系统执行。━ 暴力破解漏洞测试短时间内大量发送含有测试语句的数据包至特定身份认证接口,观察返回数据包状态, 判断是否已发送数 据包均被系统处理。━ 短信轰炸漏洞测试使用测试工具短时间内频繁发送请求短信数据包,观察系统是否存在短信发送频率限制。━ 任意文件下载漏洞测试下载系统文件,观察是否对用户查看或下载的文件不做限制。━ 跨站请求伪造测试构造请求之后以其他账户身份登录之后点击,观察该请求操作是否被执行。━ URL 重定向测试在 URL 中构造一个恶意地址,查看用户是否跳转到恶意网站。━ 敏感信息泄露测试发送请求数据包,观察其中是否存在敏感信息.
2021年12月09日
266 阅读
2 评论
0 点赞
2021-12-01
好诗集锦
正在播放《open car》 ●━━━━━━━──5:01 ⇆ ◁ ❚❚ ▷ ↻ 1代码写得好,下班走得早, 领导瞧一瞧,绩效往下调; 代码写得烂,加班除炸弹, 领导看一看,提拔当骨干。2写字楼里写字间,写字间里程序员; 程序人员写程序,又拿程序换酒钱。 酒醒只在网上坐,酒醉还来网下眠; 酒醉酒醒日复日,网上网下年复年。 但愿老死电脑间,不愿鞠躬老板前; 奔驰宝马贵者趣,公交自行程序员。 别人笑我忒疯癫,我笑自己命太贱; 不见满街漂亮妹,哪个归得程序员?3天下英雄出我辈, 一入职场衰命催。 加班欠薪谈笑间, 不及富婆一场睡。
2021年12月01日
165 阅读
0 评论
1 点赞
2021-11-24
Golang 实现结构体数组按多字段排序
php 排序写法近期因项目重构(php->golang),涉及到一些将对象列表中的对象按不同的字段(属性)排序;在 php 中,可以使用 usort + 自定义的排序函数轻松实现;PHP usort 官方文档下面我们先看一个在 php 中的例子: 下面是一个待排序待数组<?php $result = array( array( "val" => "f", "mtime" => 1595144638, "orderval"=>4 ), array( "val" => "d", "mtime" => 1595144646, "orderval"=>2 ), array( "val" => "a", "mtime" => 1595144648, "orderval"=>8 ), array( "val" => "t", "mtime" => 1595144648, "orderval"=>5 ), array( "val" => "e", "mtime" => 1595144650, "orderval"=>3 ) );我们目前待目标是将该数组中待对象按 mtime 从大到小排序;如果 mtime 字段的值相等,则按 orderval 从大到小排,最终想要的结果为:e,a,t,d,f[ {"val"=>"e","mtime"=>1595144650,"orderval"=>3}, {"val"=>"a","mtime"=>1595144648,"orderval"=>8}, {"val"=>"t","mtime"=>1595144648,"orderval"=>5}, {"val"=>"d","mtime"=>1595144646,"orderval"=>2}, {"val"=>"f","mtime"=>1595144638,"orderval"=>4} ] 我们首先定义一个自定义函数,然后巧妙使用 usort 函数去调用的自定义函数,最终实现目标,直接上代码:php $result = array( array( "val" => "f", "mtime" => 1595144638, "orderval"=>4 ), array( "val" => "d", "mtime" => 1595144646, "orderval"=>2 ), array( "val" => "a", "mtime" => 1595144648, "orderval"=>8 ), array( "val" => "t", "mtime" => 1595144648, "orderval"=>5 ), array( "val" => "e", "mtime" => 1595144650, "orderval"=>3 ) ); //按mtime 从大到小;如果mtime 相等,则按orderval 从大到小; usort($result, function ($v1, $v2) { if ($v1['mtime'] < $v2['mtime'] || ($v1['mtime'] == $v2['mtime'] && $v1['orderval'] < $v2['orderval'])) { return 1; } else { return -1; } }); var_dump($result); 运行结果:array(5) { [0]=> array(3) { ["val"]=> string(1) "e" ["mtime"]=> int(1595144650) ["orderval"]=> int(3) } [1]=> array(3) { ["val"]=> string(1) "a" ["mtime"]=> int(1595144648) ["orderval"]=> int(8) } [2]=> array(3) { ["val"]=> string(1) "t" ["mtime"]=> int(1595144648) ["orderval"]=> int(5) } [3]=> array(3) { ["val"]=> string(1) "d" ["mtime"]=> int(1595144646) ["orderval"]=> int(2) } [4]=> array(3) { ["val"]=> string(1) "f" ["mtime"]=> int(1595144638) ["orderval"]=> int(4) } }那么同样的功能,如果要用 golang 来实现,应如何办呢?golang 排序下面我们首先讲讲 golang 官方对排序 对支持,然后给出具体对例子;package main import ( "fmt" "sort" ) type Obj struct { Var string `json:"var"` Mtime int `json:"mtime"` Orderval int `json:"orderval"` } type List []Obj func (p List) Len() int { return len(p) } // 此处排序是从大到小的, 如果想升序,可以把此方法里的 判定 改为 相反的判定即可 func (p List) Less(i, j int) bool { if p[i].Mtime > p[j].Mtime { return true } if p[i].Mtime < p[j].Mtime { return false } return p[i].Orderval > p[j].Orderval } func (p List) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p *List) Sort() { sort.Sort(p) } func main() { s := List{{"f", 1595144638, 4}, {"d", 1595144646, 2}, {"a", 1595144648, 8}, {"t", 1595144648, 5}, {"e", 1595144650, 3}} fmt.Println(s) s.Sort() fmt.Println(s) } // 如果想使用传入的方法来写,可以把main 方法 的写法改为下边这个 //func toSortAsc(UserList []Obj)[]Obj{ // s := List{} // for _,v := range UserList{ // s = append(s,v) // } // s.Sort() // return s //} 再举一个简单的例子package main import ( "fmt" "sort" ) type Instance struct { Domain string `json:"domain"` Ip string `json:"ip"` Containers []string `json:"containers,omitempty"` } func main() { instances := make([]*Instance, 0, 10) i1 := &Instance{} i1.Domain = "zhap" i1.Ip = "1" instances = append(instances, i1) i2 := &Instance{} i2.Domain = "abc" i2.Ip = "2" instances = append(instances, i2) i3 := &Instance{} i3.Domain = "mid" i3.Ip = "3" instances = append(instances, i3) fmt.Println("排序前 ") for _, v := range instances { fmt.Println(*v) } sort.Slice(instances, func(i, j int) bool { return instances[i].Domain < instances[j].Domain }) fmt.Println("排序后 ") for _, v := range instances { fmt.Println(*v) } }
2021年11月24日
718 阅读
0 评论
2 点赞
2021-11-19
golang 接收命令行参数
方式一package main import ( "fmt" "os" ) func main() { fmt.Println("命令行的参数有", len(os.Args)) // 遍历 os.Args 切片,就可以得到所有的命令行输入参数值 for i, v := range os.Args { fmt.Printf("args[%v]=%v\n", i, v) } }执行结果> go run ./main.go laofan 123 456 789 命令行的参数有 5 args[0]=Temp\go-build\b001\exe\main.exe args[1]=laofan args[2]=123 args[3]=456 args[4]=789 >方式二如像 mysql 那样:mysql -u root -p 123456,可以指定输入内容,输入顺序可变。 flag包实现了命令行参数的解析:package main import ( "flag" "fmt" ) func main() { // 定义几个变量,用于接收命令行的参数值 var user string var password string var host string var port int // &user 就是接收命令行中输入 -u 后面的参数值,其他同理 flag.StringVar(&user, "u", "root", "账号,默认为root") flag.StringVar(&password, "p", "", "密码,默认为空") flag.StringVar(&host, "h", "localhost", "主机名,默认为localhost") flag.IntVar(&port, "P", 3306, "端口号,默认为3306") // 解析命令行参数写入注册的flag里 flag.Parse() // 输出结果 fmt.Printf("user:%v\npassword:%v\nhost:%v\nport:%v\n", user, password, host, port) } 执行结果> go run ./main.go -p 123 -u laofan -P 3306 -h 127.0.0.1 user:laofan password:123 host:127.0.0.1 port:3306 > 方式二的另一种写法 package main import ( "flag" "fmt" ) func main () { //获取命令参数 Act := flag.String("act", "", "is ok") date := flag.String("date", "", "id") // 解析命令行参数写入注册的flag里 flag.Parse() fmt.Println("act :", *Act) fmt.Println("date :", *date) }访问结果> go run ./main.go -act laofan -date today act : laofan date : today >
2021年11月19日
162 阅读
0 评论
2 点赞
2021-11-12
php防sql注入过滤代码
php防sql注入过滤代码防止sql注入的函数,过滤掉那些非法的字符,提高sql安全性,同时也可以过滤XSS的攻击。function filter($str) { if (empty($str)) return false; $str = htmlspecialchars($str); $str = str_replace( '/', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '(', "", $str); $str = str_replace( ')', "", $str); $str = str_replace( 'CR', "", $str); $str = str_replace( 'ASCII', "", $str); $str = str_replace( 'ASCII 0x0d', "", $str); $str = str_replace( 'LF', "", $str); $str = str_replace( 'ASCII 0x0a', "", $str); $str = str_replace( ',', "", $str); $str = str_replace( '%', "", $str); $str = str_replace( ';', "", $str); $str = str_replace( 'eval', "", $str); $str = str_replace( 'open', "", $str); $str = str_replace( 'sysopen', "", $str); $str = str_replace( 'system', "", $str); $str = str_replace( '$', "", $str); $str = str_replace( "'", "", $str); $str = str_replace( "'", "", $str); $str = str_replace( 'ASCII 0x08', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '"', "", $str); $str = str_replace("", "", $str); $str = str_replace(">", "", $str); $str = str_replace("<", "", $str); $str = str_replace("<SCRIPT>", "", $str); $str = str_replace("</SCRIPT>", "", $str); $str = str_replace("<script>", "", $str); $str = str_replace("</script>", "", $str); $str = str_replace("select","",$str); $str = str_replace("join","",$str); $str = str_replace("union","",$str); $str = str_replace("where","",$str); $str = str_replace("insert","",$str); $str = str_replace("delete","",$str); $str = str_replace("update","",$str); $str = str_replace("like","",$str); $str = str_replace("drop","",$str); $str = str_replace("DROP","",$str); $str = str_replace("create","",$str); $str = str_replace("modify","",$str); $str = str_replace("rename","",$str); $str = str_replace("alter","",$str); $str = str_replace("cas","",$str); $str = str_replace("&","",$str); $str = str_replace(">","",$str); $str = str_replace("<","",$str); $str = str_replace(" ",chr(32),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace("&",chr(34),$str); $str = str_replace("'",chr(39),$str); $str = str_replace("<br />",chr(13),$str); $str = str_replace("''","'",$str); $str = str_replace("css","'",$str); $str = str_replace("CSS","'",$str); $str = str_replace("<!--","",$str); $str = str_replace("convert","",$str); $str = str_replace("md5","",$str); $str = str_replace("passwd","",$str); $str = str_replace("password","",$str); $str = str_replace("../","",$str); $str = str_replace("./","",$str); $str = str_replace("Array","",$str); $str = str_replace("or 1='1'","",$str); $str = str_replace(";set|set&set;","",$str); $str = str_replace("`set|set&set`","",$str); $str = str_replace("--","",$str); $str = str_replace("OR","",$str); $str = str_replace('"',"",$str); $str = str_replace("*","",$str); $str = str_replace("-","",$str); $str = str_replace("+","",$str); $str = str_replace("/","",$str); $str = str_replace("=","",$str); $str = str_replace("'/","",$str); $str = str_replace("-- ","",$str); $str = str_replace(" -- ","",$str); $str = str_replace(" --","",$str); $str = str_replace("(","",$str); $str = str_replace(")","",$str); $str = str_replace("{","",$str); $str = str_replace("}","",$str); $str = str_replace("-1","",$str); $str = str_replace("1","",$str); $str = str_replace(".","",$str); $str = str_replace("response","",$str); $str = str_replace("write","",$str); $str = str_replace("|","",$str); $str = str_replace("`","",$str); $str = str_replace(";","",$str); $str = str_replace("etc","",$str); $str = str_replace("root","",$str); $str = str_replace("//","",$str); $str = str_replace("!=","",$str); $str = str_replace("$","",$str); $str = str_replace("&","",$str); $str = str_replace("&&","",$str); $str = str_replace("==","",$str); $str = str_replace("#","",$str); $str = str_replace("@","",$str); $str = str_replace("mailto:","",$str); $str = str_replace("CHAR","",$str); $str = str_replace("char","",$str); return $str; } 更加简便的防止sql注入的方法(推荐使用这个): if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post = addslashes($name); // magic_quotes_gpc没有打开的时候把数据过滤 } $name = str_replace("_", "\_", $name); // 把 '_'过滤掉 $name = str_replace("%", "\%", $name); // 把' % '过滤掉 $name = nl2br($name); // 回车转换 $name= htmlspecialchars($name); // html标记转换 return $name; PHP防XSS 防SQL注入的代码/** * 过滤参数 * @param string $str 接受的参数 * @return string */ static public function filterWords($str) { $farr = array( "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU", "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", "/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is" ); $str = preg_replace($farr,'',$str); return $str; } /** * 过滤接受的参数或者数组,如$_GET,$_POST * @param array|string $arr 接受的参数或者数组 * @return array|string */ static public function filterArr($arr) { if(is_array($arr)){ foreach($arr as $k => $v){ $arr[$k] = self::filterWords($v); } }else{ $arr = self::filterWords($v); } return $arr; } 在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes() 、trim()函数。这两个函数都是对特殊字符进行转义。1)addslashes()作用及使用addslashes() 通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“”进行转义如:如变量 $str=$_POST["str"];的值为:bb' or 1='1。通过addslashes()函数过滤后会变为:bb' or 1='1;2)htmlspecialchars()作用及使用htmlspecialchars()也是对字符进行转义,与addslashes()不同的是htmlspecialchars()是将特殊字符用引用实体替换。如<script>alert('xss')</script>通过htmlspecialchars()过滤后为<script>alert('xss')</script>3)addslashes()与htmlspecialchars()的区别除了两个函数的转义方式不同外,它们的使用也不同。addslashes()通过用于防止sql语句注入,在执行sql语句前对通过get、post和cookie传递来的参数中的单引号,双引号, 和null进行转义。但sql执行成功后,插入到数据库中的数据是不带有转义字符的。这是如果插入到数据库中的是一些js脚本,当这些脚本被读取出来时还是会被执行。这是我们可对读取出来的数据使用htmlspecialchars()进行过滤,避免执行被注入的脚本。
2021年11月12日
438 阅读
0 评论
2 点赞
2021-11-12
php脚本内存溢出处理
有时候我们跑脚本时候。因为某些原因 内存溢出 导致 脚本停止,但是我们日志又捕捉不到信息,就很蛋疼完整测试代码 class Test { public $name = "sdf"; public function __construct() { } } //写法1,这里内存不会溢出 while(true) { $i++; var_dump($i); $i = new Test(); } //写法2,这里内存不会溢出 while(true) { new Test(); } //写法3,这里内存会溢出 while(true) { $i[] = new Test(); }我们按照这个示例代码来测试test.php 文件class Test{ public $name = "laofan"; public function __construct() { } } try { //这里内存会溢出 while(true) { $i[] = new Test(); } print_r($i); }catch(\Exception $e){ print_r($e->getMessage()); }此处执行 php test.php 控制台会报错,但是无法捕获异常,# 错误信息 Fatal error: Allowed memory size of 2684354560 bytes exhausted (tried to allocate 1073741832 bytes) in D:\phpstudy_pro\WWW_laofan\test.php on line 14改用 linux 日志方式 来解决php test.php > ./log.txtget !
2021年11月12日
134 阅读
0 评论
1 点赞
2021-11-05
日常项目中缓存穿透处理
说起缓存穿透,大家都知道, 真正在使用过程中,很少有人感觉会缓存穿透, 其实在我们日常开发过程中,不知不觉 你就写了个bug , 下边是我们开发中发现的一种缓存穿透写法, 仅供参考:缓存穿透写法 /* 错误写法示例 * * 解读: * * 当 $data_list 查询结果为空时候, 会导致 msgpack_pack 压缩后 存储缓存结果为空 * 从缓存取出数据时候, msgpack_unpack 解压后,数据也是空值,从而导致 一直无法命中缓存, */ public static function getList(){ $cache_key = 'richerdyoung.com:v1'; $redis = new Redis(); $data_list = msgpack_unpack($redis->get($cache_key)); if(empty($data_list)){ $data_list = getListByDb(); $redis->set($cache_key,msgpack_pack($data_list),86400); } return $data_list; } 正确写法 /* 正确写法 * 解读 * * 当取出 不存在的 $cache_key 结果会返回 false ,此时查询db , 如果db返回空,存入 redis * 第二次查询 $cache_key ,缓存key存在,但是结果为空,直接返回, 从而避免 重复查询DB * * 也可以使用 $redis->exists($cache_key) 去判定 */ public static function getAllAdOwnerignoreUserTypeList(){ $cache_key = 'richerdyoung.com:v1'; $redis = new Redis(); $cache_data_list = $redis->get($cache_key); if($cache_data_list === false){ $data_list = getListByDb(); $redis->set($cache_key,msgpack_pack($data_list),86400); }else{ $data_list = msgpack_unpack($cache_data_list); } return $data_list; }
2021年11月05日
189 阅读
3 评论
5 点赞
1
2
3
4
...
12