Dashuang Du.
Dashuang Du.

study and practice, years of it.

Laravel 学习笔记 —— 注意事项

Laravel 学习笔记 —— 注意事项

2016, Oct 11    

1. utf8mb4 字符集

Laravel 5.4默认使用 utf8mb4 字符编码,而不是之前的 utf8 编码。刚升级到5.4的小伙伴经常会遇到如下的错误

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (
SQL: alter table `password_resets` add index `password_resets_email_index`(`email`))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes

这主要是 mysql 支持的 utf8 最大长度字符为3字节,我们在执行 migration 的时候字符串默认长度为255,在utf8编码下为765个字节,utf8mb4 最大长度字符为4字节,所以765个字节只能转换为191的长度。解决方法:ServiceProvider.php


use Illuminate\Support\Facades\Schema; 

/** 
* Bootstrap any application services. 
* 
* @return void 
*/ 
public function boot() 
{ 
     Schema::defaultStringLength(191); 
}

2. mysql 严格模式

laravel5.4 默认打开 MySQL 的严格模式,严格模式的意思是指 mysql 会对数据进行严格的校验,例如一个字段定义长度为10时,当写入长度大于10的数据时,严格模式下会报错,非严格模式下不存储溢出部分,而不会报错。还有类型检查,字符型的字段写入数字等操作在严格模式下均会报错。但这其实不是坑,而且非常有助于我们养成严格规定数据类型的习惯。在这里提出来,是因为我们有时候接手二次开发的项目,进行重构的时候经常会出现数据格式错误,临时解决办法是:

/**
config/database.php
*/
'mysql' => [
...
    'strict' => false,
]

PHP 作为一门弱类型、动态类型检查的语言,在给我们带来方便的同时也带来了很多隐患,养成良好的编程习惯,才是解决问题的根本方法。

3. 队列 Job 超时问题

有时候我们会有一些异步的请求,需要用到队列去处理,Laravel 为我们提供了很方便的任务队列。但是,laravel 队列中每个任务的默认执行时间为1分钟,超过一分钟的任务会重新进入队列的尾部。这会带来一些问题,当我们处理一些很耗时的任务时,这个任务会多次重新进入队列,导致这个任务执行多次。举个例子,当我们在一个任务中遍历用户列表,给每个用户发送一个模板消息,当1分钟内处理不完,会再次进入队列,导致每个用户收到多条消息。解决办法:

/**
 * Execute the job.
 * @param AliyunOssService $aliyunOssService
 * @return void
 */
public function handle(AliyunOssService $aliyunOssService)
{
    $this->job->delete();
    ...
}

在任务执行开始,删除这个任务,这样不管这个任务执行成功与否都不会再进入队列。

未完待续,本篇文章将长期更新…