怎样在onMessage里使用异步http_client?

kenny534

官方文档中给出的示例是在onWorkerStart 中创建http_client并完成异步http请求,我的问题是如何实现在onWorkerStart创建,但是不调用,把调用放到onMessage中呢?
如果把创建对象及调用http请求都放在onMessage,应该是可以实现,但会创建很对对象出来,浪费资源,请问有什么好方法,解决这个问题?

1781 3 0
3个回答

six
$worker->onWorkerStart = function (){
    global http_client;
    $http_client = ...
};

$worker->onMessage = function($con, $message){
    global http_client;
    $http_client->xxxx...
};

高级点的用类包装下。

class myClient
{
    public $instance;
    public function instance() {
        if (!$this->instance) {
            $this->instance = ....
        }
        return $this->instance;
    }
}

用的时候直接

myClient->instance()->xxxx...
kenny534

第二处方法,是不需要在onWorkerStart中实例化对象,直接在onMessage中使用单例么?如果是这样,那myClient类是不是要加上static 关键字?

kenny534

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

use Workerman\Worker;

$tcp_worker = new Worker('tcp://127.0.0.1:1234');

$tcp_worker->count = 1;

$tcp_worker->onWorkerStart = function (){
    //方法一:全局变量+参照官方文档创建一次对象
    global $http_client;
    $http_client = new Workerman\Http\Client();
    //方法二:全局变量+用类包装一下
    global $client;
    $client = new myClient();
};
$tcp_worker->onMessage = function ($connection,$data){
    //方法一:获取全局变量
    global $http_client;
    //方法一:调用全局变量
    $http_client->get('http://www.example.com/',
        function($response){
            var_dump($response->getStatusCode());
            echo $response->getBody();
        },
        function($exception){
            echo $exception;
        });
    //方法二:获取全局变量(类封装)
    global $client;
    //方法二:调用全局变量
    $client->instance()->get('http://www.example.com',
        function ($response){
            var_dump($response->getStatusCode());
            echo $response->getBody();
        },
        function ($exception){
            echo $exception;
        });
    //方法三:单例用法:
    Singleton::getInstance()->get('http://www.example.com',
        function ($response){
            var_dump($response->getStatusCode());
            echo $response->getBody();
        },
        function ($exception){
            echo $exception;
        });
};
Worker::runAll();
//类封装
class myClient{
    public $instance;
    public function instance(){
        if (!$this->instance){
            $this->instance = new Workerman\Http\Client();
        }
        return $this->instance;
    }
}
//单例
class Singleton{

    //创建静态私有的变量保存该类的对象
    static private $instance;

    //防止使用new直接创建对象
    private function __construct(){}

    //防止使用clone克隆对象
    private function __clone(){}

    static public function getInstance(){

        //判断$instance是否是http_client的对象,不是则创建
        if (!self::$instance instanceof Workerman\Http\Client ){
            self::$instance = new Workerman\Http\Client();
        }
        return self::$instance;
    }
}

```贴上代码,供新手学习,高手指点。
  • 暂无评论
年代过于久远,无法发表回答
🔝