用于处理并发的当代PHP模式,还是这不是问题?

时间:2013-01-08 15:30:52

标签: php concurrency

我最后一次涉及到php是在2004年,当时nukephp的时候可以接受创建计数器,其中脚本读取文件,递增并将其写回。当我编写这些类型的脚本时,我并不担心锁定文件并且如果它无法获得锁定则下一个请求die()。

现在我。我相信很多人都是。那么当代现代网络开发者如何处理这个问题呢?对它有新的系统方法吗?据我所知,Ajax本身并没有提出解决这个问题的方法。它似乎只是关于异步请求,没有关于服务器应该如何处理两个客户端同时使用两个单独的值来更新文件。

无论如何,机制,模型,模式,架构,在PHP的世界中,如果只是我曾经感觉到的那些早期的原子性幻觉,我可以回到这里吗?如果我想要更加现代化地创建像stackexchange / utube评论这样的Web服务,我是否应该参与其中?

编辑:如何使用php中提供无锁货币的框架创建一个简单的计数器脚本,并且不依赖于数据库来处理协调事务,以及可以处理文件系统上的数据的东西(这个数据是非结构化的,不需要在数据库中。)

1 个答案:

答案 0 :(得分:1)

呃......讨厌打破它,但寻求“无锁并发平面文件更新”就像试图在地狱里找到一只飞来飞去的小猪。

解决方案,锁定文件,在过去的8年里没有改变,可能不会改变......永远。这是根本的。使用锁或数据库。数据没有结构并不重要,你可能已经使用数据库,所以要么在某个地方创建一个字段,要么创建一个更健壮的结构,让你钻研你的数据比任意日期以来的所有命中数都要简单得多。

TABLE Articles
  ID INT PK
  ...

TABLE Viewcount
  Date        DATE  PK
  Article_ID  INT   PK
  NumViews    INT

INSERT INTO Viewcount (Date, Article_ID, NumViews)
  VALUES(TODAY(), 12345, 1)
  ON DUPLICATE KEY UPDATE NumViews=NumViews+1

作为一个注释,如果您使用的是像C这样的编译语言,您可以编写一个守护进程来坐在该文件上并递增它,但您基本上只是将锁定文件移动到位于RAM中某个位置的bool。 / p>