如何测试文件is_writable是否被其他程序锁定

时间:2014-09-15 04:11:54

标签: php

这听起来像PHP is_writeable or opened by another program?的副本,但没有回答我的问题。

我的程序突然停止处理一个巨大的错误消息。经过一番调查后发现,它试图写入另一个应用程序中打开的文件。如何在不产生错误的情况下测试?我想用一个用户友好的错误替换PHP自动错误。 fopen($filename, 'c');失败(任何写入选项,例如'w''a'也失败),只有'r'有效,但由于文件未锁定以供阅读,因此无效。我已经尝试flock使用LOCK_EX的文件,正如php.net所说的那样

  

获得独家锁(作家)

但不幸的是,这表明已经获得了锁!我猜LOCK_EX只能在使用fopen'w''a'等之一时与'c'一起使用。我之前说过总是失败了)。 is_readable()is_writable()都返回true。据我所知,在正常情况下,该文件是可写的,但我想知道它现在是否可写!

到目前为止,我尝试过的每种方法都有不正确的结果或错误(警告)。请,请不要建议使用@

1 个答案:

答案 0 :(得分:0)

如果您检查是否可以立即编写,然后打开它进行写入,则另一个进程或线程可能会在中间打开它,这样就会给您带来竞争条件。相反,尝试打开它并处理失败。

在这种情况下,处理错误可能需要调用set_error_handler()来保留日志的输出,并调用另一个restore_error_handler()来恢复以前的状态。或者,使用@前缀可能真的是一种替代方案,就像通常那样可怕。

核心问题是PHP通过日志记录进行错误处理是有缺陷的,因为它需要正确检查错误的程序跳过额外的循环,以便保持从日志中正确处理的错误。如果需要,请选择其他语言(具有不同的缺陷集)。