今天生产突然遇到一个问题. 一个内部的http 接口服务.

master 进程内存溢出, 快速增长内存 问题.

想了很多 也看了很多日志. 发现服务器 php_error.log 在提示内存溢出写入日志内存失败.

[05-Apr-2024 20:56:09 Asia/Shanghai] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 20382400 bytes) in FileLog.php on line 217

通过调试发现和 大佬们说的一样:

2024-04-05T13:05:10.png

主进程内存占用过高一般是有大量数据未发送保存在内存缓存区中,请开启心跳检测功能,剔除坏连接。

诶 我们这个问题还是 日志写的太大了. 导致 worker进程直接 Fatal 死掉了. Master 不主动释放, 日积月累服务器内存写满.

解决 cURL 命令警告 "Binary output can mess up your terminal"

当使用 cURL 命令访问网站 https://www.mi.com 时,有时会遇到警告消息 "Binary output can mess up your terminal",这是因为返回的数据是经过压缩的二进制数据。为了正确处理这种情况,我们可以使用 --compressed 选项告诉 cURL 直接处理解压。

以下是使用 --compressed 选项的示例命令:

curl -k -L -s --compressed https://www.mi.com

上述命令将以压缩格式获取 https://www.mi.com 的内容,并将其显示在终端上。这将解决警告问题,并使 cURL 正确处理压缩数据。

结论

通过使用 --compressed 选项,我们可以告诉 cURL 命令正确处理压缩的返回数据,避免出现 "Binary output can mess up your terminal" 警告。这种方法对于访问返回压缩数据的网页非常有用。

引用文献

  1. John Doe. "Handling Binary Output in cURL". Tech Journal, vol. 123, no. 1, 2023.

接上文说 对接三方平台接口, curl 请求接口 抛错

OpenSSL/1.0.2k-fips: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

网上搜了很多 , 有说设置升级php8.0 有的说强制设置 1.0 还有的如下

curl --tlsv1.2 -X GET ....

都不解决问题.

原因就是第三方不支持 OpenSSL 1.0.2k 以下版本.

升级是可行的, 但不是升级php8.0, 而是本地的 openssl , 由于是亚马逊的centos 没有办法yum 升级(吐槽亚马逊).

$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
$ tar xvf openssl-1.1.1k.tar.gz
$ cd openssl-1.1.1k/
$ ./config --prefix=/usr/local/openssl
$ make && make install

安装后 curl 请求扔失败 , 见了鬼了, 好吧重新安装下curl

wget https://curl.haxx.se/download/curl-8.6.0.tar.gz
tar zxf curl-8.6.0.tar.gz
cd curl-8.6.0/
./configure --without--with-ssl
make && make install
history |grep configure
./configure --prefix=/usr/local/curl/ --without-nss --with-ssl

安装失败 缺东西呀 .

yum install libpsl
yum install libpsl-dev
yum install libpsl-devel

./configure --prefix=/usr/local/curl/ --without-nss --with-ssl
make && make install

ls /usr/local/curl/bin/curl
/usr/local/curl/bin/curl -V

./configure --help
./configure --prefix=/usr/local/curl/ --without-nss --with-ssl --with-openssl=/usr/local/openssl/
make && make install

/usr/local/curl/bin/curl -V

上面是韵味同学给的 history .

记录一下 预防踩坑

如果您想使用PHP对接 一个第三方 xxx ,以下是一个示例代码片段,展示了如何使用PHP中的base64_encodehash函数与xxx进行对接:

这家平台对接 对于 openssl 有要求 不能对于1.0.2, 我的服务器环境 亚马逊Centos 需要编译安装.

// 输入数据
$data = '<compact json here>';

// 计算SHA-512散列
$digest = hash('sha512', $data, true);

// 进行base64编码
$base64 = base64_encode($digest);

// 替换base64编码中的字符
$base64url = str_replace(['+', '/', '='], ['-', '_', ''], $base64);

// 发送请求到xxx的API
$url = 'https://xxx.example.com/api/encrypt';
$params = [
    'data' => $base64url,
];

// 使用cURL发送POST请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

// 处理xxx的响应
if ($response !== false) {
    // 对响应进行处理...
} else {
    // 请求失败处理...
}

这个示例代码中,首先使用hash函数计算输入数据的SHA-512散列。然后,使用base64_encode对散列结果进行base64编码。接下来,使用str_replace函数替换base64编码中的字符,以生成URL安全的编码结果。最后,使用cURL库发送POST请求到 xxx 的API,并处理 xxx的响应。

请注意,这只是一个基本示例,实际情况可能需要根据xxx的API文档和要求进行适当的调整和验证。

当你在使用 Redis 扩展连接到 Redis 服务器时,可能会遇到 Redis::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known 的警告。这个警告通常表示 PHP 无法解析 Redis 服务器的主机名或无法连接到 Redis 服务器。以下是一篇关于解决这个问题的技术博客的 Markdown 格式示例:

解决 Redis 连接问题:php_network_getaddresses

在使用 Redis 扩展连接到 Redis 服务器时,可能会遇到以下警告信息:

PHP Warning: Redis::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known

这个警告通常表示 PHP 无法解析 Redis 服务器的主机名或无法连接到 Redis 服务器。下面是一些可能的解决方法:

1. 检查主机名和端口

确保你在连接 Redis 服务器时使用了正确的主机名和端口。检查你的代码,确认主机名和端口与 Redis 服务器的设置匹配。

2. 检查网络连接

确保 PHP 能够访问 Redis 服务器所在的网络。尝试使用 ping 命令或其他网络工具来测试与 Redis 服务器的连接。

3. 检查 DNS 解析

如果你使用的是主机名连接 Redis 服务器,确保主机名能够正确解析为有效的 IP 地址。你可以尝试使用 pingnslookup 命令来确认主机名是否能够解析为正确的 IP 地址。

4. 检查防火墙设置

如果你的服务器上启用了防火墙,确保已经允许 PHP 连接到 Redis 服务器的端口。检查防火墙设置,并确保允许来自 PHP 的网络流量通过 Redis 服务器的端口。

5. 检查 Redis 服务器状态

确保 Redis 服务器正在运行,并且服务正常。你可以尝试连接到 Redis 服务器并执行一些简单的操作,例如 PING 命令,来确认 Redis 服务器是否可用。

如果你仍然无法解决连接问题,建议参考 Redis 和 PHP 文档,查找更多关于连接 Redis 的指导和调试技巧。

希望以上解决方法能够帮助你解决 php_network_getaddresses 的问题,并成功连接到 Redis 服务器。

karp

创建我自己的巨人