想把webman改成tcp協(xié)議(項(xiàng)目要求),做RPC服務(wù)有沒(méi)有大佬提供思路或者幫助,可以有償~
webman支持自定義進(jìn)程,做這個(gè)很容易。
1、新建文件 process/Rpc.php
編寫rpc進(jìn)程
<?php
namespace process;
use Workerman\Connection\TcpConnection;
class Rpc
{
public function onMessage(TcpConnection $connection, $data)
{
static $instances = [];
$data = json_decode($data, true);
$class = 'service\\'.$data['class'];
$method = $data['method'];
$args = $data['args'];
if (!isset($instances[$class])) {
$instances[$class] = new $class; // 緩存類實(shí)例,避免重復(fù)初始化
}
$connection->send(call_user_func_array([$instances[$class], $method], $args));
}
}
2、打開 config/process.php
增加配置啟動(dòng)rpc進(jìn)程
return [
// ... 這里省略了其它配置...
'rpc' => [
'handler' => process\Rpc::class,
'listen' => 'text://0.0.0.0:8888', // 這里用了text協(xié)議,也可以用frame或其它協(xié)議
'count' => 8, // 可以設(shè)置多進(jìn)程
]
];
3、新建 service/User.php
服務(wù) (目錄不存在自行創(chuàng)建)
<?php
namespace service;
class User
{
public function get($uid)
{
return json_encode([
'uid' => $uid,
'name' => 'tom'
]);
}
}
4、重啟webman php start.php restart
5、客戶端調(diào)用
<?php
$client = stream_socket_client('tcp://127.0.0.1:8888');
$request = [
'class' => 'User',
'method' => 'get',
'args' => [100], // 100 是 $uid
];
fwrite($client, json_encode($request)."\n"); // text協(xié)議末尾有個(gè)換行符"\n"
$result = fgets($client, 10240000);
$result = json_decode($result, true);
var_export($result);
以上客戶端代碼自己可以封裝成一個(gè)類
最終結(jié)果打印
array (
'uid' => 100,
'name' => 'tom',
)