3.1 Redis数据库
一般会将存入的数据先存在内存中,当存储的内容达到一定数量或者经过一定时间后,才将内容存储到磁盘上,所以redis数据库对数据的存储和操作非常块,因为大部分数据操作是在内存中完成的。同时,redis数据库要比MemCache功能更强,以为它可以实现数据的持久化存储,即存储在磁盘上,而且redis数据库提供了strings、hashes、lists、sets、sorted sets、bitmaps和hyperloglogs七种数据结构。
3.2 会话
网景公司开发的Cookie技术是目前识别用户、实现会话控制最好的方法,我们可以将session等技术当做是Cookie技术的扩展。Laravel框架中没有使用PHP本身的session机制。
Cookie技术:会话Cookie和持久Cookie。
session技术:Cookie的工作机制是将信息记录在客户端,而session技术是将信息记录在服务器端,服务器存储信息的方式有很多种,可以是文件、数据库和内存等。 这里以文件存储的方式介绍session的工作步骤:
1)客户端第一次访问某服务器。
2)服务器通过Cookie发送sessionID给客户端,并在服务器建立一个与sessionID同名的文件用于存储信息,而sessionID不能重复,即不同客户端的sessionID是不同的。
3)客户端再次访问服务器时会携带服务器发送给客户端的sessionID。
4)服务器根据客户端发送的sessionID查找对应的文件,读取文件中的内容。
通过上面可以看出,session的工作依赖Cookie的工作,当然不同Cookie也可以实现sessionID的传递,如URL,但是用Cookie最方便。
PHP本身的session是如何工作的呢?首先,在需要共享客户端信息的文件中通过session_start()函数开启session,然后就可以向$_SESSION全局数组中存入或读取数据,而$_SESSION数据与其他数组不同的是,当向该数组中添加数据时,PHP还会将其中的数据序列化写入session文件中,每次开启session时,PHP会将session文件中的数据读取到该全局数组中,实现数据共享的功能。
Laravel框架中的session机制:重新设计了session的处理机制,步骤:
1)当客户端访问服务器时,服务器将开启session,检测请求的Cookie中是否携带sessionID,如果携带则使用该sessionID,如果没有则新产生一个sessionID。这个过程可以称为session的启动阶段。
2)根据sessionID来恢复之前存储的数据,在请求处理期间可以使用恢复的数据,同时也可以向session中继续添加或删除数据,这个过程可以称为session的操作阶段。
3)当返回响应时,将session中的数据存储到相应的位置,以备下一次请求到来时使用并发送sessionID的Cookie。这个过程可以称为session的关闭阶段。
3.3 消息队列
在大型的Web项目开发中,很多情况下不可能通过一种语言实现,需要发挥不同语言的优势,比如PHP,虽然在理论意义上它可以做Web开发中的所有事情,但是有些问题用它解决效率将会非常低,比如实时socket连接和分布式事务处理等。对于实时socket连接和推送等问题,nodejs更为擅长,实现效率也最高。对于分布式事务处理,Java更为擅长,特别是与银行等金融行业的接口几乎都需要用Java实现。对于不同语言间的通信可以用消息队列来解决,PHP接收用户的请求并把任务封装成消息投送到消息队列中,Java或node.js等语言编写的程序从消息队列中获取消息并进行下一步的任务处理。对于大型项目,PHP可能只用来做与用户间的交互,而后期的处理由其他语言来处理。通过消息队列可以将多种语言、多台服务器连接起来,最终实现分布式开发。
同步类型消息队列:消息发送就是将封装并序列化后的消息存储在消息队列维护的存储空间中,这种存储空间可能是多种形式的,如文件、内存和数据库等。消息生成、消息队列生成、消息封装与发送。消息处理:同步类型没有消息存储和获取的过程,而是直接进入消息处理阶段,但是一般的消息都会有消息存储和获取阶段。
数据库类型消息队列:消息存储在数据库中,所以需要配置数据库中的相应选项。
3.4 认证与数据验证
Laravel框架提供了完整的认证和数据验证模块,使得开发相关的功能变得非常简单。
认证:laravel/config/auth.php,配置,数据表的建立,添加用户认证路由,认证视图的创建,用户权限认证。
数据验证:提供了Validation类用于验证数据的正确性,如果验证数据错误,则给出相应的错误信息。
3.5 思维笔记实例
一个笔记管理的软件,对于这个小项目,由于项目较小,功能单一,可以从数据库设计入手,然后是路由设计,最后是控制器设计和Web页面设计。
数据库设计:分两个部分,一个是数据库中数据表的设计,另一个是对数据库中各数据表操作的接口设计。一般用数据库设计软件(如Power Designer等)完成数据库的结构设计,之后再通过SQL语句完成数据表的创建,但是这种方法在数据表创建和后期修改时都比较麻烦,效率低下。
Laravel框架为我们提供了数据迁移工具,可以实时管理和更新数据库中各数据表的结构,为数据库的版本控制和管理提供了极大的方便。
$ php artisan make:migration create_users_table
Created Migration: 2018_04_02_080059_create_users_table
$ subl database/migrations/2018_04_02_080059_create_users_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// 用户表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username', 32);
$table->string('account', 32);
$table->string('password', 60);
$table->rememberToken();
$table->unsignedInteger('addtime');
$table->tinyInteger('state')->unsigned()->default(1);
});
// 分类表
Schema::create('tb_category', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 32);
$table->unsignedInteger('count')->default(0);
$table->integer('uid');
//分类状态,确认是否被删除,1为正常,0为删除
$table->tinyInteger('state')->unsigned()->default(1);
});
// 笔记内容表
Schema::create('tb_records', function (Blueprint $table) {
$table->increments('id');
$table->string('title', 64);
$table->text('content')->nullable();
$table->integer('cid');
$table->integer('uid');
$table->unsignedInteger('addtime')->default(0);
//分类状态,确认是否被删除,1为正常,0为删除
$table->tinyInteger('state')->unsigned()->default(1);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tb_category');
Schema::dropIfExists('tb_records');
Schema::dropIfExists('users');
}
}
$ php artisan migrate //完成数据库迁移
模型类设计:操作接口,User.php
路由设计:需要进行模块化设计,否则随着业务的不断增加将会导致路由设计混乱不堪,继而使相应路由入口的权限认证、中间件处理等功能的添加变得困难,最终导致一些安全问题和路由错误。
划分为三个路由模块
1)思维笔记展示模块,即在用户没有登录的情况下依然可以看到相应内容;
2)用户认证模块,这部分主要实现用户的注册和登录;
3)思维笔记的管理模块,这部分内容是用户登录后可以操作的内容,主要包括用户的管理、笔记分类的管理和笔记的管理等内容。
Laravel框架提供了多种不同路由设计方式,有些方式使得路由设计简单灵活,如get()、post()等方法,有些方式适合模块化设计,如RESTful资源控制器(resouce()方法)、隐式控制器(controller()方法)等。
mindlevel/app/Http/routes.php
控制器设计与Web页面设计:用户认证模块、用户管理模块、笔记类别管理模块和笔记管理模块。