关于workerman与codeigniter结合使用的调用方式

发布于 2022-09-07 22:55:26 字数 1159 浏览 17 评论 0

请问一下,如果workerman想通过TP、CI之类的PHP框架来启用,但是框架里有部分配置文件使用了$_SERVER常量,CLI模式下获取不到$_SERVER会引起报错,这种是应该怎么处理?

class Mqtt extends CI_Controller {
    public function index()
    {
        $worker = new Worker();
        $worker->onWorkerStart = function(){
            $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
            $mqtt->onConnect = function($mqtt) {
                $mqtt->subscribe('hello');
            };
            $mqtt->onMessage = function($topic, $content){
                var_dump($topic, $content);
            };
            $mqtt->connect();
        };
        Worker::runAll();
    }
}

图片描述

=======================================================
问题二
启动执行:

图片描述

以上这种启动是结合CI框架的启动方式,应该怎么加参数才可以实现类似直接启动workerman的下面效果

php start.php start -d

========================================================
问题三
CI和workerman之间通讯除了使用队列,还有其他可以在CI里主动去调用或者触发workerman响应的方法么(这里提问的并非workerman和客户端之间的通讯)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

往事风中埋 2022-09-14 22:55:26

自己找到了一个方法STDIN常量来判断是否CLI调用,来写入配置文件

if (defined('STDIN'))
{
   //hardcode the base url for cli
   $config['base_url'] = "http://yoursite.com/";
}
else
{
   $config['base_url'] = "http".((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "s" : "")."://".$_SERVER['HTTP_HOST'].str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
} 

第二个问题,看完Worker.php的源码,写了个控制器来暴力自己改传入的参数

class Mqtt extends CI_Controller {

    public function index($argv=array())
    {
        $worker = new Worker();
        $worker->onWorkerStart = function(){
            $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
            $mqtt->onConnect = function($mqtt) {
                $mqtt->subscribe('hello');
            };
            $mqtt->onMessage = function($topic, $content){
                var_dump($topic, $content);
            };
            $mqtt->connect();
        };
        Worker::runAll();
    }

    public function start($mode='')
    {
        global $argv;
        $argv[1] = 'start';
        $argv[2] = $mode;
        $this->index($argv);
    }

    public function stop($mode='')
    {
        global $argv;
        $argv[1] = 'stop';
        $argv[2] = $mode;
        $this->index($argv);
    }

    public function restart($mode='')
    {
        global $argv;
        $argv[1] = 'restart';
        $argv[2] = $mode;
        $this->index($argv);
    }

    public function reload($mode='')
    {
        global $argv;
        $argv[1] = 'reload';
        $argv[2] = $mode;
        $this->index($argv);
    }

    public function status($mode='')
    {
        global $argv;
        $argv[1] = 'status';
        $argv[2] = $mode;
        $this->index($argv);
    }

    public function connections($mode='')
    {
        global $argv;
        $argv[1] = 'connections';
        $argv[2] = $mode;
        $this->index($argv);
    }

图片描述

小巷里的女流氓 2022-09-14 22:55:26

第一个问题: 判断是否是CLI环境,有两种方法:
(1)使用PHP内置函数:php_sapi_name()
(2)使用PHP内置常量:PHP_SAPI
第二个问题:workerman框架本身不支持你说的这种参数的,除非修改内核代码,当然这是不推荐的。所以只能自己外面扩展封装一层,我看你的贴图代码已经实现类似效果了呢,就是这意思。

半城柳色半声笛 2022-09-14 22:55:26

管用,感谢分享,解决了我的问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文