文章图片
文章图片
文章图片
前言咔咔目前所做的项目是一个saas系统 , 在开发新功能之后 , 需要为用户角色添加相应的权限 , 这时整个系统的所有用户都需要添加相应的权限 。
【PHP|如何写出安全又可靠的PHP脚本】因为以前系统的缺陷现在只能用脚本来处理这些工作 , 所以接下来咔咔将向你介绍如何编写安全可靠的PHP脚本 , 以及如何事先设计好这个功能 , 踩过一个坑直接把它埋起来
一、如何写一份安全又可靠的PHP脚本1-1 设置合理的内存PHP中使用memory_limit为每个进程设置内存 , 跑脚本的内存给256M或512M 。
通过设置内存来防止脚本执行死循环占用大量的内存 , 导致系统崩溃 。
在文件开头写入ini_set('memory_limit' '512M');
即可 。
1-2 可接收命令行传参在PHP中接命令行的参数为$argv
, 下标0是文件名 , 下标1为你传入的参数 。
简单来说就是先创建一个 index.php文件 , 然后打印出$argv
执行index.php文件php index.php kaka , 打印出来的数据与上面介绍的数组形式完全一样 。 第一个值是执行的文件名 , 第二个参数就是携带给脚本的参数 。
之前写了一篇laravel中给命令行携带参数不了解一下吗?可以看看 , 当时是rabbitmq路由模式遇到问题才知道的这个参数 , 如今在写脚本就可以直接用了 。
1-3 使用while死循环执行$id = !empty($argv[1
) ? $argv[1
: 0;
while(true){
$sql = \"select * from user id > $idorder by id asc limit 10000\";
$res = 执行$sql语句;
if(empty($res)){
break;
foreach ($res as $k => $v) {
\t// 这个id保存每次执行的值
$id = $v['id'
;
$checkDataSql = \"检测数据是否已存在\";
\t\t// 不存在时在进行添加数据
if(!$checkSql){
$sql = \"insert into user ...\";
$res = \"执行添加操作\";
// 返回最后执行的主键ID
echo $res.\"\\";
// 删除此次的变量 , 防止内存溢出
unset($res);
echo 'ok';
简单的解释一下这份代码
- 接受命令参数 , 此参数用于防止脚本执行一半挂掉 , 可以输入参数继续执行 。
- 使用while执行死循环逻辑
- 获取需要添加权限的数据 , 每次查询10000行 。
- 死循环退出条件是查询不到需要添加权限的数据 。
- 循环处理每次查询的10000行数据 。
- 将查询出来的数据ID循环一次就赋值给while外层的ID , 防止脚本挂掉知道从哪条数据继续执行 。
- 做一步检测操作 , 判断此条数据是否已经存在将要给添加的权限 。 不存在时再进行添加操作 。
- 最后一步也是最重要的一步将添加完成的主键ID返回到终端 , 脚本挂掉直接用这个ID作为参数继续执行 。
- 删除或者10000行数据的变量 , 防止内存溢出 。
- 最后一步也是最重要的数据处理完成后需要返回一个标识 , 知道此次脚本已经执行完成了 。
这份脚本还不是很完善 , 如你有更好的想法那咱们评论区见 。
二、如何提前设计好类似此种情况1-1 使用脚本刷数据的缺点
- 新员工对业务不熟悉 , 数据刷错后恢复数据工作量更大
- 前期用户基数少没感觉 , 用户量起来后每次执行脚本会花费很长时间
- 用户量大之后MySQL深度分页查询非常慢 , 会人为造成慢查询影响正常用户使用
- 在你刷数据的同时会有新用户注册进来 , 非常容易造成数据库死锁 。
例如你目前的数据数据是这样的 , id、authority_info、name
insert into t values(155)(555)(101010)(151515)(202020)(252525);
- 单片机|快2022年,从事单片机/硬件开发前景到底如何?
- 银河系|银河系和仙女座星系的碰撞已经开始?太阳系未来的命运会如何?
- |如何区分三相电源的相序?
- 银黑狐|罕见银黑狐现身北京门头沟,如狗般乖巧,它们是如何被驯化的?
- 新型冠状肺炎|曾经危机地球的生机,氧气如何慢慢变成了“毒气”
- |如果我们能控制时间,那会如何?答案无法想象
- 鹿茸|探索未来:元宇宙将彻底摧毁人类婚姻制度?未来人如何繁衍后代?
- |1970年我国发射第一颗卫星,如今现状如何?
- 自媒体|注意这4个问题,你就能获得第二份副业收入,上班族如何做自媒体
- 英特尔|中兴AXon30Pro、真我GT与红米K40Pro之间,该如何选?