1

我有一个相当基本的 PHP 脚本,可以将数据缓存到文本文件中。我需要想出一个解决方案来防止脚本的两个正在运行的实例同时写入文件。我已经查看了 PHP 群函数,但是,PHP 手册(http://php.net/manual/en/function.flock.php)提到了一个很大的限制:

在某些操作系统上,flock() 是在进程级别实现的。当使用像 ISAPI 这样的多线程服务器 API 时,您可能无法依靠 flock() 来保护文件免受在同一服务器实例的并行线程中运行的其他 PHP 脚本的影响!

关于这个警告,我有两个问题希望有人能回答。首先,我如何检查我的flock 实现是否在进程级别完成?顺便说一句,我正在使用 cPanel 运行 CentOS。

其次,如果我的实现是在进程级别,这是否意味着我的脚本的一个运行实例不会知道同一脚本的另一个运行实例完成的锁定?还是脚本实例在单独的线程而不是单独的进程上运行?非常感谢对此的任何澄清。

谢谢。

4

1 回答 1

0

唯一常见的情况是使用某种线程(非分叉)npm 运行 Apache。99% 的情况下你没有运行 PHP 线程。这是一个相对安全的假设。

除此之外,尝试避免锁定可能是值得的。

您遇到的最大问题是 2 个进程可能同时在写入,或者 1 个进程在缓存未完全生成时读取缓存。解决这个问题的最简单方法是让 PHP 脚本在临时位置的不同文件中生成缓存。写入文件后,只需将其移动到位(使用 rename())。当文件移动发生在同一个挂载上时,它保证是原子的。

于 2013-03-01T01:33:58.630 回答