怎样在onMessage里使用异步http_client?

0

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

已邀请:

six

赞同来自: kenny534

$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;
}
}

```贴上代码,供新手学习,高手指点。

要回复问题请先登录注册