【问题标题】:PHP. Safely writing to a file [closed]php。安全地写入文件[关闭]
【发布时间】:2013-03-13 08:40:23
【问题描述】:

我想知道下面的代码是否正确编写。我正在尝试编写一个安全的关键部分,该部分写入文件并尝试预测可能出现的任何问题。

有什么我应该注意的吗?我的意思是,我写了 try-catch 语句以防羊群中出现问题,因此它设法关闭文件并释放锁。还有什么需要注意的吗?

        /*
         * Write to file
         */
        if ( file_exists($sPath) )
        {
            //CRITICAL PART (start)
            $oFile = fopen($sPath, "a");

            //If could not open file then just return
            if ( $oFile == false ) return;

            try{
                //Acquire lock
                if ( flock($oFile, LOCK_EX) )
                {
                    //Append a new line
                    fwrite($oFile, "\n"."sometext");
                }
            }catch(Exception $e){
                //Release lock before exiting
                fclose($oFile);
                return;
            }
            //Release lock
            fclose($oFile);
            //CRITICAL PART (end)
        }

【问题讨论】:

  • flockfwrite 都不会抛出任何异常,因此 try/catch 块对我来说没有任何意义。
  • 哦...你是对的。很好的观察hakre,谢谢。
  • 如果你问一个关于具体问题的具体编程问题,Stackoverflow 效果最好。像 “我有什么需要注意的地方吗?” + 这是我的代码在 Q&A 格式中效果不佳。
  • @AndreiBogdan 即使他们抛出异常,你也应该使用finally 块来释放资源。 DRY

标签: php flock


【解决方案1】:
file_put_contents($sPath,"\n"."sometext", FILE_APPEND);

我相信追加不需要锁定。文件系统会处理得很好。
但是,我可能是错的

【讨论】:

  • 大多数文件系统都支持原子追加,但 NFS 除外,而 flock() 也应该支持。
【解决方案2】:

原生 php 函数不会抛出异常(至少绝大多数不会...... ..),所以你的try/catch 在那里毫无用处。您需要检查所有函数的返回值并检查它是否不是false。除此之外,我认为您管理得很好。

附带说明一下,文件锁定在 linux 中是建议性的(我不知道在其他平台上),因此您并没有获得对文件的真正锁定。我的意思是,其他进程可能会修改/覆盖/删除您“锁定”的文件。

【讨论】:

  • 错了。在 PHP 中,never 不是 never。即使这很常见,IIRC 也有该规则的例外情况。
  • @hakre 你是什么意思?
  • 你制定的核心函数永远不会抛出异常的“规则”。
  • 啊好的...正在编辑它...
【解决方案3】:

由于fopen函数成功返回文件指针资源,错误返回FALSE,你可以使用三元比较===,即:

if ( $oFile === false ) return;

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 2016-09-10
    • 1970-01-01
    • 2015-12-10
    • 2012-11-06
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多