如何使用Laravel Storage获取文件资源以调用flock实现文件锁定
Laravel 8 Storage类获取文件资源实现flock加锁方案
问题核心
Storage::get() 方法返回的是字符串类型的文件内容,而flock()要求入参为文件资源句柄,因此出现类型不匹配报错。
适用前提
本方案仅适用于本地存储磁盘,
flock()不支持对S3、FTP等远程存储的流资源加锁。
推荐实现
使用Laravel Storage原生提供的readStream()方法直接获取文件资源句柄:
$disk = Storage::disk('communication'); $file_name = 'received.json'; if ($disk->exists($file_name)) { // 获取文件流资源 $stream = $disk->readStream($file_name); // 加排他锁,如需非阻塞模式可改为 LOCK_EX | LOCK_NB if (flock($stream, LOCK_EX)) { // 此处编写业务处理逻辑 // ... // 执行完成后解锁并关闭流 flock($stream, LOCK_UN); fclose($stream); } }
备选方案
如果需要自定义文件打开模式(比如读写、追加等),可以先通过Storage::path()获取文件本地绝对路径,再自行用fopen()打开:
$disk = Storage::disk('communication'); $file_name = 'received.json'; if ($disk->exists($file_name)) { // 获取本地绝对路径,第二个参数为fopen打开模式,按需调整 $stream = fopen($disk->path($file_name), 'r+'); flock($stream, LOCK_EX); // 业务处理逻辑 // ... flock($stream, LOCK_UN); fclose($stream); }
注意事项
- 加锁后务必在逻辑结束后主动解锁并关闭流,避免造成文件资源长期占用
- 多进程操作同一文件时,建议统一加锁逻辑避免并发冲突
内容的提问来源于stack exchange,提问作者cooper
相关产品推荐
相关产品推荐

