写了一个定时器的任务,但是在调用自己写的类的时候,使用命令空间一直报错找不到类,

xiaozhu

<?php

ini_set("memory_limit", "-1");

use Workerman\Worker;
use \Workerman\Lib\Timer;
use Applications\My\Service\TestTime;

//引入自动加载类
//第一种方法
//require_once DIR . '/../../vendor/autoload.php';

//第二种方法
require_once DIR.'/../../vendor/workerman/workerman/Autoloader.php';

// 创建一个Worker监听1234端口,使用http协议通讯
$http_worker = new Worker('http://0.0.0.0:1234');

//设定名字
$http_worker->name = 'TestTimeWorker';

// 启动1个进程对外提供服务
$http_worker->count = 1;

//设置Worker子进程启动时的回调函数,每个子进程启动时都会执行
$http_worker->onWorkerStart = function ($http_worker) {

Timer::add(1, function () {
    TestTime::doData();
});

};

//接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function ($connection, $data) {
// 向浏览器发送hello world
$connection->send('hello world');
};

// 如果不是在根目录启动,则运行runAll方法,运行worker
if (!defined('GLOBAL_START')) {
Worker::runAll();
}

报错:
Class 'Applications\My\Service\TestTime' not found in /Users/rich/www/myworkerman/Applications/My/start_demotime.php:38

阅读 481
2个回答

不败少龙

不能有die

  • 暂无评论
xiuwang

因为你的项目没有自动加载功能吧。
自己写一个autload自动加载,如果不会写就用composer给你项目生成一个自动加载。

项目根目录执行composer require workerman/workerman ,会生成composer.json内容如下

{
    "require": {
        "workerman/workerman": "^4.0"
    }
}

将composer.json改为

{
    "require": {
        "workerman/workerman": "^4.0"
    },
    "autoload": {
       "psr-4" : {
          "Applications\\" : "./Applications"
        }
    }
}

执行 composer dumpautoload

然后代码里引用自动加载文件

require_once __DIR__ . '/vendor/autoload.php';

这样就给你自己的项目生成了一个自动加载,符合psr4规范的类都可以自动加载进来

  • xiaozhu 2021-10-15

    感谢大佬,按你说的确实可以了,想问下require_once DIR . '/vendor/autoload.php';和vendor/workerman/workerman/Autoloader.php';有什么区别吗

  • xiuwang 2021-11-03

    workerman/Autoloader.php'; 感觉是给非vendor环境用的加载workerman自身类文件的,估计不能自动加载你的业务类。vendor/autoload.php 是使用composer安装的类都可以自动加载