【问题标题】:PHP flock function limitations and txt cache filesPHPflock函数限制和txt缓存文件
【发布时间】:2013-03-01 01:24:27
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 是否必须缓存到磁盘?使用 APC/memcached 通常更可取。但如果持久性是必需的,则不是。
  • 你能检查一下其他脚本是否正在运行吗?您可以写入文件或数据库以说明文件 X 正在使用中,然后在运行脚本之前进行检查
  • 达贡所说的很常见。创建一个名为lock 的文件,如果该文件存在,则说明其他人正在使用该文件。

标签: php linux caching cache-control process


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2015-08-14
    • 2015-07-21
    • 2010-09-26
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多