
php升级后mktime()不再接受字符串参数,原代码将日期字符串直接传入导致typeerror,需改用time()或正确拆解时间组件。
mktime() 是一个用于根据指定的小时、分钟、秒、月、日、年生成 Unix 时间戳的函数,其所有参数必须为整数类型(int)。而你的代码中:
$ah = date("H:i:s Y-m-d");
$ahseg = mktime($ah);$ah 是形如 "14:25:33 2024-06-15" 的字符串,将其整体作为第一个参数($hour)传给 mktime(),PHP 8.0+ 会严格校验类型并抛出致命错误:
Fatal error: Uncaught TypeError: mktime(): Argument #1 ($hour) must be of type int, string given
⚠️ 关键原因:
- 旧服务器可能运行 PHP 7.x(类型检查较宽松,部分版本会尝试隐式转换);
- 新 Plesk 服务器默认启用较新 PHP 版本(如 8.0/8.1/8.2),启用了严格的类型检查(RFC: Strict Type Checks for Built-in Functions)。
✅ 正确解决方案:
立即学习“PHP免费学习笔记(深入)”;
方案 1(推荐):如只需当前时间戳 → 直接用 time()
$ahseg = time(); // 返回当前 Unix 时间戳(秒级),简洁高效
方案 2:如需基于特定格式字符串构造时间戳 → 用 strtotime()
$ah = date("H:i:s Y-m-d"); // 例:"14:25:33 2024-06-15"
$ahseg = strtotime($ah); // 自动解析字符串,返回时间戳(支持多种格式)方案 3:坚持使用 mktime() → 手动提取整数参数
$now = getdate(); // 或用 date_parse() 解析 $ah 字符串
$ahseg = mktime(
(int)$now['hours'],
(int)$now['minutes'],
(int)$now['seconds'],
(int)$now['mon'],
(int)$now['mday'],
(int)$now['year']
);
// 或更安全地解析自定义字符串:
$parts = date_parse("2024-06-15 14:25:33");
$ahseg = mktime(
$parts['hour'], $parts['minute'], $parts['second'],
$parts['month'], $parts['day'], $parts['year']
);? 注意事项:
- strtotime() 是处理日期字符串最常用、最健壮的方式,但需确保输入格式可被识别(如 "Y-m-d H:i:s" 安全兼容);
- 避免依赖 mktime() 接收非整数参数——这在任何现代 PHP 版本中都不应被视为有效行为;
- 在 Plesk 环境中,可通过「Websites & Domains」→「PHP Settings」确认并统一 PHP 版本,便于开发与生产环境一致。
总结:该错误本质是代码与新版 PHP 类型安全机制不兼容,修复核心在于明确区分“获取当前时间”与“解析时间字符串”两种场景,并选用语义清晰、类型安全的函数替代模糊传参。











