如何慢慢变富
- 学会省钱,制定支出规划,别做月光族。
- 用省出的钱提升自己,从而创造更高收入。
- 使用余钱做长期投资从而钱生钱,以达到被动收入 ··· ··· 慢慢变富
PHP Foundation、Anthropic MCP 团队和 Symfony 正在合作开发 PHP 官方 MCP SDK。该项目的目标是为 PHP 生态提供一个跨框架、可用于生产环境的标准实现。
Symfony 团队将负责主要维护工作,社区也会参与贡献,包括 Kyrian Obikwelu PHP-MCP 项目作者。
这次合作将之前的各种实现整合成一个统一、可信的官方版本——
modelcontextprotocol/php-sdk,先从服务端开始,后续扩展到客户端功能。
composer require mcp/sdkModel Context Protocol (MCP) 是 Anthropic 推出的开放协议,让 AI 应用能够连接和使用外部工具及数据源,就像为 AI 系统提供标准化的"USB-C 接口"。
为了简化 MCP 服务器开发,社区提供了各种 SDK——这些轻量级框架处理协议细节,让开发者专注于应用逻辑。
已经有多种编程语言的官方 SDK,但一直没有 PHP 官方 SDK,虽然社区有一些实现。
这就是 PHP Foundation 出面协调开发和维护 PHP 官方 MCP SDK 的原因。
这带来两个重要好处:
PHP Foundation 已经与 Anthropic MCP 团队和 Symfony 团队建立合作,开发 PHP 官方 MCP SDK。
Symfony 团队将担任 SDK 的主要维护者,他们在构建高质量、跨框架组件方面有丰富经验,PHP 生态的很多项目都依赖他们的组件。
另外,Kyrian Obikwelu 加入了维护团队,带来他在 MCP 库方面的经验。其他 PHP MCP SDK 作者也欢迎参与。
路线图(概要):
该实现将保持跨框架特性,确保它在任何平台、老项目和自定义技术栈中都能正常工作。社区适配器和示例会与核心包一起提供。
试用:安装 SDK,搭建一个小型 MCP 服务器,开放一两个安全的工具。
贡献:欢迎提交 issue、文档和 PR——特别是测试和实际应用示例。
框架集成:团队希望为 Laravel、WordPress、Drupal、Laminas 等提供一流集成。仓库中也会维护集成列表。
从这里开始:
除了官方 MCP SDK,社区还有一些不错的 AI 相关扩展值得关注:
这些扩展为 PHP 开发者提供了不同的 AI 集成方案,可以根据项目需求选择合适的工具。
签发自有证书:
openssl req -newkey rsa:2048 -nodes -keyout domain.key -subj "/CN=domain.com" -addext "subjectAltName=DNS:domain.com" -x509 -days 365 -out domain.crt
签发自有受信任证书:
# 生成自由根证书
openssl genrsa -out rootCA.key 4096
openssl req -new -x509 -days 3650 -key rootCA.key -out rootCA.crt -subj "/C=CN/O=My Organization/CN=My Self-Signed Root CA"
把rootCA.crt下载下来,导入到电脑受信任的根证书中颁发机构中
然后就可以使用此根证书签发受信任的SSL证书了
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr -subj "/CN=domain.com"
openssl x509 -req -days 365 -in domain.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out domain.crt -extfile <(echo -e "subjectAltName=DNS:domain.com")
在线签发SSL证书
https://www.zhisg.com/dev/ssl.php
curl命令直接获取证书 (参数domain修改实际域名)
# 获取 private.key
curl -o private.key "https://www.zhisg.com/dev/ssl.php?domain=domain.com&act=key"
# 获取 cert.pem
curl -o cert.pem "https://www.zhisg.com/dev/ssl.php?domain=domain.com&act=cert"
优化获取地址方式,以及设置地址相同时不触发解析请求,避免频繁多余请求接口。
:local id "key"
:local secret "secret"
:local domain "your.domain.com"
:global GIPV4
:global GIPV6
# 定义拨号接口名称
:local interfaceName "pppoe-out1"
# 获取接口的IP地址
:local ipAddress [/ip address get [/ip address find interface=$interfaceName] address]
# 检查是否获取到IP地址
:if ($ipAddress != "") do={
:set ipAddress [:pick $ipAddress 0 ([len $ipAddress] -3)]
:if ($ipAddress != $GIPV4) do={
:global GIPV4 $ipAddress
:log info ("IP Address of $interfaceName: " . $ipAddress)
:local result [/tool fetch url="https://www.zhisg.com/route.php/ddns/ali/set\?id=$id&secret=$secret&domain=$domain&ip=$ipAddress" as-value output=user];
:log info $result;
}
} else={
:log error ("Failed to get IP address for $interfaceName")
}
# 定义IPV6地址接口名称
:local ipv6Interface "bridge1"
# 定义IPV6前缀地址池
:local ipv6Pool "TELEv6"
:local ipv6Addr [/ipv6 address get [/ipv6 address find interface=$ipv6Interface from-pool=$ipv6Pool] address ]
:local ipv6Prefix [ /ipv6 pool get [/ipv6 pool find name=$ipv6Pool] prefix ]
# 检查是否获取到IP地址
:if ($ipv6Addr != "") do={
:set ipv6Addr [:pick $ipv6Addr 0 ([len $ipv6Addr] -3)]
:if ($ipv6Addr != $GIPV6) do={
:global GIPV6 $ipv6Addr
:log info ("IPv6 Address of $ipv6Interface: " . $ipv6Addr)
:log info ("IPv6 Prefix of $ipv6Pool: " . $ipv6Prefix)
:local result [/tool fetch url="https://www.zhisg.com/route.php/ddns/ali/set\?id=$id&secret=$secret&domain=$domain&ip=$ipv6Addr&type=AAAA" as-value output=user];
:log info $result;
}
} else={
:log error ("Failed to get IPv6 address for $ipv6Interface")
}
:log info "DDNS FINISHED"
原来的OpenSSL默认版本是1.0.2k
升级到最新版的OpenSSL步骤如下
下载官网最新的软件 https://openssl-library.org/source/
wget https://github.com/openssl/openssl/releases/download/openssl-3.5.0/openssl-3.5.0.tar.gz
解压OpenSSL,并切换至包目录
tar zxvf openssl-3.5.0.tar.gz
cd openssl-3.5.0
安装编译所需依赖
yum install perl-IPC-Cmd perl-Data-Dumper gcc gcc-c++ perl perl-devel
预编译命令
./Configure --prefix=/usr/local/openssl/
编译和编译安装命令
make && make install
备份旧的OpenSSL,链接新OpenSSL的库文件
mv /usr/bin/openssl{,.bak}
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
检查OpenSSL,看看依赖是否正常
ldd /usr/bin/openssl
若有缺失项,libssl.so.3 => not found libcrypto.so.3=> not found
则/etc/ld.so.conf.d/openssl.conf 添加配置
echo "/usr/local/openssl/lib64/" > /etc/ld.so.conf.d/openssl.conf
激活路径
ldconfig -v
再次检查可以看到前面缺失的库已经装载到内存了,OpenSSL可以使用了
检查OpenSSL的版本,确认升级成功
openssl version
安装命令:
curl https://get.acme.sh | sh -s email=my@example.com
安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中: ~/.acme.sh/
注意:如果安装完成后提示 -bash: acme.sh: command not found,需要手动执行 source ~/.bashrc
升级 acme.sh 到最新版:
acme.sh --upgrade
如果你不想手动升级,可以开启自动升级:
acme.sh --upgrade --auto-upgrade
修改默认 CA
acme.sh 脚本默认 CA 服务器是 ZeroSSL,把 CA 服务器改成 Let's Encrypt:
acme.sh --set-default-ca --server letsencrypt
手动验证DNS
acme.sh --issue --dns -d example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
自动验证(DNS API)以Aliyun为例
export Ali_Key="--key--"
export Ali_Secret="--sercert--"
签发通配符证书:
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
更详细的 DNS API 用法: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
继签证书:
acme.sh --renew -d example.com
安装复制证书
Apache 示例:
acme.sh --install-cert -d example.com --cert-file /path/to/certfile/in/apache/cert.pem --key-file /path/to/keyfile/in/apache/key.pem --fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem --reloadcmd "systemctl reload httpd"
Nginx 示例:
acme.sh --install-cert -d example.com --key-file /path/to/keyfile/in/nginx/key.pem --fullchain-file /path/to/fullchain/nginx/cert.pem --reloadcmd "systemctl reload nginx"
注意:reloadcmd 非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd 命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。
查看已安装证书信息
acme.sh --info -d example.com
查看所有安装的证书
acme.sh --list
删除一条安装的证书
acme.sh --remove -d example.com
ECDSA (Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)
相比RSA算法密钥更短安全性更高,验签速度也更快,使用场景也得到广泛应用。
因为ECDSA算法只能做签名,不能做加解密,所以产生了ECIES(Elliptic Curve Integrated Encryption Scheme,椭圆曲线集成加密方案)。
ECIES 其中用到的 ECDH算法生成共享密钥,因平台兼容问题一些旧系统还无法支持。
所以依照ECIES的加密思路设计了自己的RSAIES加密方法:
cipher 向量 iv 编码方式 code 密文哈希值 mac 加密类型 RSAIES 放入 encryption 字段cipher 编码还原 base64_decode 后,使用 RSA 解密方法对其解密得到AES密钥原文iv 采用 aes-128-cfb 进行解密, 参数 OPENSSL_RAW_DATA示例代码: https://github.com/unntech/encrypt/blob/main/src/RSA.php
/**
* RASIES加密
* 生成随机AES密钥,使用 RSA 加密方法对其加密
* 使用AES-128-CFB加密文本,参数选 OPENSSL_RAW_DATA
* @param string $plaintext 明文数据
* @param string $code 密文编码支持 base64 | hex | bin
* @return false | array
* [ 'cipher' => '加密的AES密钥',
* 'iv' => 'iv',
* 'code' => 'base64',
* 'ciphertext' => '密文',
* 'mac' => '密文SHA256哈希'
* ]
*
*/
public function encrypt_ies(string $plaintext, string $code = 'base64', int $padding = OPENSSL_PKCS1_PADDING )
{
$publicKey = $this->third_public_key;
// 生成随机对称密钥
$cipher_method = 'aes-128-cfb';
$symmetricKey = openssl_random_pseudo_bytes(16); // 使用 AES-128 密钥长度
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($cipher_method));
// 使用公钥加密对称密钥(使用 RASIES 过程)
openssl_public_encrypt( $symmetricKey, $encryptedKey, $publicKey, $padding );
// 使用对称密钥加密消息(AES-128-CFB)
$encryptedMessage = openssl_encrypt($plaintext, $cipher_method, $symmetricKey, OPENSSL_RAW_DATA, $iv);
$ciphertext = Encode::encode($encryptedMessage, $code );
//使用SHA256计算密文哈希值
$mac = strtoupper(hash("sha256", $ciphertext));
// AES密钥cipher、向量iv、密文及哈希值
return [
'cipher_method' => $cipher_method,
'cipher' => Encode::encode($encryptedKey, $code),
'iv' => Encode::encode($iv, $code),
'code' => $code,
'ciphertext' => $ciphertext,
'mac' => $mac,
];
}
/**
* RASIES 解密
* 使用RSA解密方法对 $cipher 解密,得到AES密钥
* 使用AES-128-CFB解密密文,参数选 OPENSSL_RAW_DATA,得到明文
* @param string $ciphertext 密文
* @param string $cipher 加密的AES密钥
* @param string $iv AES加密向量
* @param string|null $mac 密文哈希值
* @param string $code 编码
* @param int $padding 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)
* @return string|null
*/
public function decrypt_ies(string $ciphertext, string $cipher = '', string $iv = '', ?string $mac = null, string $code = 'base64', int $padding = OPENSSL_PKCS1_PADDING): ?string
{
// 解密对称密钥
openssl_private_decrypt(Encode::decode($cipher, $code), $symmetricKey, $this->private_key, $padding);
if(empty($symmetricKey)){
return null;
}
// 2. 验证 MAC
if(!is_null($mac)){
$_mac = strtoupper(hash("sha256", $ciphertext));
if($mac != $_mac){
return null;
}
}
// 3. 解密密文
$plaintext = openssl_decrypt(Encode::decode($ciphertext, $code), 'aes-128-cfb', $symmetricKey, OPENSSL_RAW_DATA, Encode::decode($iv, $code));
return $plaintext;
}RSAIES ( Integrated Encryption Scheme)RSA集成加密方案,采取了RSA使用广泛及跨平台兼容性高的优点,方案中只用RSA加解密随机AES密钥。
然后用AES进行对称加密数据,相比RSA加密快,又不用处理长文本RSA加密复杂的缺点。
Libsodium 是一个现代化、易用且高度安全的密码学库,旨在简化加密操作并避免常见的安全错误。它是 NaCl(Networking and Cryptography Library)的一个分支,由 Frank Denis 和社区维护。
安全设计哲学
现代密码学算法
跨平台支持
提供 C 库及多种语言绑定(如 PHP、Python、Java)。
活跃维护与审计
代码经过多次独立安全审计,社区活跃,及时修复漏洞。
PHP 7.2+ 已内置 Sodium 扩展(无需额外安装),通过函数前缀 sodium_* 调用。
官方文档: https://www.php.net/manual/zh/book.sodium.php
Libsodium 是开发者的“密码学瑞士军刀”,强烈推荐在安全敏感项目中替代 OpenSSL 等传统库。其设计目标正是让安全变得简单,让开发者专注于业务逻辑而非密码学细节。
修改配置文件:vendor/mpdf/mpdf/src/Config/ConfigVariables.php
'useAdobeCJK' => true,
'autoScriptToLang' => true,
'autoLangToFont' => true,
'useSubstitutions' => true,