在我的 PHP 代码中,我打开一个文件并向其中附加文本。我使用这段代码:
$ourFileHandle = fopen($ourFileName, 'a') or die("can't open file");
当加载 PHP 页面时会发生这种情况。现在如果两个人同时加载 PHP 页面会发生什么?这段代码对其中一个人有效吗?对于另一个人,它会执行吗?die()
?一般来说什么时候可以fopen
fail?
Thanks.
TL;DR - 只需使用数据库
这不是一个简单的话题。对于多个并发请求,您正在做的事情肯定不会按预期工作,因为大多数系统将允许所有请求打开文件,并且可能有多个脚本能够同时写入文件,您很可能最终会这样如果您这样做,文件中会出现垃圾。
解决此问题的可能解决方案多种多样,但我将在此介绍我认为最可行的三个。
-
使用数据库。无论您尝试做什么,这几乎肯定是最佳解决方案。 RDBMS 将毫不犹豫地处理所有这些并发问题,如果这样做,您将永远不会遇到任何并发问题。
-
使用以下命令请求文件上的独占锁flock()
。该函数使用advisory锁定以防止多个并发进程同时访问该文件。这将满足您对多个 PHP 进程的需求,但如果其他外部程序不支持 PHP 使用的相同类型的咨询锁定系统,则它可能无法与其他外部程序一起工作。
flock()
“阻塞”直到获得文件的锁。这意味着它将损害请求并发性 - 一次只有一个请求能够写入文件。此外,它不保证锁将按照请求的顺序提供,因此您可能会遇到这样一种情况:一个请求永远无法获得文件的锁,而其他后来到达的请求却得到满足。
-
使用后台进程来处理文件访问,并让您的脚本与该进程进行通信。这有点像滚动你自己的 1) 版本,它不适合胆小的人,但如果做得正确,它可以发挥巨大的作用。
使用此模型,可以使用某种形式的进程间通信将需要写入文件的数据中继到后台(持久)进程。然后,该后台进程管理对文件的写入,确保消息完整且按正确的顺序写入。通常(当使用 PHP 时)此类 IPC 将通过套接字实现。这是一个重要的解决方案,但可能是最强大的解决方案。
从更普遍的角度来看,fopen()
通常由于权限问题或低级操作系统问题而失败。操作系统还可以提供“真正的”锁定机制,以防止其他程序打开该文件。然而,真正的“原因清单”fopen()
可能会失败”很难提供,因为有太多的可能性。
显然,如果您尝试以读取模式打开文件并且该文件不存在,则会失败。但是,上面的代码是以写入模式打开文件 - 这不会一定如果文件不存在则失败 - 如果目录路径存在并且调用进程有权写入该目录,则将创建该文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)