You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ZipArchive时PHP time()函数出现时间获取异常问题

循环中time()值不变的原因及替代方案

为什么time()输出全一样?

time()返回的是当前时间的秒级整数时间戳——如果你的循环执行速度极快,所有迭代都在1秒内完成,那每次调用time()自然会拿到同一个数值。

至于exec("date +%s")能得到递增时间,完全是因为调用外部系统进程的开销太大,硬生生把每次循环的间隔拖到了1秒以上,本质是用极低的效率换来了“时间递增”的假象,而且这种方式在WordPress环境里本身就不被允许(很多主机禁用exec类函数)。

不用exec的解决办法

1. 用毫秒级时间戳区分循环节点

如果只是需要记录循环内不同步骤的时间差,直接用microtime(true)替代time(),它返回带小数的时间戳(精确到毫秒/微秒),哪怕循环在0.1秒内跑完,也能得到不同的数值:

foreach ($yourItems as $item) {
    $currentTime = microtime(true);
    // 执行ZipArchive的addEmptyDir/addFile操作
    echo $currentTime; // 输出类似1718923456.789
}

2. 手动生成递增时间序列

如果你的需求是给ZIP里的文件设置不同的修改时间,或者只是需要一个递增的时间标记,完全可以自己维护一个时间变量:

// 初始化基准时间
$currentTimestamp = time();
foreach ($yourFiles as $file) {
    // 用当前timestamp做你需要的操作
    echo $currentTimestamp;
    // 执行ZipArchive操作
    $zip->addFile($file, basename($file));
    // 每次循环让时间自增1秒
    $currentTimestamp++;
}

3. 直接给ZIP文件设置修改时间

如果是要给压缩包内的每个文件设置不同的最后修改时间,不用单独调用时间函数,直接用ZipArchive的setMtime方法更准确:

$zip = new ZipArchive();
if ($zip->open('your-archive.zip', ZipArchive::CREATE) === true) {
    $baseTime = time();
    foreach ($yourFiles as $index => $filePath) {
        $fileName = basename($filePath);
        $zip->addFile($filePath, $fileName);
        // 给每个文件设置递增的修改时间(比如比基准时间晚index秒)
        $zip->setMtime($fileName, $baseTime + $index);
    }
    $zip->close();
}

内容的提问来源于stack exchange,提问作者gididaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:01:17