在不同PHP线程的同一文件上运行file_put_contents()是否存在风险?

bul*_*ley 25 php

我知道file_put_contents()可以很容易地将数据附加到PHP中的文件中.我想尝试将PHP" 线程 "用于file_put_contents()来自不同PHP线程的相同日志文件.从不同的PHP线程在同一文件上运行file_put_contents()是否存在风险,或者如果文件被锁定或被另一个线程访问,这些线程是否会高兴地阻塞?

编辑:找到一个推荐flock()的类似问题,但风险问题似乎没有完全解决.这些"原子"写操作吗?

Nea*_*eal 24

正如它在手册页上所说的那样(你给了一个链接!):

// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
Run Code Online (Sandbox Code Playgroud)

使用该LOCK_EX标志可防止双重写入

  • 有一件事在这里不是很清楚(至少对我来说) - 很明显,使用`LOCK_EX`标志时,没有人会在你写作时进行干预.但他们付出了什么代价?如果您的主要关注点之一是*其他人*的成功怎么办?是否可以安全地假设其他线程将等待锁被删除并成功写入? (9认同)
  • 并清理:它是一个咨询锁定.只有当另一个线程使用相同类型的锁定时,这才有效,因此有人调用*this function*(或其他基于相同锁定系统的东西)将阻塞(在此调用中).任何不通过篮球来尊重这个锁的人都可以完全忽略它,并且不会神奇地等待或类似的东西. (2认同)