一、账号池功能

1. 右边注释添加格式

private $client; // Jyeoo的接口

2. 将一些配置放到某个配置文件中,然后通过加载配置环境,来获取相关的变量

app()->configure(xxx);
$this->config = config(xxx);

3. app->configure()的加载过程

function app($make = null)
{
if (is_null($make)) {
return Container::getInstance();
} return Container::getInstance()->make($make);
}
public function configure($name)
{
if (isset($this->loadedConfigurations[$name])) {
return;
} $this->loadedConfigurations[$name] = true; $path = $this->getConfigurationPath($name); if ($path) {
$this->make('config')->set($name, require $path);
}
}

4. 功能要写单元测试,postman测数据测得并不准。

5. 写代码的时候要考虑到查询数据库的次数,避免懒查询:就是查询的次数特别的多。

6. 把自己以前写算法的劲头拿出来写代码,考虑代码的效率和可读性。

7. 使用面向对象的思路来为每个类定义它的属性值。

Class JyeooAccount extends Model
{
const IS_USING_YES = 1;
const IS_USING_NO = 2;
}

8. 避免资源抢占,同时尝试三次抢占。

 // 2.redis中没值,就从资源池中选择,抢占
$retryTimes = 0;
while ($retryTimes++ < 3) {
$jyeooAccount = JyeooAccount::query()
->inRandomOrder()
->where('is_using', JyeooAccount::IS_USING_NO)
->first();
if (empty($jyeooAccount)) {
break;
}
$result = JyeooAccount::query()
->where('id', $jyeooAccount->id)
->where('is_using', JyeooAccount::IS_USING_NO)
->update([
'is_using' => JyeooAccount::IS_USING_YES,
'deadline' => $timeStamp,
'usage_time' => $jyeooAccount->usage_time+1
]);
if ($result) {
$accountId = $jyeooAccount->teacher_id;
break;
}
}

9. 变量名要统一,别到最后自己看不懂自己的变量名了,这样就很容易出bug,而且测试也不好测出因变量名出错而出现的bug。

10. if......else.....判断 尽量嵌套的层级要少些,多数情况下就是通过if判断某些特殊的情况,对这些特殊的情况进行特殊的处理,然后其余的情况走大逻辑。

11. 账号随机获取

// 如果账号已经存在,那么就重新获取;
if (!is_null($jyeooAccount)) {
$min = JyeooAccount::query()
->max('teacher_id');
$teacherId = random_int($min, $min + 1000);
}

12. 重要的数据库写操作要用到事务

try{
$timeStamp = Carbon::now()->addMinutes($this->config['cacheMinute'])->timestamp;
DB::beginTransaction();
$newJyeooAccount = new JyeooAccount();
$newJyeooAccount->teacher_id = $teacherId;
$newJyeooAccount->is_using = JyeooAccount::IS_USING_YES;
$newJyeooAccount->deadline = $timeStamp;
$newJyeooAccount->usage_time = 1;
$newJyeooAccount->save();
DB::commit();
} catch (Exception $e) {
Log::error($e);
DB::rollback();
}

13. 账号池通知预警,10分钟通知一次,而且要判断使用了多少剩余多少

if ($usedNum >= $warningNum) {
  $cacheKey = 'xxxxxxx';
  if (!Cache::has($cacheKey)) {
$message = sprintf("菁优网账号池预警,已用帐号:%d,帐号池数量:%d", $usedNum, $totalNum);
$token = $this->config['dingTalkToken'];
$dingTalk = app(DingTalk::class);
$dingTalk->setToken($token)->sendTextMessage($message);
Cache::put($cacheKey, 1, 10); // 10分钟只通知一次
}
}

14. 像发送请求这个东西,可以放到一个类里,然后通过调用这个类中的方法,这样可以做好封装,对用户黑盒。

$dingTalk = app(DingTalk::class);
$dingTalk->setToken($token)->sendTextMessage($message);

15. 给钉钉聊天群发送信息

class DingTalk
{
private $token; private $url = 'https://oapi.dingtalk.com/robot/send'; public function __construct($token = '')
{
if (!empty($token)) {
$this->token = $token;
}
} public function sendTextMessage($message)
{
$data = array('msgtype' => 'text', 'text' => array('content' => $message));
$data_string = json_encode($data);
$url = $this->url . '?access_token=' . $this->token;
return $this->httpRequest($url, $data_string);
} public function setToken($token)
{
$this->token = $token;
return $this;
} /**
* 发送curl请求
*
* @param $remote_server
* @param $post_string
* @return mixed
*/
private function httpRequest($remote_server, $post_string)
{
$env = app()->environment();
if ($env != 'production') {
Log::info('SKIP_SEND_DING_TALK_MESSAGE', [$remote_server, $post_string]);
return false;
} $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $remote_server);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
$data = curl_exec($ch);
curl_close($ch); return $data;
}
}

16. laravel自动创建日志。日志功能很重要,和高手的差距之一就是通过日志排查错误。而且自己在写日志的时候,一定要能知道,谁,在哪,什么时候,事情,事情的结果。就跟记叙文一样

use App\Console\Commands\LogTrait;
use LogTrait;
$this->log($result, $teachingMaterial->toArray()); public function printProgress()
{
$this->info(sprintf(
"上传进度:%.2f%%(%d/%d), 成功:%d 失败:%d",
$this->finishNum / $this->totalNum * 100,
$this->finishNum,
$this->totalNum,
$this->successNum,
$this->failNum
));
}

17. 把任务放到队列中,当任务失败的时候,队列可以尝试重新执行,6666666。

18. while循环往往会比递归的效率更高,所以有时候为了提高系统的效率就使用while。

二、laravel相关知识点

19. firstOrCreat、updateorCreate

20. whereIn一次查询替换where数组,能省好多次查询。

21. 懒加载功能,是指在查询的过程中,一次性把与其相关的数据查询出来。具体如下:

public function childFiles()
{
if ($this->type == 1) {
return $this->hasMany(TeachingMaterialModel::class, 'father_id');
} return $this->hasMany(LectureNoteModel::class, 'father_id');
} public function childCatalogues()
{
return $this->hasMany(CatalogueModel::class, 'father_id');
}

22. 方法

    /**
*
* $instance->is_empty
*
* @return bool
*/
public function getIsEmptyAttribute()
{
if (count($this->childFiles) > 0) {
return false;
} return true;
} public function getCatalogueEmptyAttribute()
{
if (count($this->childCatalogues) > 0) {
return false;
} return true;
}

23. 读取一条随机数

User::inRandomOrder()->first();

24. 获取某个时间点的时间戳

echo Carbon::now()->addDays(25); //2016-11-09 14:00:01
echo Carbon::now()->addWeeks(3); //2016-11-05 14:00:01
echo Carbon::now()->addHours(25); //2016-10-16 15:00:01
echo Carbon::now()->subHours(2); //2016-10-15 12:00:01
echo Carbon::now()->addHours(2)->addMinutes(12); //2016-10-15 16:12:01
echo Carbon::now()->modify('+15 days'); //2016-10-30 14:00:01
echo Carbon::now()->modify('-2 days'); //2016-10-13 14:00:01 $time = Carbon::now()->timestamp;
  1. // 直接使用字符串
  2. echo Carbon::now('Europe/London'); //2016-10-14 20:21:20
  3. // 或者
  4. echo Carbon::now(new DateTimeZone('Europe/London'));

  1. echo Carbon::now(); // 2016-10-14 15:18:34
  2. echo Carbon::today(); // 2016-10-14 00:00:00
  3. echo Carbon::tomorrow('Europe/London'); // 2016-10-14 00:00:00
  4. echo Carbon::yesterday();

  //要想获取字符串类型的日期,可以使用下面的代码:

  1. echo Carbon::today()->toDateTimeString();
  2. echo Carbon::yesterday()->toDateTimeString();
  3. echo Carbon::tomorrow()->toDateTimeString();

  

  //可以使用 parse 方法解析任何顺序和类型的日期(结果为 Carbon 类型的日期时间对象):

  1. echo Carbon::parse('2016-10-15')->toDateTimeString(); //2016-10-15 00:00:00
  2. echo Carbon::parse('2016-10-15')->toDateTimeString(); //2016-10-15 00:00:00
  3. echo Carbon::parse('2016-10-15 00:10:25')->toDateTimeString(); //2016-10-15 00:10:25
  4. echo Carbon::parse('today')->toDateTimeString(); //2016-10-15 00:00:00
  5. echo Carbon::parse('yesterday')->toDateTimeString(); //2016-10-14 00:00:00
  6. echo Carbon::parse('tomorrow')->toDateTimeString(); //2016-10-16 00:00:00
  7. echo Carbon::parse('2 days ago')->toDateTimeString(); //2016-10-13 20:49:53
  8. echo Carbon::parse('+3 days')->toDateTimeString(); //2016-10-18 20:49:53
  9. echo Carbon::parse('+2 weeks')->toDateTimeString(); //2016-10-29 20:49:53
  10. echo Carbon::parse('+4 months')->toDateTimeString(); //2017-02-15 20:49:53
  11. echo Carbon::parse('-1 year')->toDateTimeString(); //2015-10-15 20:49:53
  12. echo Carbon::parse('next wednesday')->toDateTimeString(); //2016-10-19 00:00:00
  13. echo Carbon::parse('last friday')->toDateTimeString(); //2016-10-14 00:00:00

  

  //构造日期

  1. $year = '2015';
  2. $month = '04';
  3. $day = '12';
  4. echo Carbon::createFromDate($year, $month, $day); //2015-04-12 20:55:59
  5. $hour = '02';
  6. $minute = '15':
  7. $second = '30';
  8. echo Carbon::create($year, $month, $day, $hour, $minute, $second); //2015-04-12 02:15:30
  9. echo Carbon::createFromDate(null, 12, 25); // 年默认为当前年份
// 日期操作
日期操作可以通过 add (增加)或 sub (减去)跟上要增加或减去的单位来完成。例如,你想给一个日期增加指定的天数,你可以使用 addDays 方法。此外还提供了一个 modify 方法,参数格式为 + 或 - 跟上值及单位。所以,如果你想给当前日期增加一年,你可以传递 +1 year
echo Carbon::now()->addDays(25); //2016-11-09 14:00:01
echo Carbon::now()->addWeeks(3); //2016-11-05 14:00:01
echo Carbon::now()->addHours(25); //2016-10-16 15:00:01
echo Carbon::now()->subHours(2); //2016-10-15 12:00:01
echo Carbon::now()->addHours(2)->addMinutes(12); //2016-10-15 16:12:01
echo Carbon::now()->modify('+15 days'); //2016-10-30 14:00:01
echo Carbon::now()->modify('-2 days'); //2016-10-13 14:00:01
//
  • eq – 判断两个日期是否相等。
  • gt – 判断第一个日期是否比第二个日期大。
  • it – 判断第一个日期是否比第二个日期小。
  • gte – 判断第一个日期是否大于等于第二个日期。
  • ite – 判断第一个日期是否小于等于第二个日期。

  1. echo Carbon::now()->tzName; // America/Toronto
  2. $first = Carbon::create(2012, 9, 5, 23, 26, 11);
  3. $second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
  4. echo $first->toDateTimeString(); // 2012-09-05 23:26:11
  5. echo $first->tzName; // America/Toronto
  6. echo $second->toDateTimeString(); // 2012-09-05 20:26:11
  7. echo $second->tzName; // America/Vancouver
  8. var_dump($first->eq($second)); // bool(true)
  9. var_dump($first->ne($second)); // bool(false)
  10. var_dump($first->gt($second)); // bool(false)
  11. var_dump($first->gte($second)); // bool(true)
  12. var_dump($first->lt($second)); // bool(false)
  13. var_dump($first->lte($second)); // bool(true)
 

qxx 项目总结的更多相关文章

  1. qxx项目大文件上传

    1. 在做大文件上传的时候,要注意修改文件的配置,php.ini的配置,还有连接时间.这些东西都记不清了,明天需要问一下芳哥,然后遇到问题的时候就能自己解决了. 2. 然后就遇到一个很尴尬的问题:大文 ...

  2. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目

    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...

  5. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  6. Travis CI用来持续集成你的项目

    这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  9. Angular企业级开发(5)-项目框架搭建

    1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...

随机推荐

  1. centos7.3安装redis

    yum install epel-release yum install redis 如果支持从其他机器能访问,需要修改配置文件 /etc/redis.conf,注释掉 bin 127.0.0.1 如 ...

  2. linux服务器文件索引inodes满了

    inode节点中,记录了文件的类型.大小.权限.所有者.文件连接的数目.创建时间与更新时间等重要的信息,还有一个比较重要的内容就是指向数据块的指针.一般情况不需要特殊配置,如果存放文件很多,需要配置. ...

  3. centos crontab详解

    1.crontab安装 [root@CentOS ~]# yum install vixie-cron [root@CentOS ~]# yum install crontabs 说明:vixie-c ...

  4. appium— Android定位webView里面的UI元素

    Android SDK中的UIAutomator中本身是不支持网页中的UI元素定位,下面介绍几种常用的定位app内部的网页的UI元素的方法. 一.使用chrome浏览器调试移动端网页 这是使用最多的一 ...

  5. C++设计模式(第一周)

    part 1 设计模式简介 课程目标 1.理解松耦合设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF 核心设计模式 什么是设计模式? “每一个模式描述了一个在我们周围不断重 ...

  6. 07: python基础 零碎知识点

    目录: 1.1 python异常处理 1.2 三元运算,filter和map与lambda表达式结合使用举例 1.3 内置方法 1.4 动态导入模块 1.1 python异常处理返回顶部 1.Pyth ...

  7. DHacker 汉化

  8. P3939 数颜色

    目录 题目 思路1(待修莫队) 思路2(vector+二分) 代码1 代码2 题目 P3939 数颜色 思路1(待修莫队) 哇,这不是莫队模板题吗 3e5,TLE45分 不行 我有信仰啊 pow(n, ...

  9. Unity3D学习笔记(二十):Rect、Canvas、Toggle、Slider、ScrollBar

      Rect Transform(锚点):图片中心的四个点,界面以雪花形式显示 当四个点在一起的时候组成锚点,当四个点分开的时候组成锚框(合则锚点,分则锚框) Anchors: ----Min x:控 ...

  10. NS3 利用Gnuplot生成拥塞窗口例子fifth.cc的png图像

    参考链接:一个ns-3的Gnuplot例子 命令: (1)首先将fifth.cc拷贝到scratch目录下(由于环境变量的因素,./waf编译只对scratch目录下的文件有效,也可以忽略此步,直接. ...