框架篇:6.简单测试
PHP DIY系列–一起手写一个api框架
虽然框架基本完成,但我们还没有测试过。
我们使用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);
}
}
我们测试下:
我们发现能正常获取获取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);
}
测试正常。
另外,做一下说明,我们可以使用public function test($params),是源于我们Request,将参数注入到方法里。
public function runAction($route)
{
... 省略代码
return $controller->$action(array_merge($this->getQueryParams(), $this->getBodyParams()));
}
性能测试
我们使用的是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”)。
因为我们的框架没有中间件、组件之类的,所以性能对比yii2、laravel,QPS要高很多。
框架篇:6.简单测试
https://blog.puresai.com/2020/02/13/phpframe09/