下载好ThinkPHP5.0
后,在根目录下创建server
目录,用于存放swoole
的服务等.
创建Http服务
直接引用之前Http
的代码吧.
现在我们假如我们要在浏览器通过live.dev:9503/index/index/qvbilam
来访问的时候.如果我们不去做修改是根本找不到tp
框架下index/index/qvbilam
的内容的.
当我们去请求地址的时候肯定是走到代码中request
的回调里面. 我们需要在回调函数里处理相应的逻辑.
当我们访问thinkphp
肯定是会先访问一个入口文件的,即pubilic/index.php
.所以每次访问都时候都必须让他经过index.php
.就好了~
在swoole
中有个onworkstart
函数,如何理解onworkerstart
函数.
现在服务设置中设置worker_num
.当我们启动这个服务的时候呢.它会走到workerstart
一个事件回调里面去,所以在启动服务的时候应该把thinkphp
框架里面的一些内容加载到worker
进程里去.
首先看一下thinkphp5.0
的index.php
可以看到它又加载了start.php
的引导文件,查看start.php
.
start.php
文件加载了一个base.php
的核心文件,所以直接把base.php
加载到workerstart
里面去.这样是为了能应用热加载./server/http_server.php
的WorkerStart
如下
start.php
文件中的执行应用是应该放在request
的回调里面去,就是这行代码
直接启动,出现报错
别担心哈.这是提示找不到文件.因为从/public/index.php
文件复制的内容.所以__DIR__
指的路径就是/public
.而服务是在/server
,修改/server/http_server.php
.
这样就没有错误啦~http
服务启动
关于引用
有些人也可能会想为什么不直接引用start.php
呢?那来试试引用start.php
会发生什么.
修改application\index\controller\Index.php
将/server/http_server.php
中WorkerStart
包含的base.php
替换成start.php
后,启动服务
诶嘿~输出了五次index/index/index()
返回内容.因为当启动http
服务的时候首先在设置中设置了5个worker
进程.会启动五次workerStart
.而workerStart
包含了start.php
.执行了thinkphp
的应用
这个内容就会去执行框架里的内容.因为没有传控制器模型方法,会自动默认为index/index/index
.所以没必要执行这个,只需要包涵框架里的文件加载到worker
里面就行,真正执行的只要在用户请求的时候再执行,也就是说将执行应用放到 request
里面就行.
检测服务
返回内容
当我们通过浏览器访问http
服务的时候页面返回的是hello
.而我们的index/index/index()
返回的是Index
啊!其实是因为server/http_server.php
中的request
中的这行代码
重启服务发现返回的是index/index/index()
返回的内容
获取传参
修改index/index/index()
访问测试
这是因为swoole
对超全局变量get
,post
,globals
等,如果进程还在,它是不会释放的.这样就就很难受,我们可以对这些参数进行判断,如果存在就删除它.
在server/http_server
的request
添加超全局变量处理逻辑.
重启测试,获取传参没有问题啦~
路由访问
创建新方法index/index/index.php
重启访问
查看thinkphp
的请求.用它的内置方法
是因为tp
会把控制器方法放到一个变量里去,而swoole
是不会注销掉的.所以会一直访问之前的action
.所以问题可能在server\http_server.php
的request
中.
进入/thinkphp/library/think/App.php
中查看run()
查看routeCheck()
继续查看path()
,进入/thinkphp/library/think/Request.php
如果路由第一次来会把他储存起,再进来因为没有释放内存就把第一次的请求返回.所以让每次请求都重新设置path
.把if (is_null($this->path))
的判断去掉.这里面还有个pathinfo()
方法也是一样的。把if (is_null($this->pathinfo))
判断去掉.
再在pathinfo()
添加
重启访问测试,没有问题~
面向对象优化
在server
目录下新建http.php
对swoole的http
服务进行面向对象编程.废话不多说,直接复制粘贴~
very good
6666
6666666
666666
马化腾