Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP MCP 客户端 v1.0.0 发布!

PHP MCP 客户端 v1.0.0 发布!

作者头像
Tinywan
发布于 2025-05-08 08:02:21
发布于 2025-05-08 08:02:21
11900
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

简介

PHP MCP Client是一个PHP库,用于与实现Model Context Protocol (MCP)的服务器进行交互。它为开发者提供了友好的接口,可通过不同的传输方式(stdiohttp+sse)连接到单个MCP服务器,管理连接生命周期,发现服务器功能(工具、资源、提示),并执行诸如调用工具或读取资源等请求。

该库内部通过ReactPHP利用异步I/O来确保健壮性并处理服务器发送事件等功能,同时提供了简单的同步(阻塞)API用于常见用例,以及异步(基于Promise)API用于高级控制和并发操作。它遵循MCP规范模型,即一个客户端实例管理与一个服务器的有状态连接。

MCP介绍

Model Context Protocol (MCP)是一个开放标准,旨在规范AI助手和应用程序连接到外部数据源、API和工具(如代码库、数据库、网页浏览器)的方式。它作为一个通信层,使AI模型(如Claude,或通过OpenAI等框架集成的模型)能够安全地访问不同服务器提供的上下文并与之交互。这个客户端库允许你的PHP应用程序(在MCP术语中称为“主机”)使用一个或多个MCP服务器提供的功能。

特性

  • 客户端-服务器一对一模型:每个Client实例管理与单个配置好的MCP服务器的有状态连接,符合MCP规范。
  • 流畅的配置方式:使用Client::make()->with...()构建器模式轻松设置每个客户端实例。
  • 双API设计
    • 同步门面API:使用简单的阻塞方法(如client->listTools()、
    • 异步API:访问底层基于Promise的方法(如client->listToolsAsync()、
  • 多种传输方式支持
    • stdio:通过标准输入/输出与服务器进程通信。
    • http:通过HTTP POST和服务器发送事件(SSE)与服务器通信。
  • 明确的连接生命周期管理:需要调用->initialize()->initializeAsync()连接并执行握手操作后才能发出请求。提供disconnect() / disconnectAsync()方法断开连接。
  • 工具/资源/提示交互功能:提供全面的同步和异步方法,用于列出可用元素并执行tools/callresources/readprompts/get等请求。
  • 符合PSR标准:与标准PHP接口集成
    • PSR-3(LoggerInterface):集成应用程序的日志记录器。
    • PSR-16(SimpleCacheInterface):可选的服务器定义缓存。
    • PSR-14(EventDispatcherInterface):通过事件(需要异步处理)可选地处理服务器发送的通知。
  • 强大的错误处理机制:针对不同的失败模式提供特定的异常。
  • 异步核心:内部使用ReactPHP实现非阻塞I/O。

要求

  • PHP >= 8.1
  • Composer
  • (对于Stdio传输)能够执行服务器命令。
  • (对于Http传输)能够访问MCP服务器URL的网络权限。

安装

通过Composer安装该包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require php-mcp/client

必要的ReactPHP依赖(event-looppromisestreamchild-processhttp)会自动安装。

快速上手:简单同步使用(Stdio)

这个示例展示了如何连接到通过npx运行的本地文件系统服务器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php 
require'vendor/autoload.php';

usePhpMcp\Client\Client;
usePhpMcp\Client\Enum\TransportType;
usePhpMcp\Client\Model\CapabilitiesasClientCapabilities;
usePhpMcp\Client\ServerConfig;
usePhpMcp\Client\Exception\McpClientException;

$clientCapabilities = ClientCapabilities::forClient(); // 默认客户端功能
$userHome = $_SERVER['HOME'] ?? $_SERVER['USERPROFILE'] ?? getcwd();
$fsServerConfig = new ServerConfig(
    name: 'local_filesystem',
    transport: TransportType::Stdio,
    timeout: 15,
    command: 'npx',
    args: [
        '-y',
        '@modelcontextprotocol/server-filesystem',
        $userHome . '/Documents',
    ],
    workingDir: $userHome
);

$fsClient = Client::make()
    ->withClientInfo('MyFileSystemApp', '1.0')
    ->withCapabilities($clientCapabilities)
    // ->withLogger(new MyPsrLogger()) // 可选
    ->withServerConfig($fsServerConfig)
    ->build();

try {
    // 初始化连接(阻塞)
    $fsClient->initialize();

    // 同步交互
    $tools = $fsClient->listTools(); // 阻塞调用
    foreach ($tools as $tool) {
        echo"- Tool: {$tool->name}\n";
    }

    //... 调用其他方法,如 $fsClient->callTool(...)...

} catch (McpClientException $e) {
    echo"[MCP ERROR] ". get_class($e). ": ". $e->getMessage(). "\n";
    // 检查 $e->getPrevious() 获取底层传输/进程错误
} catch (\Throwable $e) {
    echo"[UNEXPECTED ERROR] ". $e->getMessage(). "\n";
} finally {
    // 断开连接(阻塞)
    if (isset($fsClient)) {
        $fsClient->disconnect();
    }
}

配置

配置包括以下几个方面:

  • 客户端标识:应用程序的名称和版本,直接传递给构建器。
  • 客户端功能:使用ClientCapabilities声明客户端支持的功能。
  • 服务器连接:使用ServerConfig配置客户端实例要连接的单个服务器的详细信息。
  • (可选)依赖项:日志记录器、缓存、事件分发器、事件循环。

ClientCapabilities

用于声明客户端支持的功能,使用静态工厂方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use PhpMcp\Client\Model\Capabilities as ClientCapabilities;

// 客户端支持从服务器采样请求
$clientCapabilities = ClientCapabilities::forClient(supportsSampling: true);

// 客户端不支持从服务器采样请求
$clientCapabilities = ClientCapabilities::forClient(supportsSampling: false);

// 待办事项:如果需要,添加对声明“roots”功能的支持

ServerConfig

定义如何连接到单个MCP服务器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use PhpMcp\Client\Enum\TransportType;
usePhpMcp\Client\ServerConfig;

// 示例:Stdio服务器
$stdioConfig = new ServerConfig(
    name: 'local_file_server',       // 必需:此配置的唯一ID
    transport: TransportType::Stdio, // 必需:传输类型
    timeout: 15.0,                   // 可选:请求超时时间(秒)
    command: 'npx',                  // Stdio必需:可执行文件
    args: [                          // Stdio可选:参数数组
        '-y',
        '@modelcontextprotocol/server-filesystem',
        '/path/to/project'
    ],
    workingDir: '/path/to/project',  // Stdio可选:工作目录
    env: ['DEBUG' =>'mcp*']         // Stdio可选:环境变量
);

// 示例:HTTP服务器
$httpConfig = new ServerConfig(
    name:'remote_web_agent',        // 必需:唯一ID
    transport: TransportType::Http,  // 必需:传输类型
    timeout: 45.0,                   // 可选:请求超时时间
    url: 'http://localhost:8080/sse',// Http必需:SSE URL
    headers: [                       // Http可选:认证/自定义头
        'Authorization' => 'Bearer xyz789'
    ],
);

从数组/JSON加载配置

可以轻松解析存储在数组中的配置(例如从JSON文件或框架配置中获取)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use PhpMcp\Client\ServerConfig;
usePhpMcp\Client\Exception\ConfigurationException;

$jsonConfig = '{
    "mcpServers": {
        "stdio_files": {
            "command": "php",
            "args": ["/app/mcp/file_server.php"],
            "timeout": 10
        },
        "http_api": {
            "url": "https://api.example.com/mcp/sse",
            "transport": "http",
            "headers": {"X-API-Key": "secret"}
        }
    }
}';

$decodedConfig = json_decode($jsonConfig, true)['mcpServers']?? [];

$serverConfigs = [];
foreach ($decodedConfig as $name => $data) {
    try {
        $serverConfigs[$name] = ServerConfig::fromArray($name, $data);
    } catch (ConfigurationException $e) {
        echo"Error parsing config for '{$name}': {$e->getMessage()}\n";
    }
}

// 现在 $serverConfigs['stdio_files'] 和 $serverConfigs['http_api'] 包含ServerConfig对象。

ClientBuilder

使用构建器组装Client实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use PhpMcp\Client\Client;
//... 其他用于Config、Logger等的use语句...
$client = Client::make()
    ->withClientInfo($clientName, $clientVersion) // 必需
    ->withCapabilities($clientCapabilities)       // 可选(提供默认值)
    ->withServerConfig($stdioConfig)              // 必需:服务器配置
    ->withLogger($myLogger)                       // 可选
    ->withCache($myCache, 3600)                   // 可选(缓存 + 生存时间)
    ->withEventDispatcher($myDispatcher)          // 可选
    ->withIdGenerator($myIdGenerator)             // 可选
    ->withLoop($myEventLoop)                      // 可选(默认为Loop::get())
    ->build();

使用方法

一旦为特定服务器配置好了Client实例:

1. 初始化连接

在发出请求之前,必须调用initialize()initializeAsync()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 同步(阻塞)
try {
    $client->initialize(); // 连接、执行握手操作,等待直到准备就绪
    echo"Connection Ready!";
} catch (Throwable $e) {
    echo"Initialization failed: ". $e->getMessage();
    // 处理错误... 客户端可能处于错误状态
}

// 异步(基于Promise)
$client->initializeAsync()->then(
    function(Client $readyClient) { /* 准备就绪 */ },
    function(Throwable $error) { /* 处理初始化失败 */ }
);
// 需要运行事件循环 ($client->getLoop()->run())

2. 发出请求

使用客户端方法,这些方法基于initialize()建立的单个连接进行操作。

  • 同步API(推荐用于简单脚本/框架):像listTools()callTool()readResource()等方法会阻塞执行,直到收到响应或超时。它们返回解析后的结果对象(如array<ToolDefinition>CallToolResult),或者抛出异常(TimeoutExceptionRequestExceptionConnectionException等)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    if ($client->isReady()) { // 检查状态
        $tools = $client->listTools();
        $result = $client->callTool('myTool', ['param' => 'value']);
    }
} catch (Throwable $e) { /* 处理错误 */ }
  • 异步API(用于异步应用或并发请求):像listToolsAsync()callToolAsync()readResourceAsync()等方法返回一个React\Promise\PromiseInterface。需要使用Promise方法(thencatchfinally)或React\Async\await(在Fiber上下文中)来处理结果。并且需要运行事件循环。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use functionReact\Promise\all;

if ($client->isReady()) {
    $p1 = $client->listToolsAsync();
    $p2 = $client->readResourceAsync('config://settings');

    all([$p1, $p2])->then(
        function(array $results) {
            [$tools, $readResult] = $results;
            // 处理异步结果...
        },
        function(Throwable $error) {
            // 处理异步错误...
        }
    );
    // $client->getLoop()->run(); // 需要运行循环
}

3. 断开连接

与服务器交互完成后,始终要断开连接以释放资源(特别是对于stdio传输)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 同步
$client->disconnect(); // 阻塞直到连接关闭或超时

// 异步
$client->disconnectAsync()->then(function() { echo "Disconnected async"; });
// $loop->run();

可用的客户端方法

Client类提供了与连接的MCP服务器交互的方法。大多数方法都有同步(阻塞)和异步(返回Promise)两种变体。

连接与生命周期

  • (同步)initialize(): self:连接到服务器并执行MCP握手操作。阻塞直到准备就绪或抛出异常。返回客户端实例。
  • (异步)initializeAsync(): PromiseInterface<Client>:异步启动连接和握手操作。返回一个Promise,在连接准备就绪时解析为客户端实例,失败时拒绝。
  • (同步)disconnect(): void:优雅地关闭连接。阻塞直到断开连接完成或超时。
  • (异步)disconnectAsync(): PromiseInterface<void>:异步启动优雅断开连接操作。返回一个Promise,在断开连接完成时解析。
  • getStatus(): ConnectionStatus:返回当前连接状态枚举(DisconnectedConnectingHandshakingReadyClosingClosedError)。
  • isReady(): bool:辅助方法,如果状态为Ready则返回true
  • getServerName():?string:返回服务器名称(成功初始化后可用)。
  • getServerVersion():?string:返回服务器版本(成功初始化后可用)。
  • getNegotiatedCapabilities():?Capabilities:返回与服务器协商的功能(成功初始化后可用)。
  • getNegotiatedProtocolVersion():?string:返回与服务器商定的协议版本(成功初始化后可用)。

MCP操作(同步)

(这些方法要求客户端先初始化,并且会阻塞)

  • ping(): void
  • listTools(bool $useCache = true): array<ToolDefinition>
  • listResources(bool $useCache = true): array<ResourceDefinition>
  • listPrompts(bool $useCache = true): array<PromptDefinition>
  • listResourceTemplates(bool $useCache = true): array<ResourceTemplateDefinition>
  • callTool(string toolName, array arguments = []): CallToolResult
  • readResource(string $uri): ReadResourceResult
  • getPrompt(string promptName, array arguments = []): GetPromptResult
  • subscribeResource(string $uri): void
  • unsubscribeResource(string $uri): void
  • setLogLevel(string $level): void

MCP操作(异步)

(这些方法要求客户端先初始化,并返回React\Promise\PromiseInterface

  • pingAsync(): PromiseInterface<void>
  • listToolsAsync(): PromiseInterface<array<ToolDefinition>>
  • listResourcesAsync(): PromiseInterface<array<ResourceDefinition>>
  • listPromptsAsync(): PromiseInterface<array<PromptDefinition>>
  • listResourceTemplatesAsync(): PromiseInterface<array<ResourceTemplateDefinition>>
  • callToolAsync(string toolName, array arguments = []): PromiseInterface<CallToolResult>
  • readResourceAsync(string $uri): PromiseInterface<ReadResourceResult>
  • getPromptAsync(string promptName, array arguments = []): PromiseInterface<GetPromptResult>
  • subscribeResourceAsync(string $uri): PromiseInterface<void>
  • unsubscribeResourceAsync(string $uri): PromiseInterface<void>
  • setLogLevelAsync(string $level): PromiseInterface<void>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从零开始构建一个电影知识图谱,实现KBQA智能问答下篇:Apache jena SPARQL endpoint及推理、KBQA问答Demo超详细教学
在上一篇我们学习了如何利用 D2RQ 来开启 endpoint 服务,但它有两个缺点:
汀丶人工智能
2023/07/11
5920
从零开始构建一个电影知识图谱,实现KBQA智能问答下篇:Apache jena SPARQL endpoint及推理、KBQA问答Demo超详细教学
电影知识图谱问答(三)|Apache Jena知识存储及SPARQL知识检索
上篇文章《电影知识图谱问答(二)|生成298万条RDF三元组数据》中讲到如何将爬取得到的豆瓣电影和书籍数据转换成知识图谱所需的RDF类型数据,本篇文章将介绍如何将得到的298万条RDF类型数据存储到知识图谱数据库之中,并介绍如何利用SPARQL进行知识检索。实践之前,请自主学习Apache Jena, Apache Fuseki, SPARQL相关知识。
小一
2019/08/14
5.6K0
电影知识图谱问答(三)|Apache Jena知识存储及SPARQL知识检索
从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学
首先介绍我们使用的数据、数据来源和数据获取方法;其次,基于数据内部关系,介绍如何以自顶向下的方式构建本体结构。
汀丶人工智能
2023/07/11
9190
从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学
知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个
JadePeng
2018/05/28
4.4K0
电影知识图谱问答(四)| 问句理解及答案推理
上篇文章《电影知识图谱问答(三)|Apache Jena知识存储及SPARQL知识检索》中讲到如何将处理后的RDF数据存储至Apache Jena数据库之中、如何利用SPARQL语句从Apache Jena之中进行知识检索和答案推理。本篇文章将主要介绍如何理解问句所表达的深层语义含义、如何将自然语言问句转换成SPARQL查询语句、如何进行答案推理。
小一
2019/08/14
3.6K0
电影知识图谱问答(四)| 问句理解及答案推理
电影知识图谱问答(二)|生成298万条RDF三元组数据
本篇文章接《电影知识图谱问答(一)|爬取豆瓣电影与书籍详细信息》,学习如何利用爬取的数据,构建知识图谱所需的三元组。主要内容包括如何从Json类型的数据,转换成RDF数据,并最终存储到Jena之中,然后利用SPARQL进行查询。
小一
2019/08/14
3.9K0
电影知识图谱问答(二)|生成298万条RDF三元组数据
【知识图谱】:科普——万维网、语义网、知识图谱、RDF、RDFS、OWL、SPARQL、RDB2RDF、D2RQ、Protege
通过RDF(S)可以表达一些简单的语义,但在更复杂的场景下,RDF(S)语义表达能力显得太弱,还缺少诸多常用的特征。包括对局部值域的属性定义,类、属性、个体的等价性,不相交类的定义,基数约束,关于属性特征的描述等。因此W3C提出了OWL语言扩展RDF(S),作为语义网上表示本体的推荐语言。
WEBJ2EE
2021/09/02
4.1K0
【知识图谱】:科普——万维网、语义网、知识图谱、RDF、RDFS、OWL、SPARQL、RDB2RDF、D2RQ、Protege
知识图谱推理与实践 (2) -- 基于jena实现规则推理
本章,介绍 基于jena的规则引擎实现推理,并通过两个例子介绍如何coding实现。
JadePeng
2020/02/18
3.8K0
知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
《海贼王》(英文名ONE PIECE) 是由日本漫画家尾田荣一郎创作的热血少年漫画,因为其宏大的世界观、丰富的人物设定、精彩的故事情节、草蛇灰线的伏笔,受到世界各地的读者欢迎,截止2019年11月7日,全球销量突破4亿6000万本^1,并被吉尼斯世界纪录官方认证为“世界上发行量最高的单一作者创作的系列漫画”^2。
汀丶人工智能
2023/07/07
9760
知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
知识推理
 描述逻辑的公理可以用来定义术语,所以称为Terminological Box,简称Tbox
用户7886150
2020/12/13
1.5K0
【D2RQ】:D2RQ Mapping Language
知识抽取是指从不同来源、不同结构的数据中进行知识提取,提取出数据内涵的事实性信息并供给知识图谱做进一步加工处理后会形成知识,存入到知识图谱。
WEBJ2EE
2021/09/02
1.6K0
【D2RQ】:D2RQ Mapping Language
CentOS 6搭建SkyWalking 做分布式跟踪
当企业应用进入分布式微服务时代,应用服务依赖会越来越多,skywalking可以很好的解决服务调用链路追踪的问题,而且基于Java探针技术,基本对应用零侵入零耦合。
星哥玩云
2022/07/27
7110
CentOS 6搭建SkyWalking 做分布式跟踪
Tomcat企业级应用
简介 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服
用户1173509
2018/03/28
2.2K0
Tomcat企业级应用
17 个实用 shell 脚本,建议收藏!
1、服务器系统配置初始化 #/bin/bash # 安装系统性能分析工具及其他 yum install gcc make autoconf vim sysstat net-tools iostat iftop iotp wget lrzsz lsof unzip openssh-clients net-tool vim ntpdate -y # 设置时区并同步时间 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime if ! crontab -l
用户6792968
2022/08/30
5350
超详细:自动化运维之jumpserver堡垒机入门到掌握
1.3 建立 Python 虚拟环境 因为 CentOS 7 自带的是 Python2, 而 Yum 等工具依赖原来的 Python, 为了不扰乱原来的环境我们来使用 Python 虚拟环境
迅达集团
2019/03/18
3.9K0
CAS 单点登录/登出 系统「建议收藏」
在我们的实际开发中,更多的是采用分布式系统。那么问题来了,对于分布式系统的登录问题,我们如何解决呢?
全栈程序员站长
2022/08/24
2.5K0
CAS 单点登录/登出 系统「建议收藏」
MySQL Fabric实验(二)Sharding
一、概述         MySQL Fabric这一新的架构为MySQL提供了高可用和向外扩展的特性。本实验专注于使用Fabric对多个MySQL服务器进行读写实现向外扩展。当单个MySQL服务器(或HA组)的写性能达到极限时,可以使用Fabric把数据分布到多个MySQL服务器组。注意这里说的组可以是单一服务器,也可以是HA组。管理员通过建立一个分片映射定义数据如何在多个服务中分片。一个分片映射作用于一个或多个表,由管理员指定每个表上的哪些列作为分片键,MySQL Fabric使用分片键计算一个表的特定行应该存在于哪个分片上。当多个表使用相同的映射和分片键时,这些表上包含相同列值(用于分片的列)的数据行将存在于同一个分片。单一事务可以访问一个分片中的所有数据。目前Fabric提供两种用分片键计算分片号的方法:         HASH:在分片键上执行一个哈希函数生成分片号。如果作为分片键的列只有很少的重复值,那么哈希函数的结果会平均分布在多个分片上。         RANGE:管理员显式定义分片键的取值范围和分片之间的映射关系。这可以尽可能让用户控制数据分片,并确定哪一行被分配到哪一个分片。         应用程序访问分片的数据库时,它设置一个连接属性指定分片键。Fabric连接器会应用正确的范围或哈希映射,并将事务路由到正确的分片。当需要更多的分片时,MySQL Fabric可以把现有的一个分片分成两个,同时修改状态存储和连接器中缓存的路由数据。类似地,一个分片可以从一个HA组迁移到另一个。         注意单一的事务或查询只能访问一个单一的分片,所以基于对数据的理解和应用的访问模式选择一个分片键是非常重要的。并不是对所有表分片都有意义。对于当前不能交叉分片查询的限制,将某些小表的全部数据存储到每一个组中可能会更好。这些全局表被写入到‘全局组’,表中数据的任何改变都会自动复制到所有其它非全局组中。全局组中模式(结构)的改变也会复制到其它非全局组中以保证一致性。为了得到做好的映射,在没有‘自然选择’的分片键时可能需要修改模式。 二、安装与配置
用户1148526
2022/05/07
9230
MySQL Fabric实验(二)Sharding
大数据Flink进阶(九):集群基础环境搭建
Flink可以运行在所有类unix环境中,例如:Linux,Mac OS 和Windows,一般企业中使用Flink基于的都是Linux环境,后期我们进行Flink搭建和其他框架整合也是基于linux环境,使用的是Centos7.6版本,JDK使用JDK8版本(Hive版本不支持JDK11,所以这里选择JDK8),本小节主要针对Flink集群使用到的基础环境进行配置,不再从零搭建Centos系统,另外对后续整合使用到的技术框架也一并进行搭建,如果你目前已经有对应的基础环境,可以忽略本小节,Linux及各个搭建组件使用版本如下表所示。
Lansonli
2023/03/30
1.3K0
大数据Flink进阶(九):集群基础环境搭建
Dubbo学习
全部功能集中在一个工程中,对大型项目不易开发,拓展和维护 技术栈受限,只可以使用一种语言开发 系统性能拓展只能通过拓展集群结点,成本高
一只胡说八道的猴子
2021/02/25
4050
Dubbo学习
数据库简介与 Mysql 服务基础「建议收藏」
  数据库管理系统(DatabaseManagementSystem,DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。
全栈程序员站长
2022/09/18
8030
数据库简介与 Mysql 服务基础「建议收藏」
推荐阅读
相关推荐
从零开始构建一个电影知识图谱,实现KBQA智能问答下篇:Apache jena SPARQL endpoint及推理、KBQA问答Demo超详细教学
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验