Laravel 谨慎使用Storage::append()

news2024/12/23 17:09:09

driverlocal 时,Storage::append()在高并发下,会存在丢失数据问题,文件被覆写,而非尾部添加,如果明确是本地文件操作,像日志写入,建议使用 Illuminate\Filesystem\Filesystem或者php原生方法file_put_content(),通过 storage_path() app_path() public_path() 等方法也能达到类似效果。

源码 分析:

  1. Storage::append()driverlocal 时,调用的是 vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php 提供的方法,那么其中定义的 append() 是这样的:
/**
 * Append to a file.
 *
 * @param  string  $path
 * @param  string  $data
 * @param  string  $separator
 * @return int
 */
public function append($path, $data, $separator = PHP_EOL)
{
    if ($this->exists($path)) {
        return $this->put($path, $this->get($path).$separator.$data);
    }

    return $this->put($path, $data);
}

可以明显的看出这里的 append方法是将文件读出来拼接再写入的,那么当文件非常大时,io 消耗和内存消耗肯定会存在问题

  1. 那么看看 Filesystemappend
/**
 * Append to a file.
 *
 * @param  string  $path
 * @param  string  $data
 * @return int
 */
public function append($path, $data)
{
    return file_put_contents($path, $data, FILE_APPEND);
}

可以看到这里是调用的 php原生方法 file_put_contents(),那么为什么这个原生方法不会有问题?

  1. file_put_contents() 的实现

php 官方文档在介绍 file_put_contents()时是这样描述的:

image.png

可以看到,它也并没有调用 php 在应对高并发时的应对函数 flock()

image.png

那么当使用 FILE_APPEND模式时,php 是如何操作的,我们注意到在描述 fwirte()时,特别标注了 可安全用于二进制对象

image.png

那么它的含义是什么?

image.png

看到这里,也明白了 fwrite是能保证在追加模式下的多进程调用都写入到文件尾部

总结:php_put_contents在使用追加模式时,其实是fwrite()函数在追加模式下能保证文件安全的都实现内容追加到尾部,phpfwrite 调用的是系统的 write() 并使用参数 O_APPEND

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1893740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window下git bash设置启动后默认路径进入自己的工程

方法一:更改快捷方式 方法二:修改~/.bashrc

香港即将“放松”加密货币监管!加密牌照制度备受批评!全球主力军无法进入香港市场?动摇了香港Web3的信心!

2024年7月3日,香港金融服务及库务局局长许正宇在立法会会议上表示,香港金融管理局(HKMA)和证券及期货事务监察委员会(SFC)将根据市场发展情况,适时检讨虚拟资产相关活动的监管要求。 这一表态引发了人们对香港加密货币监管框架可能进行调整的…

Android Studio 大作业--学生信息管理系统

欢迎光临: 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼 ---------------🍎------------🍉-------------- 🐼学编程的bird的博客,邀您一起学习🦌 ----------------&am…

面试篇-Redis-3+分布式锁+集群部署

文章目录 前言一、你们项目中使用Redis 作为分布式锁吗1.1 将余券存入到Redis 中,当有人抢券进行-1操作并存回:1.2 分布式锁的使用1.3 Redis 分布式锁是怎么实现的:1.4 Redisson 分布式锁是可重入的吗:1.5 Redis 出现脑裂时如何保…

Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…

防水头灯在户外探险的应用_鼎跃安全

随着我国民众生活品质的显著提升,人们对户外探险的热爱与参与度也日益高涨。在这一充满挑战与未知的旅途中,拥有一件可靠的照明设备成为了确保安全与探索乐趣的关键。面对户外多变的自然环境,包括突如其来的降雨、潮湿的森林小径等恶劣条件&a…

c++ primer plus 第15章友,异常和其他:友元类

c primer plus 第15章友,异常和其他:友元类 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:友元类 提示:写完文章后,目录可以自动生成,如何生成可参考右边的…

阳光倒灌试验太阳辐射系统日光模拟器

太阳光模拟器概述 太阳光模拟器是一种能在实验室环境下模拟太阳光照射特性的设备,广泛应用于材料科学、能源研究、环境科学等领域。通过模拟太阳光的光谱分布和辐射强度,太阳光模拟器可以为科研和工业提供稳定且可重复的光照条件,进而对材料…

如何隐藏和保护Excel表格中的敏感数据?

日常办公过程中,我们难免会遇到一些涉及个人隐私或商业机密等数据,那么该如何保护这些数据?现在,我将告诉你如何保护这些数据。 一、障眼法 我们选中要保护的数据,然后点击鼠标右键,选择设置单元格格式。选…

【WEB前端】---HTML---结构---笔记

目录 1.标签---单标签和双标签 1.1单标签 1.2双标签 2.基本结构标签 2.1HTML标签 2.2文档头部标签 2.3文档标题标签 2.4文档的主题标签 3.常用的标题标签 (n∈[1,6]) 4.段落标签 5.换行标签 6.文本格式化标签 6.1粗体 6.2倾斜 6.3删除线 6.4下划线 7.div和spa…

9.x86游戏实战-汇编指令mov

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Linux上快速定位Java代码问题行

生产环境中,经常会遇到CPU持续飙高或内存、IO飙高,如何快速定位问题点是很多新手头疼的问题,只能通过经验和代码推理,其实这里针对Java程序可以通过top和jstack命令,快速定位到问题代码。 Top命令的输出 具体定位之前…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

DC/AC电源模块:效率与可靠性兼备的能源转换解决方案

BOSHIDA DC/AC电源模块&#xff1a;效率与可靠性兼备的能源转换解决方案 随着科技的迅速发展和人工智能技术的逐渐成熟&#xff0c;各种电子设备的需求也日益增加。然而&#xff0c;这些设备往往需要不同的电压和电流来正常工作&#xff0c;而供电方式却可能不尽相同。这时&am…

miniprogram-to-uniapp-微信小程序转换成uniapp项目

文章目录 参考:miniprogram-to-uniapp使用指南第一步第二步第三步第四步【miniprogram-to-uniapp】转换微信小程序”项目为uni-app项目(新版本工具已经支持各种小程序转换) 参考: 小程序技能树 uni-app基础知识总结 miniprogram-to-uniapp使用指南 第一步 win + R 输入…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题

一、实验目的 1.验证因网络故障而导致的静态路由的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证网络故障导致的…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时&#xff0c;脸部细节往往不够精细&#xff1f; 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己…

web学习笔记(七十五)

目录 1.小程序修改响应式数据 1.1修改基本数据类型的值 1.2修改复合数据类型的值 2. 发送请求 3.小程序解决跨域问题 1.小程序修改响应式数据 1.1修改基本数据类型的值 在小程序中需要先将data中的数据拿过来并结构&#xff0c;才可以在this.setdata中修改数据&#xf…

充分利用智慧校园人事系统,提升党政职务管理

智慧校园人事系统中的党政职务管理功能&#xff0c;是专为高校及教育机构设计的&#xff0c;旨在高效、精确地处理与党政职务相关的各类事务&#xff0c;包括职务任命、任期管理、职责分配、考核评估等&#xff0c;以信息化手段促进党务及行政工作的透明化、规范化。 该模块首先…