这听起来像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
。据我所知,在正常情况下,该文件是可写的,但我想知道它现在是否可写!
到目前为止,我尝试过的每种方法都有不正确的结果或错误(警告)。请,请不要建议使用@
!
答案 0 :(得分:0)
如果您检查是否可以立即编写,然后打开它进行写入,则另一个进程或线程可能会在中间打开它,这样就会给您带来竞争条件。相反,尝试打开它并处理失败。
在这种情况下,处理错误可能需要调用set_error_handler()
来保留日志的输出,并调用另一个restore_error_handler()
来恢复以前的状态。或者,使用@
前缀可能真的是一种替代方案,就像通常那样可怕。
核心问题是PHP通过日志记录进行错误处理是有缺陷的,因为它需要正确检查错误的程序跳过额外的循环,以便保持从日志中正确处理的错误。如果需要,请选择其他语言(具有不同的缺陷集)。