php
钚该钚想
这个作者很懒,什么都没留下…
展开
-
YII2 控制器中不能使用大写的问题
需求: 请求的接口为: getServerAddr问题: 请求的地址只有一个,不符合 控制器名/方法名 的格式。解决方案, 设置默认方法, public $defaultAction = "Index";这样请求 /getServerAddr,实际请求的应该就是/getServerAddr/index经过测试,报错 404, 检查发现是由于控制器的大小写引起的,只有请求地址为:get-server-addr 才会映射到 getServerAddrController 中,看了一下网上的解决方原创 2021-03-29 14:47:55 · 269 阅读 · 0 评论 -
redis 使用setnx实现锁
在token失效时,要重新请求服务器生成新的token,如果不使用锁的话,在并发的情况下,会有很多请求同时请求服务器。这里提供一个使用redis来实现锁的。redis的setnx :当键不存在时插入成功,存在时插入失败。插入成功即拿到锁。查询资料发现这样一段代码:<?php$ok = $redis->set($key, $value, array('nx', 'ex' => $ttl));if ($ok) { $cache->update(); $re原创 2021-03-02 14:27:27 · 408 阅读 · 0 评论 -
php 拉取 gz 文件进行解压后保存到自己的服务器
需求,将平台生成的文件拉取回来,进行数据分析通过接口请求,发现返回的是一个 .csv.gz 格式的文件。所以要对文件进行解压,网上查到的解压代:function unzip_gz($gz_file){ $buffer_size = 4096; // read 4kb at a time $out_file_name = str_replace('.gz', '', $gz_file); $file = gzopen($gz_file, 'rb'); $ou.原创 2021-01-27 10:24:00 · 274 阅读 · 1 评论 -
yii 配置文件根据模式分类
在刚下载的yii 框架源码中,配置文件是没有进行分类的。我想在index中定义模式(dev,demo,online)。所以希望根据自己的定义读取相应的配置。# index.php 修改如下define('ENVIRONMENT', 'demo'); //这里可以进行我们环境的定义$config = require(__DIR__ . '/../config/'.ENVIRONMENT.'/web.php');在config 目录下创建新的目录文件。如下图:运行后发现报错Unable to原创 2021-01-21 16:13:26 · 129 阅读 · 0 评论 -
PHP二维数组取差集
二维数组取差集 和 数组下标从0开始需求:获取可以使用的坐标 // $arr1:所有坐标 $arr2:不能使用的坐标错误操作: array_diff()使用 array_diff() 获取差集,返回空数组。这个函数只能用于一维数组,不能用于二维数组。正确操作$arr3 = array_filter($arr1, function($v) use ($arr2) { return ! in_array($v, $arr2);});结果集的数组下标从0开始上面的方法获取到数组的差集,原创 2020-11-03 11:58:23 · 863 阅读 · 0 评论 -
laravel 之 Unit 单元测试
在进行项目开发的时候,经常会对我们的类,函数,http请求等进行测试,看结果是否符合我们的预期。对于http 请求我们通常会使用postman 来进行测试。那么如果我们需要测试某一个类,某一个方法,需要怎么办?可能我们会这样做:在类或者方法调用后对结果进行打印,然后使用postman 去请求对应接口。这样做有那些坏处呢:可能会在你的代码中出现很多var_dump() 代码。在你调用该类/方法 之前有很多步骤是你不需要的。(比如在调用之前对数据库进行了相关操作)。造成脏数据。由于以上原原创 2020-06-28 17:24:31 · 716 阅读 · 0 评论 -
前端(JS)与后端(PHP) 通过 RSA 实现加解密
在项目开发过程中,为了安全起见,通常不能以明文形式传递敏感信息,容易被截获,所以引入RSA。1. 生成公钥和私钥在终端(基于 Unix 的操作系统)中输入以下内容。生成私钥openssl genrsa -out rsa_1024_priv.pem 1024通过执行以下命令获取公钥openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem可以使用 cat 命令来查看cat rsa_1024_priv.pem原创 2020-06-16 10:37:50 · 1056 阅读 · 0 评论 -
开发中遇到的越权问题
越权问题:描述:在使用 api 请求订单详情接口时,一般我们是传递订单id 来获取该订单的内容。但是会存在一个问题:当用户手动去变更订单id 参数来请求接口数据时,会获取到不属于他的数据,这就产生了越权。解决办法: 根据订单id 查询到对应的user_id 对当前登录用户的id 和查询到的user_id 进行一致性判断,如果不一致,则返回操作越权。示例代码:public function orderAuth($order_id){ $userInfo = new User();原创 2020-05-29 18:14:40 · 516 阅读 · 0 评论 -
laravel 中字段格式处理
如果查询结果集中的某一个字段需要做相同的格式处理,之前的处理方法: $order = \DB::table('order') ->where('status',1) ->get(); foreach($order as &$val){ $val->price = $val->price/100; }这里举一个简单的示例,在laravel 中,我们应当这样做:在对应的Order 模型里定义public function getPriceNameA原创 2020-05-27 23:14:25 · 267 阅读 · 0 评论 -
laravel 中查看执行的sql 语句
在laravel 框架中,一般使用链式操作来对数据库进行相关的增删改查。那么如何查看我们执行的sql 呢?对于查询语句来说; 我们可以在链式操作后面加上->toSql();来打印执行的sql 语句。但是,对于其他的就不适用了。所以可以采用以下的办法:DB::enableQueryLog();UserAddress::where('id',1)->decrement('last_used_at',1);return response()->json(DB::getQueryLo原创 2020-05-27 17:41:20 · 781 阅读 · 0 评论 -
并发情况下产品超卖
在并发时减库存不能简单地通过update(['stock' => stock - $amount])来操作,在高并发的情况下会有问题。$amount = $data['amount '];update product set stock = stock - $amount where id = $id and stock >= $amount这样可以保证不会出现执行之后 stock 值为负数的情况,也就避免了超卖的问题。根据返回的受影响行数来判断是否执行成功。...原创 2020-05-27 16:05:42 · 150 阅读 · 0 评论 -
laravel 中使用 Hash::make() 对用户密码进行加密
laravel 中使用 Hash::make() 对用户密码进行加密问题描述: 在调试中发现使用 Hash:make($password) 对用户密码进行加密;在验证时发现对于相同的password 会出现不同的加密结果,那么加密之后进行对比肯定是不相等的。看了下实现方式: 使用 Hash::check($password,$userInfo->password)这种方式来对密码进行校验,不能使用 Hash:make($password) == $userInfo->password来原创 2020-05-24 18:45:48 · 2534 阅读 · 0 评论 -
使用 Redis 实现延时队列
使用 Redis 实现延时队列场景描述:订单在下单之后一定时间内没有支付,则关闭该订单实现方式:用户下单-> 生成订单记录-> 将订单信息推入延时队列任务中-> 到时间检查订单的支付状态(未支付则关闭订单)使用redis 实现延时队列 的功能思路: 用户在调用延时任务的方法时,需要传入两个参数(任务脚本,延时时间)。通过redis 有序集合来存储执行时间,每次取出第一个元素,执行时间与当前时间对比,如果小于等于当前时间则执行改脚本。并且移除改元素。由于redis 集合具原创 2020-05-23 18:19:08 · 322 阅读 · 0 评论 -
php 生产kafka 不生效问题
记录一下php 调用 kafka 生产者代码但是消费者端口收不到数据的情况PHP代码如下:<?php$objRdKafka = new RdKafka\Producer();$objRdKafka->addBrokers("localhost:9092");$oObjTopic = $objRdKafka->newTopic("demo");$oObjTopic-&g...原创 2020-04-21 18:28:03 · 1021 阅读 · 0 评论 -
kafka 入门
简介kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。Kafka安装配置注: 新版本的kafka 里面集成了zookeeper ,所以不需要再单独下载安装。下载wget https://mirror.bit.edu.cn/apache/kafka/2.5.0...原创 2020-04-19 10:29:35 · 431 阅读 · 0 评论 -
laravel 在原值基础上批量更新字段的值
修改order 表的deal_pice 字段的值,所有小于0的值修改为其相反数。Order::where('deal_pice','<',0)->update(['deal_pice'=>DB::raw('0- deal_pice ')])原创 2019-11-26 17:29:04 · 1528 阅读 · 0 评论 -
guzzle 使用 json 作为主体请求接口
在使用第三方插件 Guzzle 请求微信素材管理接口:接口说明http请求方式: POSThttps://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN#参数{ "type":TYPE, "offset":OFFSET, "count":COUNT...原创 2019-10-31 15:34:59 · 2181 阅读 · 1 评论 -
Laravel orWhere条件
场景描述需要根据三个条件去查询结果集,三个条件的关系是A and (B or C),B条件和C条件有交集,需要取出他两的并集。如果用户登录(UID存在),条件为A and (B or C),用户未登录,查询条件为:A and B错误代码1$uid = $params['uid']??0;$comment = DB::table('users')->where('A', '=', ...原创 2019-10-16 17:38:06 · 521 阅读 · 0 评论 -
Laravel 批量更新
Laravel 简单的批量更新数据需求:将order 表的 status 字段更新为2,条件是 id 在 arr 数组中的行。$orderId = [1,2,4,6,8];\DB::table('order')->whereIn('id', $orderId)->update(['status' => 2]);完成简单的数据批量更新。...原创 2019-10-11 14:38:02 · 144 阅读 · 0 评论 -
请求接口时出现 Status (blocked:other)
问题:请求接口时出现 Status (blocked:other)原因浏览器安装了Adblock 广告拦截插件,并且接口名称含有 %ad% 名称。解决方式关闭Adblock 广告拦截插件接口名称中不要含有%ad% 的名称...原创 2019-09-27 17:40:20 · 1320 阅读 · 0 评论 -
php-fpm 是如何处理php 请求的
PHP-FPM(PHP FastCGI Process Manager):PHP FastCGI 进程管理器,管理PHP 进程池的软件,用于接受web服务器的请求。用来管理进程。比如:当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。发展过程在php5 之前,使用的是php-cgi 。当...原创 2019-09-26 17:07:29 · 549 阅读 · 0 评论 -
laravel 中使用七牛云
laravel 中使用七牛云:安装配置在laravel中使用composer 安装:composer require zgldh/qiniu-laravel-storage然后在config/app.php中注册服务提供者:zgldh\QiniuStorage\QiniuFilesystemServiceProvider::class在config/filesystems.php里...原创 2019-09-25 15:38:27 · 1097 阅读 · 0 评论 -
PHP常见的几种数据结构
PHP常见的几种数据结构1 数组数组(Array)是一种线性表的数据结构,它用一段连续的内存空间,来存储具有相同类型的值。但是由于在PHP的底层定义中,数组是通过散列表实现的,所以这段定义并不适用。PHP的数组可以存储任意数据类型的数据,所以相对于Java来说效率较高。在Java的数组中,每次定义都要先声明属于组的类型,在查找数组时,效率是O(1),但是在插入和删除时,算法复杂度是O(n),...原创 2019-09-25 14:19:09 · 2800 阅读 · 0 评论