引入自身框架刷新页面不显示

xiaooao

场景:
自已写的框架如:ThinkMan,有一个自定义的加载类Autoloader.php 用来加载ThinkMan的,
站点入口文件index.php 通常是引入ThinkMan的 Autoloader.php来完成功能;
在没有使用Workerman之前,一切正常,
为了体验强大的Workerman,在ThinkMan下通过composer引入workerman,
启动脚本start.php正常启动,端口正常.

问题:
使用WebServer后,所有的站点页面只显示一次,刷新后就变成空白,
测试后发现是加载ThinkMan下的Autoloader.php导致的。
如果不引入Autoloader.php单独使用ThinkMan下的类功能是正常的,页面也能正常显示,刷新不空白

那么请问,我是哪里出了问题呢?

Autoloader.php:

class Autoloader{
    protected static $classMap = array();

    public static function load($class){
        $class_file = str_replace('\\','/',dirname(__DIR__).'/'.$class.'.php');
        if(!isset(self::$classMap)){
            if(file_exists($class_file)){
                require_once $class_file;
                self::$classMap = $class;
                return true;
            }else{
                return false;
            }
        }else{
            return true;
        }
    }
}

spl_autoload_register('\ThinkMan\Autoloader::load');
2777 9 0
9个回答

walkor

这个其他人很难定位问题,要自己查了

  • 暂无评论
xiaooao

感谢@walkor ,
花了两三天时间才查出是wm的Worker::runAll() 与自身框架执行顺序的问题

另外请教一个问题:
如何在不使用如memcache来存储传递$_SESSION的情况下彻底销毁$_SESSION?

如在退出登录时:unset($_SESSION)后在当前页面$_SESSION是被清为空了
但在其它页面依然能访问到$_SESSION值。

  • 暂无评论
walkor

$_SESSION 是http协议里的,而且必须调用Http::sessionStart() 才能正确使用。

否则$_SESSION在workerman里就只是内存中一个超级全局变量,每个请求都共用,但是每个进程不同步。如果在A进程unset($_SESSION),A进程处理的请求里确实没有$_SESSION变量了,但是B进程处理的请求$_SESSION还是存在

  • 暂无评论
xiaooao

那也就是说没有办法一次性销毁整个超级全局变量$_SESSION咯

  • 暂无评论
walkor

unset($_SESSION)就是把当前的$_SESSION一次性销毁了

  • 暂无评论
xiaooao

感谢@walkor
$_SESSION的问题已经想办法解决了

另外碰到一个上传的问题,如同一个form表单下有两个或多个上传控件:

<form method="post" enctype="multipart/form-data" action="...">
<input type="file" name="file1" />
<input type="file" name="file2" />
<button type="submit">上传</button>
</form>

当提交后后台只能拿到最后个input的值
var_export($_FILES)也只能拿到最后一条数据
是表单设计有相应的规则吗还是哪里的问题?

  • 暂无评论
walkor

这个问题前两周修复了,更新下版本

  • 暂无评论
xiaooao

谢谢,
但还是出了个小问题
用composer update 显示更新到3.4.4成功,但问题依然存在,
后面从官网下载直接覆盖才解决了

  • 暂无评论
walkor

之前composer没更新,
现在更新了,3.3.5版本

  • 暂无评论
年代过于久远,无法发表回答
🔝