0

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

有什么我应该注意的吗?我的意思是,我写了 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)
        }
4

3 回答 3

2
file_put_contents($sPath,"\n"."sometext", FILE_APPEND);

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

于 2013-03-13T08:49:18.330 回答
1

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

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

于 2013-03-13T08:49:14.850 回答
1

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

if ( $oFile === false ) return;
于 2013-03-13T08:51:35.787 回答