2013-03-13 52 views
0

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

有什么我应该在了望台上?我的意思是,我写了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) 
     } 
+1

无论['羊群'](http://php.net/flock)和['fwrite'](http://php.net/fwrite)不要抛出任何异常,因此try/catch块对我来说没有任何意义。 – hakre 2013-03-13 08:46:40

+0

哦......你是对的。好的观察结果,谢谢。 – AndreiBogdan 2013-03-13 08:47:57

+0

如果你问一个关于具体问题的具体编程问题,另外Stackoverflow的效果最好。问题如*“我有什么需要了解的?”* +这里是我的代码在Q&A格式中效果不好。 – hakre 2013-03-13 08:49:27

回答

1

PHP函数不抛出异常(至少绝大多数OOP本地代码不做......新功能做抛出异常,你知道DateTime和...) ,所以你的try/catch在那里没用。您需要检查所有功能的返回值,并检查它是不是false。除此之外,我认为你管理得很好。作为一个方面说明,文件锁定是在linux(我不知道在其他平台)咨询,所以你没有获得一个真正的锁在文件上。我的意思是,其他进程可能会修改/覆盖/删除您“锁定”的文件。

+0

错误。这绝不是一个永远不会在PHP中。即使这是常见的,IIRC也有这个规则的例外。 – hakre 2013-03-13 08:49:43

+0

@hakre哟意味着什么规则? – 2013-03-13 08:50:35

+0

您制定核心功能的“规则”决不会抛出异常。 – hakre 2013-03-13 08:51:39

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

我相信锁定不需要追加。文件系统将处理它。
不过,我可能是错的

+0

大多数文件系统都支持除NFS之外的原子追加,而'flock()'也应该支持。 – 2013-03-13 09:19:01

1

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

if ($oFile === false) return;