PHP DIY 系列------框架篇:6. 簡單測試與 bug 修復

13sai發表於2020-02-20

雖然框架基本完成,但我們還沒有測試過。

我們使用postman作為介面測試工具(http://saif.com/test)。

// 自定義路由
return [
    'debug' => false,
    'route' => [
        '' => 'demo/welcome',
        'test' => 'demo/test',
    ],
];



class DemoController extends Controller
{
    public function welcome($params)
    {
        return $this->response->json(['hello' => 'welcome']);
    }

    public function test($params)
    {
        return $this->response->json($params);
    }
}

postman

我們測試下:

image
image
image

我們發現能正常獲取獲取GET引數,但沒有獲取到POST引數。

debug:

我們發現Content-Type輸出是:

multipart/form-data; boundary=--------------------------498010462598077868347660

我們優化一下程式碼:

public function getBodyParams()
{
    $contentType = strtolower($this->getHeader('Content-Type'));
        // p($contentType);
    if (strpos($contentType, 'multipart/form-data') === false) {
        $this->_bodyParams = \json_decode(file_get_contents("php://input"), true);
    } else {
        $this->_bodyParams = $_POST;
    }

    return $this->_bodyParams?? [];
}

另外我們發現getHeader方法有點問題:

public function getHeader($name, $defaultValue = null)
{
    $name = ucfirst($name);
    if (function_exists('apache_request_headers')) {
        $headers = apache_request_headers();
        p($headers);
        return $headers[$name]?? $defaultValue;
    }
    // $_SERVER使用下劃線
    $name = strtoupper(str_replace('-', '_', $name));
    // 部分自定義引數需要加上HTTP_
    return $_SERVER[$name]?? ($_SERVER['HTTP_'.$name] ?? $defaultValue);
}

image

測試正常。

另外,做一下說明,我們可以使用public function test($params),是源於我們Request,將引數注入到方法裡。

public function runAction($route)
{
    ... 省略程式碼

    return $controller->$action(array_merge($this->getQueryParams(), $this->getBodyParams()));
}

效能測試

我們使用的是wrk壓測

wrk

> git clone https://github.com/wg/wrk
> cd wrk 
> make
> ln -s ./wrk /usr/bin/wrk
wrk引數:

-c,    --connections(連線數):      total number of HTTP connections to keep open with each thread handling N = connections/threads
-d,    --duration(測試持續時間):     duration of the test, e.g. 2s, 2m, 2h
-t,    --threads(執行緒):            total number of threads to use
-s,    --script(指令碼):             LuaJIT script, see SCRIPTING
-H,    --header(頭資訊):           HTTP header to add to request, e.g. "User-Agent: wrk"
       --latency(響應資訊):         print detailed latency statistics
       --timeout(超時時間):         record a timeout if a response is not received within this amount of time.
-v,    --version(版本資訊)          Print version details

我們僅僅在控制返回空資訊,然後對比yii2(返回字串“yii2”),laravel5.5(返回字串“laravel5.5”)。

image

image

因為我們的框架沒有中介軟體、元件之類的,所以效能對比yii2、laravel,QPS要高很多。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

分享開發知識,歡迎交流。qq957042781

相關文章