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

前端之家收集整理的这篇文章主要介绍了PHP 5.x同步文件访问(无数据库)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最熟悉 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 lock\n";
if (flock($fp,LOCK_EX)) {
  echo "Locked\n";
  // 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);
}

?>

猜你在找的PHP相关文章