加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

PHP 5.x同步文件访问(无数据库)

发布时间:2020-05-25 09:27:32 所属栏目:PHP 来源:互联网
导读:我最熟悉 Java,C和C,其中有一些方法可以控制在任何给定时间只有一个线程正在访问资源.现在我正在寻找类似但在 PHP 5.x中的类似内容. 用一个例子来表达我的问题: 我有一个ASCII文件,它只存储一个数字,一个页面加载计数器的值.在应用程序部署时,文件将只保留0.

我最熟悉 Java,C和C,其中有一些方法可以控制在任何给定时间只有一个线程正在访问资源.现在我正在寻找类似但在 PHP 5.x中的类似内容.

用一个例子来表达我的问题:

我有一个ASCII文件,它只存储一个数字,一个页面加载计数器的值.在应用程序部署时,文件将只保留0.对于每次访问,该值将增加1.目标是跟踪页面加载.

当许多用户同时访问包含计数器的页面时,问题就出现了.当线程A读取当前值时,假设它是11,我们称之为B的另一个线程读取值,仍为11.然后第一个线程A递增读取值并在文件中写入12并关闭它.然后第二个线程B递增读取值,即11,得到12并将其写入文件.值12存储在文件中,当它真的应该是13.

在另一种编程语言中,我会用互斥量来解决这个问题.我知道有互斥,共享内存和其他功能作为模块的一部分.但我想要一个适用于“大多数服务器”的解决方案.平台独立.安装在大多数便宜的网络主机上.这个问题有一个很好的解决方案吗?如果没有,如果使用数据库不是一种选择,你会采取哪种方式?

你可以尝试php的flock变种( http://www.php.net/flock)

我会想到类似的东西(这假设文件/tmp/counter.txt已经存在并且在文件中有一个计数器):

<?php

$fp = fopen("/tmp/counter.txt","r+");

echo "Attempt to lockn";
if (flock($fp,LOCK_EX)) {
  echo "Lockedn";
  // Read current value of the counter and increment
  $cntr = fread($fp,80);
  $cntr = intval($cntr) + 1;

  // Pause to prove that race condition doesn't exist
  sleep(5);

  // Write new value to the file
  ftruncate($fp,0);
  fseek($fp,SEEK_SET);
  fwrite($fp,$cntr);
  flock($fp,LOCK_UN); // release the lock
  fclose($fp);
}

?>

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读