当许多用户访问一个PHP文件时,对textfile进行写操作是同时进行还是一次一个


php when many users access a php file that writes to textfile is it done simultaneously or one at a time

我使用的主机包不允许sql,将不得不支付更多的每月,如果我想sql和它的共享服务器,所以我不能有一个客户端服务器设置为我的应用程序。

我正在为我的第一款应用制作排行榜。

所以我决定用php做所有的事情。应用程序将在浏览器中启动一个链接,看起来像这样:

....../myAppLeaderBoard.php?opt=submit&?id=5465&name?='myName'&dat=DKGHKDHGKHDKGHSAJDHKJAHGJKHDFGHKJDFHGLKHDFGJHSDJLFGHJKSDHFGKJDSHFKGJHSLKDFHGLSJDHFGLJSHDFGJHSLDFJHGLSDJHFGLSDHJFGLSHDFGHG

所有这些字母都是因为我计划使用我自己的加密技术来防止用户作弊并给自己一个高分。

提交时,它将从一个文本文件中读取所有内容到一个数组中它将检查用户是否存在,如果他们存在,它将更改该记录,如果他们不存在,它将添加一个新记录,然后它将从数组中写入所有内容回textfile。

然后它将显示成功消息并在排行榜上显示用户,现在如果100000个用户同时提交他们的分数会发生什么?

如果一次读取和写入一条记录,不会有问题,但如果同时读取和写入,则可能会同时删除一些记录。

是同时完成还是一次完成一个?

如果有更好的方法,请随时提出建议

文件访问是同时进行的,但是您可以使用flock来阻止其他句柄在执行读/写操作时访问文件。听起来最好的解决方案是使用PDO和SQLite(如果可用)。通过这种方式,数据库可以为您处理所有锁,但不需要专用的数据库服务器。SQLite完全基于文件。

如果SQLite不可用,你会想使用flock的LOCK_EX操作,这将只允许一个写流一次访问文件,例如

// create the file handle
$hnd = fopen($destpath, 'ab+');
if ($isReadOperation) {
    // shared lock - simultaneous reads can happen at one time
    flock($hnd, LOCK_SH);
    // perform your read operation
} else {
    // exclusive lock - only one write can occur at a time after all shared locks are released
    flock($hnd, LOCK_EX);
    // perform your read/write operation
}
// release the lock
flock($hnd, LOCK_UN);
// release the file handle
fclose($hnd);

文件访问(这也适用于sqlite数据库,因为它们是基于文件的),不幸的是,不应该处理许多同时读取&写操作。因此,您遇到问题。

恐怕你唯一明智的选择是购买一个提供真正数据库的托管计划,例如MySQL。