我想知道下面的代码是否写得正确。我正在尝试编写一个安全的关键部分,它写入文件内部并试图预测任何可能出错的内容。
我应该注意什么?我的意思是,我编写了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)
}
答案 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;