開發中常常遇到函數參數傳遞的問題;好比 A調用B,B調用C,C調用D, A->B->C->D php
而D方法可能須要一個參數,這個參數只能在A中獲取(好比A是控制器方法),這個參數這樣一級一級的傳遞下去就會顯得很是冗餘,Java中有 ThreadLocal 這樣的用法。設計模式
PHP 能夠這樣用: 利用類的 static 靜態屬性,這樣只須要在存入數據的時候set值,而後用到的時候能夠隨處可用。和「 註冊樹」設計模式 同理。數組
這裏舉個例子,在URL傳遞進來的參數,在攔截器中設置(LoginUserData類)靜態變量的值,而後能夠任何地方經過靜態方法調用 LoginUserData::getUser() 獲取數據。session
一、建立建一個類: (*靜態變量不侷限於某一種數據結構,爲了程序更健壯,最好用一個類;這裏演示用了數組)數據結構
<?php /** * User: szliugx@gmail.com * Date: 2018/11/4 * Time: 下午7:52 */ namespace App\Http\Middleware\Data; class LoginUserData { private static $user; public function setUser($user) { self::$user = $user; } public static function getUser() { return self::$user; } }
二、在攔截器中處理,根據傳遞的數據,設置靜態變量的值(*這裏能夠根據token或者session,轉換成將用戶信息)併發
<?php /** * User: szliugx@gmail.com * Date: 2018/7/30 * Time: 上午10:22 */ namespace App\Http\Middleware; use App\Http\Middleware\Data\LoginUserData; use Illuminate\Http\Request; use Closure; class BaseInterceptor { /** * 基礎攔截器 * * @param Request $request * @param Closure $next * @return mixed * @throws \App\Exceptions\BusinessException */ function handle(Request $request, Closure $next) { // 已經登陸放行 $loginUserData = new LoginUserData(); $loginUserData->setUser(['name' => $request->get('name'), 'age' => $request->get('age')]); return $next($request); } }
三、獲取以前存入的值(*,注意不單單侷限於在控制器層中獲取,能夠在service層,甚至Util方法中使用)dom
<?php /** * Created by PhpStorm. * User: liugx * Date: 2018/9/9 * Time: 下午12:57 */ namespace App\Http\Controllers; use App\Http\Middleware\Data\LoginUserData; use Illuminate\Http\Request; class TestController extends Controller { public function test(Request $request) { sleep("2"); $userData = LoginUserData::getUser(); return "{$request->get('name')} = " . $userData['name'] . ",{$request->get('age')} = " . $userData['age']; } }
四、利用Python併發測試了一把,發現數據沒問題「經過URL參數傳遞的數據,在使用時數據能對上的」。ide
# -*- coding: utf-8 -*- import requests import threading import time import random class postrequests(): def __init__(self): self.url = 'http://127.0.0.1:1215/itx/test?name={0}&age={1}' def post(self): if random.randint(1, 99) % 2 == 0: url = self.url.format('a', random.randint(10000, 100000)) else: url = self.url.format('b', random.randint(1, 10000)) try: r = requests.get(url) print(r.text) print("\n") except Exception as e: print(e) def login(): login = postrequests() return login.post() try: i = 0 # 開啓線程數目 tasks_number = 25 print('測試啓動') time1 = time.clock() while i < tasks_number: t = threading.Thread(target=login) t.start() i += 1 time2 = time.clock() times = time2 - time1 print(times / tasks_number) except Exception as e: print(e)