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

请问一下,如果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和客户端之间的通讯)

阅读 6k
3 个回答
✓ 已被采纳新手上路,请多包涵

自己找到了一个方法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);
    }

图片描述

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏