为什么basename丢失中文?

# 输入:
var_dump(basename("xf/中文qq.zip"));
# 输出:
string(12) "qq.zip"
# 期待的输出为:
string(12) "中文qq.zip"
可以发现中文部分丢失,使用下面的方法解决,或者手动拆分字符串
解决办法:
setlocale(LC_ALL, 'zh_CN.UTF-8');
var_dump(basename("xf/中文qq.zip"));

php swoole 队列、异步、协程并发curl请求

 public function curls()
    {
        cli_set_process_title(__FILE__ . ':curls');
        $file_mtime = $this->file_mtime();
        $st = time();

        error_reporting(E_ALL);
        ini_set('swoole.display_errors', 'On');

        \Swoole\Coroutine::set(['hook_flags' => SWOOLE_HOOK_ALL]);
        \Swoole\Coroutine\run(function () use ($st, $file_mtime) {
            for ($i = 0; $i < 5; $i++) {
                \Swoole\Coroutine::create(function () use ($i, $st, $file_mtime) {
                    $redis = new Redis();
                    $redis->connect('10.29.185.7', 6383);
                    while (true) {
                        $task = $redis->blPop('curl_queue', 5);
                        if (!empty($task)) {
                            [$key, $val] = $task;
                            $json = json_decode($val, true);
                            if ($json) {
                                $method = $json['method'];
                                $uri = $json['uri'];
                                $headers = $json['headers'] ?? [];
                                $body = $json['body'] ?? null;

                                $ch = curl_init();
                                if ($method === 'POST') {
                                    curl_setopt($ch, CURLOPT_POST, true);
                                    curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
                                }
                                if (count($headers)) {
                                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                                }
                                curl_setopt($ch, CURLOPT_URL, $uri);
                                curl_setopt($ch, CURLOPT_HEADER, false);
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                $result = curl_exec($ch);
                                curl_close($ch);
                            }
                        }
                        if ($file_mtime != $this->file_mtime()) break;
                        if (time() - $st > 3600) break;
                    }
                });
            }
        });
    }

微信PHP解密

openssl 实现:

        $result = openssl_decrypt(base64_decode($data),
            "AES-128-CBC",
            base64_decode($key),
            OPENSSL_RAW_DATA,
            base64_decode($iv));
        var_dump($result);

mcrypt 实现


        $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        //用密钥key、初始化向量初始化
        mcrypt_generic_init($module, base64_decode($key), base64_decode($iv));
        //**执行解密**(得到带有PKCS#7填充的半原文,所以要去除填充)
        $result = mdecrypt_generic($module, base64_decode($data));
        //清理工作与关闭解密
        mcrypt_generic_deinit($module);
        mcrypt_module_close($module);
        //去除填充
        $lastByte = substr($result, -1);
        $result = substr($result, 0, strlen($result) - ord($lastByte));
        var_dump($result);

PHP单机文件排队锁


class Locker
{

    private static array $lockers = [];

    /**
     * 获取锁
     * @param string $key 锁的唯一标识
     * @param int $timeout 超时时间(秒),0表示无限等待
     * @return bool 是否获取到锁
     */
    public static function wait(string $key, int $timeout = 0): bool
    {
        $file = sys_get_temp_dir() . "/.lock_" . md5($key) . ".tmp";
        $start_time = time();

        while (true) {
            // 检查是否超时
            if ($timeout > 0 && (time() - $start_time) >= $timeout) {
                return false;
            }

            // 尝试打开文件
            $fp = @fopen($file, "c+");
            if (!$fp) {
                usleep(10000); // 等待10毫秒
                continue;
            }

            // 尝试获取锁
            if (flock($fp, LOCK_EX | LOCK_NB)) {
                // 获取锁成功
                self::$lockers[$key] = $fp;
                return true;
            } else {
                // 获取锁失败,关闭文件句柄
                fclose($fp);
                usleep(10000); // 等待10毫秒后重试
            }
        }
    }

    /**
     * 释放锁
     * @param string $key 锁的唯一标识
     * @return bool 是否成功释放
     */
    public static function release(string $key): bool
    {
        if (!isset(self::$lockers[$key])) {
            return false;
        }

        $fp = self::$lockers[$key];
        if (is_resource($fp)) {
            flock($fp, LOCK_UN); // 释放文件锁
            fclose($fp);         // 关闭文件句柄
        }

        unset(self::$lockers[$key]);
        return true;
    }

    /**
     * 检查是否持有某个锁
     * @param string $key 锁的唯一标识
     * @return bool 是否持有锁
     */
    public static function isLocked(string $key): bool
    {
        return isset(self::$lockers[$key]) && is_resource(self::$lockers[$key]);
    }

    /**
     * 析构时释放所有锁
     */
    public function __destruct()
    {
        foreach (array_keys(self::$lockers) as $key) {
            self::release($key);
        }
    }
}

使用:
        if (!Locker::wait(md5("key"), 3)) {
            recordlog("3秒内获取不到锁返回提示 请勿重复请求  ");
            # 3秒内获取不到锁返回提示
            exit_json(0, '请勿重复请求');
        }

MySQL 里 varchar(64) 采用utf-8编码,能存多少个汉字?或多少个字母?

MySQL 中 varchar(64) 采用 UTF-8 编码时的存储能力可通过以下维度分析:


一、存储汉字

  1. 字符数量
    varchar(64) 可直接存储 64 个汉字,因为定义长度单位为字符而非字节。
    例如:varchar(64) 字段可完整存入 “数据库设计规范与最佳实践”(假设总长度不超过 64 个汉字)。
  2. 字节占用
    每个 UTF-8 汉字占 3 字节,64 个汉字共占 64 × 3 = 192 字节
    (注:实际存储时会额外消耗 1-2 字节记录字段长度,但因 64 < 255,仅需 1 字节长度前缀)

二、存储字母/数字

  1. 字符数量
    可存储 64 个字母或数字,同样以字符为单位计算。
    例如:varchar(64) 可存入 “ABCDabcd1234…” 共 64 个字符。
  2. 字节占用
    每个英文字符占 1 字节,总字节数为 64 × 1 = 64 字节

三、关键限制

  1. 总行长度限制
    MySQL 单行所有字段的字节总和不得超过 65535 字节(含长度前缀和字段元数据)。
  • 示例:若 varchar(64) 存储 64 个汉字,总字节数为 192 + 1 = 193 字节,远低于行限制。
  1. 编码版本差异
  • MySQL 5.0 以上varchar(n) 以字符为单位,兼容 UTF-8 汉字和字母混合存储。
  • MySQL 4.0 以下varchar(n) 以字节为单位(需避免使用旧版本)。

四、实际场景建议

  1. 混合存储
    若字段包含汉字和字母混合内容,总字符数不超过 64 即可,MySQL 会自动处理字节转换。
    例如:”用户ID_12345″(10 字符)占用 10 × 3 = 30 字节(汉字部分) + ASCII 字符的 1 字节/字符。
  2. 字符集升级
    推荐使用 utf8mb4 替代 utf8,以支持更多 Unicode 字符(如 emoji),但需注意存储空间需求增加。

总结

  • 汉字容量:64 个
  • 字母/数字容量:64 个
  • 实际存储:无需人工截断,MySQL 按字符计数自动管理。
  • 风险提示:需确保总行长度不超过 65535 字节,避免设计多超长字段的表。

引用链接:
1.MySQL:一场由Char/Varchar 引起的战争!! – 知乎
2.mysql数据库:varchar类型可以存储多少个汉字,多少个数字 – 腾讯云
3.MySQL utf8编码的varchar最多能存多少个字符 – CSDN博客
4.mysql utf-8 中文 – CSDN博客
5.mysql的varcher类型长度 – 根号三
6.MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚 · Ruby China – ruby-china.org
7.数据库中varchar类型 最大长度是多少?[通俗易懂] – 腾讯云
8.mysql 64字节能存多少个汉字 – 51CTO博客
9.MySQL中varchar能存多少汉字、数字 – 阿里云开发者社区
10.mysql varchar可以存几个汉字 – CSDN博客
11.mysql varchar到底能存多少汉字? – CSDN博客
12.MySQL数据类型 – 程序员肥仔
13.mysql varchar 100 可以存多少汉字 utf8编码 – 51CTO博客
14.软件编程基础知识:mysql不同字段类型分别可以存储多少内容? – 学科学玩数码
15.MYSQL_第11章_MySQL数据类型详解 – YOLO
16.mysql一个汉字几个字符 mysql里汉字占几位 – 51CTO博客
17.mysql的varchar到底能存多少个字符 – 腾讯云
18.mysql数据类型char与varchar的区别 – 博客园
19.关于MySQL VARCHAR的错误经验,你中了几条? – 稀土掘金

编译php7.1 openssl3.x版本过高?

下载:

wget https://openssl.org/source/openssl-1.1.1u.tar.gz tar -xzvf openssl-1.1.1u.tar.gz cd openssl-1.1.1u

编译安装:

./config --prefix=/usr/local/openssl1.1 --openssldir=/usr/local/openssl1.1/ssl
make -j$(nproc)
make install

临时改环境变量:

export PATH=/usr/local/openssl1.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/openssl1.1/lib:$LD_LIBRARY_PATH

configure php:

./configure --with-mysqli --with-pdo-mysql --enable-mbstring --enable-fpm --with-gd=/usr --with-curl --with-mcrypt --with-openssl --with-freetype-dir --with-zlib --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-pcntl --with-gmp --enable-zip --enable-bcmath --with-openssl=/usr/local/openssl1.1/ --with-openssl-dir=/usr/local/openssl1.1/

编译安装:(略)

.sql.gz 直接解压导入MySQL,不创建临时sql文件

可以通过管道命令实现不生成临时文件的直接导入,具体操作如下:

  1. Linux/macOS系统
    使用gzip解压管道配合mysql命令:
   zcat 文件名.sql.gz | mysql -u用户名 -p 数据库名

或使用gunzip命令:

   gunzip -c 文件名.sql.gz | mysql -u用户名 -p 数据库名

执行后会提示输入密码,输入正确密码即可开始导入。

  1. Windows系统
    需安装gzip工具(如7-Zip或Git Bash),然后执行:
   gzip -dc 文件名.sql.gz | mysql -u用户名 -p 数据库名

若使用PowerShell:

   Get-Content 文件名.sql.gz | gunzip | mysql -u用户名 -p 数据库名

注意需提前配置好MySQL环境变量。

  1. 注意事项
  • 确保.gz文件完整且未损坏。
  • 大文件导入时建议添加--max_allowed_packet参数调整包大小:
    bash zcat 大文件.sql.gz | mysql -u用户名 -p --max_allowed_packet=512M 数据库名
  • 若需指定字符集,可在命令中添加--default-character-set=utf8mb4

引用链接:
1.Horain云–搭建邮件服务器 – HoRain云小助手
2.mysql怎么导入sql.gz文件 – ZOL问答
3.windows mysql 怎么导入gz文件 – 51CTO博客
4.如何将sql文件导入mysql – 腾讯云
5.将.sql文件导入到MySQL数据库具体步骤 – 脚本之家
6.MySQL数据库中直接导入sql文件操作方法 – CSDN博客
7.mysql导入sql.g z文件,sqlite迁移mysql(导入导出数据)-CSDN博客 – CSDN博客
8.快速轻松地将SQL文件导入MySQL数据库:一步步指南 – 腾讯云
9.使用php 将 .sql.gz 文件导入 mysql – 慕课网
10.mysql gz 文件导入 mysql导入文件命令_mob6454cc7945bd的技术博客_51CTO博客 – 51CTO博客
11.MySQL客户端命令一节将.sql文件导入MySQL – CSDN博客
12.如何将外部.sql文件导入到本地mysql数据库中,命令窗口实现 – CSDN博客
13.mysql 导入gz – 51CTO博客
14.Linux MySQL实用技巧:SQL文件导入解决方案 (linux mysql如何导入sql文件) – 树叶云
15.如何把sql文件导入mysql – PHP中文网
16.怎样把一个 sql 的文件导入 mysql 数据库中? – 乱指琴魔舞
17.SQL文件导入MySQL数据库的详细指南 – 阿里云开发者社区
18.mysql怎么导入sql文件-mysql导入sql文件的方法 – 华军软件园
19.MySQL gz文件备份导入多个数据库 – 51CTO博客
20.sql文件如何导入到mysql – php中文网
21.mysql怎么导入sql文件?3种方法快速实现 – 思至创研
22.sql文件怎么导入mysql – php中文网
23.mysql怎么导入sql文件,提供三种方式,总有一种适合你! – 十宴
24.MySQL数据库的导入方法 – 博客园
25.如何将sql文件导入mysql数据库 – php中文网
26.如何导入导出MySQL数据库—-*.sql文件操作 – 博客园
27.sql文件如何导入到mysql数据库 – 腾讯云
28.将sql文件导入mysql—sql文件导入mysql – 树叶云
29.MySQL中怎么导入SQL文件? – 网联职教先锋