使用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
相关产品推荐
相关产品推荐

