香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 84|回复: 0

PHP解决上传生成文件名重名问题(使用pid随机盐抗多进程 ...

[复制链接]

1

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-1-13 16:33:05 | 显示全部楼层 |阅读模式
$ext = pathinfo($_FILES['file']['name']);        // 依据pid生成的盐    if(getmypid()!=false){       $pid_salt = getmypid() . substr(md5(mt_rand()),-3);    }else{       $pid_salt = '';    }        $filepath = sprintf('Fold/%s%s.%s', uniqid(mt_rand()), $pid_salt, $ext['extension']);        // file_exists -->  递归函数检测(抵抗时钟回拨问题),最终返回一个不存在的文件。    // 考虑多进程问题 --> 增加pid_salt盐        $filepath = check_file($filepath);    if (!move_uploaded_file(        $_FILES['file']['tmp_name'],        $filepath    )) {        throw new RuntimeException('Failed to move uploaded file.');    }           /*检测文件是否存在<-->递归函数*/    function check_file($filepath){            if(file_exists($filepath)){            // echo $file.' 存在!';            $ext = pathinfo($filepath);            $filepath = sprintf('File_Stor_Fold/%s_%s.%s', uniqid(),mt_rand(), $ext['extension']);            check_file($filepath);        }else{            // echo $file.' 不存在!';            return $filepath;        }    }
上传到临时文件那里是 操作系统mk函数保障的线程安全Thread Safe 的;但不能确保生成的文件名(move file)环节的唯一性,因此使用如上的机制来消除重复。
其实微服务环境下, 应该使用 单进程模型,来处理文件上传服务, 做排队。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 15:00 , Processed in 0.698335 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表