PHP。安全地写入文件

时间:2013-03-13 08:40:23

标签: php flock

我想知道下面的代码是否写得正确。我正在尝试编写一个安全的关键部分,它写入文件内部并试图预测任何可能出错的内容。

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

有什么想法吗?

        /*
         * 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)
        }

3 个答案:

答案 0 :(得分:2)

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

我认为附加不需要锁定。文件系统可以正确处理它 但是,我可能是错的

答案 1 :(得分:1)

原生php函数不会抛出异常(至少绝大多数人不会在OOP本机代码中执行更新的函数执行抛出异常,你知道{{1等等...),所以你的DateTime在那里没用。您需要检查所有函数的返回值,并检查它是否为try/catch。除此之外,我认为你管理得很好。

作为旁注,文件锁定在linux中是建议性的(我不知道在其他平台上),所以你没有获得对文件的真正锁定。我的意思是,其他进程可能会修改/覆盖/删除您正在锁定的文件"。

答案 2 :(得分:1)

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

if ( $oFile === false ) return;