可能一次多次在PHP中写入同一文件?

可能一次多次在PHP中写入同一文件?,php,file-io,locking,race-condition,Php,File Io,Locking,Race Condition,我正在使用PHP的fputcsv在我们正在制作的应用程序中记录投票。我的代码的保存部分大致包含以下内容: $handle = fopen('votes.csv', 'a'); fputcsv($handle, $data); fclose($handle); 这在测试中可以完美地工作。然而,我有一个小问题。在生产环境中部署时,可能会有许多用户同时向该脚本发出请求。我很好奇PHP将如何处理这个问题 我是否会有潜在的问题,并因此失去选票?如果是,我能做些什么来防止它?解决方案是否比简单地使用数据库

我正在使用PHP的
fputcsv
在我们正在制作的应用程序中记录投票。我的代码的保存部分大致包含以下内容:

$handle = fopen('votes.csv', 'a');
fputcsv($handle, $data);
fclose($handle);
这在测试中可以完美地工作。然而,我有一个小问题。在生产环境中部署时,可能会有许多用户同时向该脚本发出请求。我很好奇PHP将如何处理这个问题

我是否会有潜在的问题,并因此失去选票?如果是,我能做些什么来防止它?解决方案是否比简单地使用数据库更复杂?最后,我如何测试这种情况,在这种情况下,会同时发出很多请求?是否已经存在测试此类内容的工具?

写入文件可能会导致并发用户出现问题。如果改为插入数据库,则可以让数据库本身处理队列。如果连接不足,可以很容易地对其进行跟踪,并且可以在运行时看到数据库上的负载

数据库中的插入比文件中的附加占用的资源少。话虽如此,这两种方法都需要相当大的负载才能发挥作用——但对于数据库,内置查询队列可以减轻大部分并发压力


当您向数据库发送请求时,它实际上进入一个队列进行处理。只有当PHP代码中出现超时时(基本上,PHP被告知放弃等待db响应的等待,您可以通过PHP和Apache设置来控制),它才会无法执行,因此您有一个奇妙的内置缓冲区。

使用!A.数据库(对于那些,您还没有注意到:
SQLite
是无服务器的,默认情况下在php中启用)。用它!请尝试。在继续之前检查
fopen
是否失败。@Jocelyn没有任何区别,因为您可以随意多次打开文件(除非您的操作系统用完了文件处理程序^^)。即使使用锁,
fopen()
也只会阻塞,但不会失败。@Jocelyn如果会呢?我到底能做什么,循环睡觉直到它不停?