FileMonitor监控报错

收破烂的才子

问题:想把gatewaywork封装下,启动文件index.php首先是加载了vendor的core.php文件(文件内容附件),可以正常运行;
代码:

foreach(glob(APP_PATH.'_/start_.php') as $start_file)
{
    require_once $start_file;
}
// 标记是全局启动
Worker::runAll();

但是如果引入一个对象启动类比如Applicaiton::run();把上面的代码放入运行,此时启动后文件监控在终端报错!(报错信息说文件夹为空)
结论:经过测试发现只要将代码:

foreach(glob(APP_PATH.'_/start_.php') as $start_file)
{
    require_once $start_file;
}

//这个代码放入到core.php中,然后Worker::runAll();放入到封装的Applicaiton::run();
下,可以正常运行。
疑问:难道我不能把引入的那段代码放入到封装的Applicaiton::run();下,保证core.php一个清爽的代码:只有一行
Applicaiton::run();运行伟大的框架?
谢谢群主指导!

3213 5 0
5个回答

walkor

最后面截图调用栈里很明显 check_files_change($monitor_dir) 里$monitor_dir传了null导致的。

https://github.com/walkor/workerman-filemonitor/blob/master/Applications/FileMonitor/start.php#L6
$monitor_dir在这里是一个全局变量,你看看你是不是把它,放入到函数里变成临时变量了,导致读不到$monitor_dir。

  • 暂无评论
收破烂的才子

@walkor 真的很感谢您,但是我排查了下,还是不能发现问题!我再提问的时候首先已经看了手册,同时也看论坛相关回答,但是仍然有问题。。。。。
问题如附件图片
新的发现:如果我把路径写死,可以运行,但是mysql会启动好多次(图片5,图片6)
谢谢!

  • 暂无评论
damao

我看懂群主的意思了。

function a() 
{
    // 这个声明是在一个函数内部,是一个局部变量,不是全局变量
    $monitor_dir = xxxx;
    $worker = new Worker(..);
    $worker->onWorkerStart = function(){
        global $monitor_dir;  // 因为没有全局变量$monitor_dir,所以这里$monitor_dir是null
        ....
    }
}
damao

其实可以定义常量, define('MONITOR_DIR', 'xxxxxxx');
这样肯定哪里都能访问到了

  • 暂无评论
damao

最后提示意思是GatewayWorker/Lib/DbConnection类不在使用了,让用Workerman/Mysql类

  • 收破烂的才子 2017-04-11

    这个我知道,源码没有区别,直接吧源码的echo注释掉

  • 收破烂的才子 2017-04-11

    关键是最后为何reload那么多次?这个比较郁闷,正常不会那么多次

年代过于久远,无法发表回答
🔝