PHP通过shell_exec调用exiftool时FileModifyDate不生效问题排查
问题:PHP调用exiftool无法设置FileModifyDate,但终端执行正常
场景与代码
在Docker容器(php:apache8.2)中,通过PHP调用exiftool修改图片元数据,代码如下:
// $newEpoch由用户输入定义 $date = date('Y:m:d G:i:s', $newEpoch); shell_exec("exiftool '-DateTimeOriginal={$date}' '-FileModifyDate={$date}' '{$file}'");
现象
- DateTimeOriginal(对应Windows资源管理器中的“拍摄日期”)可正常设置
- FileModifyDate无法生效,但直接在终端执行
exiftool '-FileModifyDate=someDate' someFilePath可正常工作 - PHP日志无报错信息
- 环境:宿主机为运行Debian系统的树莓派4
可能的原因与解决办法
文件权限不足:容器内的Apache进程用户(通常是www-data)可能没有修改文件系统时间戳的权限。检查文件及所在目录的权限,确保www-data拥有读写权限,可通过以下命令调整:
chown www-data:www-data /path/to/target/files chmod 755 /path/to/target/filesexiftool未覆盖原文件:exiftool默认会生成原文件的备份(后缀为
_original),可能导致你看到的是未修改的备份文件。添加-overwrite_original参数直接修改原文件:shell_exec("exiftool '-DateTimeOriginal={$date}' '-FileModifyDate={$date}' -overwrite_original '{$file}'");日期格式兼容性问题:尝试更换日期格式为
Y-m-d H:i:s,部分环境下横杠分隔的格式更适配exiftool的FileModifyDate解析:$date = date('Y-m-d H:i:s', $newEpoch); shell_exec("exiftool '-DateTimeOriginal={$date}' '-FileModifyDate={$date}' -overwrite_original '{$file}'");Docker挂载权限限制:若文件存储在宿主机挂载到容器的目录中,检查挂载模式是否为只读(
ro),确保使用读写模式(rw)挂载。同时确认宿主机文件系统(如ext4)支持容器内修改文件时间戳。改用touch命令辅助修改:如果exiftool的方式仍不生效,可拆分操作:先用exiftool修改元数据,再用
touch命令直接修改文件系统的修改时间:// 修改拍摄日期元数据 shell_exec("exiftool '-DateTimeOriginal={$date}' -overwrite_original '{$file}'"); // 转换为touch支持的日期格式(YYYYMMDDHHMMSS) $touchFormatDate = date('YmdHis', $newEpoch); // 修改文件修改时间 shell_exec("touch -t {$touchFormatDate} '{$file}'");
内容的提问来源于stack exchange,提问作者Silloky
相关产品推荐
相关产品推荐

