PHP|如何写出安全又可靠的PHP脚本


PHP|如何写出安全又可靠的PHP脚本
文章图片
PHP|如何写出安全又可靠的PHP脚本
文章图片
PHP|如何写出安全又可靠的PHP脚本
文章图片
PHP|如何写出安全又可靠的PHP脚本

前言咔咔目前所做的项目是一个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);