今天生产突然遇到一个问题. 一个内部的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 不主动释放, 日积月累服务器内存写满.

RedisLua,两个看似风流马不相及的技术框架,为什么能产生“爱”的火花,成为工作中的黄金搭档?面试中更是高频出现:Redis 执行 Lua,到底能不能保证原子性?

一、原子性

在回答问题之前,需要对“原子性”这个概念有一个清新的认识,因此,我们首先要分析的是原子性的概念。

关系型数据库的原子性

通常意义上,我们说的原子性是指关系型数据库RDBMS(比如 MySQL)的原子性,也就是 ACID(Atomicity、Consistency、Isolation、Durability)中 Atomicity这一项特性。

ACID 中的原子性指是:事务中的所有操作要么全部执行成功,要么全部失败回滚。

这里以银行转账这个生活实例来解释原子性:账户A 给 账户B 转账100元,原子性就是指账户A减去100元的同时,账户B必须增加100元,如果账户A减少100元,账户B没有增加100元,该操作就不具备原子性,需要进行回滚,将账户A减少的100元加回去。JAVA 代码实现如下:

photo_2024-03-29 18.44.29.jpeg

继续阅读

PHP 实现JWT认证

in php

使用PHP实现JWT认证

JSON Web Token(JWT)是一种用于在网络应用间传递身份认证信息的开放标准。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。在本篇博客中,我们将介绍如何在PHP应用程序中使用JWT进行身份认证。

1. 安装依赖库

首先,我们需要使用Composer来管理我们的依赖库。在项目根目录下创建一个composer.json文件,并添加以下内容:

{
  "require": {
    "firebase/php-jwt": "^5.4"
  }
}

然后在命令行终端中运行以下命令安装依赖库:

composer install

2. 生成JWT

在PHP应用程序中生成JWT需要使用firebase/php-jwt库。以下是一个生成JWT的示例:

<?php
require 'vendor/autoload.php';

use Firebase\JWT\JWT;

$key = 'your_secret_key';
$payload = array(
    "user_id" => 1,
    "username" => "john.doe"
);

$jwt = JWT::encode($payload, $key, 'HS256');

echo "Generated JWT: " . $jwt;
?>

在上述示例中,我们使用JWT::encode()方法生成JWT。需要提供载荷(即数据)和一个秘钥来签名JWT。生成的JWT将在终端输出。

3. 验证JWT

在PHP应用程序中验证JWT需要使用相同的firebase/php-jwt库。以下是一个验证JWT的示例:

<?php
require 'vendor/autoload.php';

use Firebase\JWT\JWT;

$key = 'your_secret_key';
$jwt = 'your_generated_jwt';

try {
    $decoded = JWT::decode($jwt, $key, array('HS256'));
    $user_id = $decoded->user_id;
    $username = $decoded->username;

    echo "User ID: " . $user_id . "\n";
    echo "Username: " . $username . "\n";
} catch (Exception $e) {
    echo 'Invalid JWT: ' . $e->getMessage();
}
?>

在上述示例中,我们使用JWT::decode()方法验证JWT的有效性并解码其中的数据。如果JWT有效,则输出包含用户ID和用户名的信息。否则,将输出无效JWT的错误消息。

参考文献

结论

在本篇博客中,我们介绍了如何在PHP应用程序中使用JWT进行身份认证。通过使用firebase/php-jwt库,我们可以方便地生成和验证JWT。JWT提供了一种安全可靠的方式来传递身份认证信息,并在网络应用程序之间实现无状态认证。

请记住,在实际应用中,确保妥善保管JWT的秘钥,并采取其他安全措施(如HTTPS)来保护JWT的传输和使用。

如果您想使用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

创建我自己的巨人