PHP中是否可能同时多次写入同一文件?

4

我正在使用PHP的fputcsv函数记录我们正在开发的应用程序中的投票。我的代码保存部分大致如下:

$handle = fopen('votes.csv', 'a');
fputcsv($handle, $data);
fclose($handle);

这在测试中完美运行。然而,我有一个小问题。当部署到生产环境中时,可能会有很多用户同时请求此脚本。我想知道PHP将如何处理。

我会因此潜在地遇到问题并且失去投票吗?如果是这样,我该怎么做才能防止它?解决方案是否比仅使用数据库更加复杂?最后,我该如何测试这种情况,即同时进行大量请求的情况?是否已经存在用于测试此类事物的工具?


1
使用数据库!(对于那些还没有注意到的人:SQLite是无服务器的,并且在php中默认启用)。使用它! - KingCrunch
请尝试阅读这篇文章 - Matt
在继续之前,请检查fopen是否失败。 - Jocelyn
@Jocelyn 没有任何影响,因为您可以无限次打开文件(除非您的操作系统耗尽文件处理程序 ^^)。即使使用锁定,fopen()只会阻止,而不会失败。 - KingCrunch
@Jocelyn,如果它确实这样做了呢?我该怎么办?是循环并休眠直到它不再这样做吗? - Alex Turpin
要么休眠并循环几次重试,要么立即退出(不记录投票)。 - Jocelyn
1个回答

4
写入文件可能会对并发用户造成问题。如果您改为插入到数据库中,数据库本身可以处理队列。如果连接用尽,很容易跟踪,并且您可以在操作时查看数据库的负载。
数据库中的插入将比追加到文件少使用资源。话虽如此,在任何一种情况下都需要相当大的负载才能产生影响 - 但是使用数据库,您有内置的查询队列来缓解大部分并发压力。
当您向数据库发送请求时,它实际上进入一个处理队列。只有在 PHP 代码中超时时(基本上,告诉 PHP 放弃等待数据库响应 - 您可以通过 PHP 和 Apache 设置控制此行为),才无法执行该请求,因此您拥有一个非常出色的内置缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接