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


How to test if file is_writable and not locked by another program

这听起来像是PHP is_writeable的副本或由另一个程序打开? 但这并没有回答我的问题。

我的程序突然停止工作,并显示一条巨大的错误消息。经过一番调查,事实证明它正在尝试写入在另一个应用程序中打开的文件。如何在不生成错误的情况下对此进行测试?我想用用户友好的错误替换 PHP 自动错误。 fopen($filename, 'c');失败(任何写入选项(如'w''a'也失败(,只有'r'有效,但由于文件未锁定读取,因此没有帮助。我尝试过用LOCK_EX flock文件,正如 php.net 所说

获取独占锁(写入器(

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

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

如果您检查现在可以编写它,然后打开它进行写入,则另一个进程或线程可能会在两者之间打开它,因此这将为您提供争用条件。相反,请尝试打开它并处理故障。

在这种情况下,处理错误可能涉及调用 set_error_handler() 以保留日志中的输出,并调用 restore_error_handler() 以还原以前的状态。或者,使用 @ 前缀可能真的是一种替代方案,就像通常一样可怕。

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