Laravel框架關鍵技術解析(3)redis資料庫,會話等

CopperDong發表於2018-04-02

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頁面設計:使用者認證模組、使用者管理模組、筆記類別管理模組和筆記管理模組。


相關文章