# -*- coding: utf-8 -*- """按 ThinkPHP File 缓存格式写入一个测试登录态,验证 Java 拦截器能正确读取。 PHP serialize 字符串长度按 UTF-8 字节计,这里用通用序列化函数自动计算,避免手写长度出错。 """ import hashlib import os from _root import ROOT # 默认写 Java 侧缓存目录;设置 YOSHOP_CACHE 可额外写入其它目录(如本地 PHP 站点的 runtime/cache) CACHE = os.environ.get( "YOSHOP_CACHE", str(ROOT / "runtime/cache")) def php_serialize(v): if v is None: return "N;" if isinstance(v, bool): return "b:" + ("1" if v else "0") + ";" if isinstance(v, int): return "i:%d;" % v if isinstance(v, float): return "d:%r;" % v if isinstance(v, str): return 's:%d:"%s";' % (len(v.encode("utf-8")), v) if isinstance(v, dict): out = "a:%d:{" % len(v) for k, val in v.items(): out += php_serialize(k) + php_serialize(val) return out + "}" if isinstance(v, (list, tuple)): out = "a:%d:{" % len(v) for i, val in enumerate(v): out += "i:%d;" % i + php_serialize(val) return out + "}" raise TypeError(type(v)) user = { "store_user_id": 10001, "user_name": "admin", "password": "$2y$10$57o000000000000000000000000000000000000000000000000", # 占位,仅用于读取测试 "real_name": "系统管理员", "is_super": 1, "is_delete": 0, "sort": 100, "store_id": 10001, "create_time": 1614556800, } cache_value = {"user": user, "store_id": 10001, "is_login": True} token = "testsession123" name = hashlib.md5(token.encode()).hexdigest() path = os.path.join(CACHE, name[:2], name[2:] + ".php") os.makedirs(os.path.dirname(path), exist_ok=True) header = "\n" assert len(header.encode()) == 32, len(header.encode()) payload = php_serialize(cache_value) with open(path, "w", encoding="utf-8", newline="") as f: f.write(header + payload) print("token :", token) print("file :", path) print("header:", len(header.encode()), "bytes | payload:", len(payload.encode()), "bytes") print("payload 前 150 字:", payload[:150])