首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
有点疑问,为什么加载控制器时用include失败,需要用include_once才可以
打算学习下swoole,写了一个http_server的测试,结果出现下面这个问题(每间隔一个正常请求就出错一次): [attach]72[/attach] > PHP Fatal error: Cannot declare class indexController, because the name is already in use in /home/qi/workspace/swoole-chat-demo/controllers/indexController.php on line 10 [2016-11-18 00:06:32 *75439.1] ERROR zm_deactivate_swoole (ERROR 103): Fatal error: Cannot declare class indexController, because the name is already in use in /home/qi/workspace/swoole-chat-demo/controllers/indexController.php on line 10. [2016-11-18 00:06:32 $75435.0] WARNING swManager_check_exit_status: worker#1 abnormal exit, status=255, signal=0 代码如下: {{{ <?php $http = new swoole_http_server("0.0.0.0",9501); $http->on('request',function($request,$response){ ob_start(); if($request->server['request_uri'] == '/favicon.ico'){ echo file_get_contents('./favicon.ico'); }else{ $route = trim($request->get['r']); $routeArr = explode('/',$route); $controllerName = $routeArr[0]; $actionName = $routeArr[1]; $controllerFile = './controllers/'.$controllerName.'Controller.php'; $actionFullname = 'action'.ucfirst(strtolower($actionName)); if(is_file($controllerFile)){ include $controllerFile; $controllerClass = $controllerName.'Controller'; $controller = new $controllerClass(); $controller->$actionFullname(); } } $content = ob_get_clean(); $response->end($content); }); $http->start(); }}} 然后下载看了下Swoole框架libs/Swoole/Swoole.php文件中使用的是require_once,把其中加载控制器的include改为include_once后,就好了;不过有点不明白,这里一个请求应该是只加载执行了一次吧,为什么用include不行呢?
发布于8年前 · 0 次浏览 · 来自
提问
蓟
蓟羊毛
打算学习下swoole,写了一个http_server的测试,结果出现下面这个问题(每间隔一个正常请求就出错一次): [attach]72[/attach] > PHP Fatal error: Cannot declare class indexController, because the name is already in use in /home/qi/workspace/swoole-chat-demo/controllers/indexController.php on line 10 [2016-11-18 00:06:32 *75439.1] ERROR zm_deactivate_swoole (ERROR 103): Fatal error: Cannot declare class indexController, because the name is already in use in /home/qi/workspace/swoole-chat-demo/controllers/indexController.php on line 10. [2016-11-18 00:06:32 $75435.0] WARNING swManager_check_exit_status: worker#1 abnormal exit, status=255, signal=0 代码如下: {{{ <?php $http = new swoole_http_server("0.0.0.0",9501); $http->on('request',function($request,$response){ ob_start(); if($request->server['request_uri'] == '/favicon.ico'){ echo file_get_contents('./favicon.ico'); }else{ $route = trim($request->get['r']); $routeArr = explode('/',$route); $controllerName = $routeArr[0]; $actionName = $routeArr[1]; $controllerFile = './controllers/'.$controllerName.'Controller.php'; $actionFullname = 'action'.ucfirst(strtolower($actionName)); if(is_file($controllerFile)){ include $controllerFile; $controllerClass = $controllerName.'Controller'; $controller = new $controllerClass(); $controller->$actionFullname(); } } $content = ob_get_clean(); $response->end($content); }); $http->start(); }}} 然后下载看了下Swoole框架libs/Swoole/Swoole.php文件中使用的是require_once,把其中加载控制器的include改为include_once后,就好了;不过有点不明白,这里一个请求应该是只加载执行了一次吧,为什么用include不行呢?
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2018-03-22
g
gaoqing
swoole是常驻内存的,你第一次加载的class,第二次还在的,如果再include就会导致类或函数重复定义。建议所有类都单独放一个PHP文件,不要有任何直接执行的代码。类的php文件只加载一次。
赞
0
回复
2018-03-23
海
海风
这下明白了,感谢韩老师回复。 看了文档后,swoole的worker进程常驻这个概念有一点了解;但之前还以为http连接是短链接,每个http连接结束后,会把产生响应过程中生成的内容释放,websocket这一类持续的连接就不会释放。swoole开发确实跟通常的web服务器中进行开发区别还挺大。 看来光看文档理解还是不太透彻,需要多实践一下才行。
赞
0
回复