
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 类型安全机制不兼容,修复核心在于明确区分“获取当前时间”与“解析时间字符串”两种场景,并选用语义清晰、类型安全的函数替代模糊传参。