近期需要做一些高性能webapi方面的尝试,发现市场上目前基于php主要有两种方案,swoole和workerman。
swoole是基于扩展,基于linux环境的高性能方案,其有现现成的服务框架如swoft等。
而workerman基于纯原生php,可基于linux或者windows或其他能直接运行php的环境,其也有现成的mvc web框架如webman。
本次主要基于workerman进行一些mvc的尝试。
测试目录如下:
workerman下有文件http_route4.php、http_route4.bat
bat文件中为:start php.exe http_route4.php
运行后即可监控起来:
inc里面有文件para.php,内容如下:
<?php
$root_path = $_SERVER['DOCUMENT_ROOT'];
$php_self = $_SERVER['PHP_SELF'];
$php_file_path=__FILE__;
if(file_exists("d:/wamp/www/rain_inc/"))set_include_path("d:/wamp/www/rain_inc/");
if(file_exists("/myweb/wwwroot/rain_inc/"))set_include_path("/myweb/wwwroot/rain_inc/");
http_route4.php主要内容如下:
<?php
chdir(dirname(__FILE__));//先切换到正确的目录
include("../inc/para.php");
require_once("vendor/autoload.php");
use Workerman\Worker;
use Workerman\Protocols\Http\Response;
//require_once './Workerman/Autoloader.php';
define('APPPATH',__dir__."/");
$worker = new Worker('http://0.0.0.0:8888');
$i=0;
$worker->onMessage = function($connection, $request)
{
global $i;
$i++;
$mvc_urls=explode("/",$request->path());
//$mvc_url_note="adasdf";
$mvc_len=count($mvc_urls);
$c="app";
$a="index";
if($mvc_len>1){
if($mvc_len==2&&!empty($mvc_urls[0])){$c=!empty($mvc_urls[0])?$mvc_urls[0]:"app";$a=!empty($mvc_urls[1])?$mvc_urls[0]:"index";}
if($mvc_len==3&&empty($mvc_urls[0])){$c=!empty($mvc_urls[1])?$mvc_urls[1]:"app";$a=!empty($mvc_urls[2])?$mvc_urls[2]:"index";}
$request->session()->set("aaa",2222);
if(file_exists("app/controllers/".$c.".php")){
include_once("app/controllers/".$c.".php");
$cls=new $c();
if(method_exists($c,$a)){
$return=$cls->$a($request);
}else{
$return="module:".$c." action:".$a." 404 can't found!";
}
$connection->send(json_encode($return));
}else
{
$connection->send("module file not found 404 error!");
}
}else
{
print_r($mvc_urls);
$connection->send("module not found mvc_len error!");
}
};
// 运行worker
Worker::runAll();
控制器文件user.php内容如下:
<?php
// include_once("system/core.php");load_page();
class user{
function index($request){
$depts=array("code"=>200,"msg"=>"index success!");
//echo json_encode($depts);
return ($depts);
}
function go($request){
$depts=array("code"=>200,"msg"=>"module user go success!","module"=>$request->sessionId(),"aaa"=>$request->session()->get("aaa"),"get"=>$request->get("a"));
return ($depts);
//return mvc_display($depts,"app","user","go");
}
}
实现的效果如下:
如果访问:http://localhost:8888/user/
则显示:
如果访问:http://localhost:8888/user/go,则显示
已实现简单的访问路由。