簡體   English   中英

PHP-防止覆蓋文件中的數據

[英]PHP - prevent overwriting data in a file

我創建了一個簡單的無數據庫CMS。 保存文件時,PHP將打開相應的文件,添加新數據,然后關閉文件(使用file_put_contents)。

這一切都很好-直到同一文件同時保存兩次(或多次)。 我的意思是當在已經遇到另一個file_put_contents函數的文件上啟動file_put_contents函數時。 在這種情況下,僅將第二個file_put_contents的更改保存到文件中。

所以我的問題是-在開始第二個file_put_contents之前,有沒有一種方法可以檢查文件是否已經被寫入,並等到寫入完成?

是的,在PHP 5.1中已將LOCK_EX支持添加到file_put_contents中,該支持將等到文件上的任何其他鎖釋放后再寫入。 您可以自己輕松測試。

lock.php

#!/usr/bin/env php
<?php

$h = fopen(__DIR__ . DIRECTORY_SEPARATOR . "lock.txt", "c");

register_shutdown_function(function () use ($h) {
    fclose($h);
});

flock($h, LOCK_EX);
while (true);

put.php

#!/usr/bin/env php
<?php

$f = __DIR__ . DIRECTORY_SEPARATOR . "lock.txt";

file_put_contents($f, "foo", LOCK_EX);

echo file_get_contents($f) , PHP_EOL;

測試

將兩個腳本放在同一目錄中,然后打開兩個外殼。 在外殼一中執行lock.php並保持打開狀態,在外殼二中執行put.php ,您將看到它正在等待,因為另一個腳本為該文件獲取了獨占寫鎖。 現在回到第一個shell,然后按Ctrl + c放棄執行(您可以關閉該shell)並回到第二個shell。 它應該輸出foo並且腳本應該終止。

重要

對於該文件,未鎖定文件的讀取,如果這是LOCK_SH | LOCK_EX使用flock因為它支持所有操作( LOCK_SH | LOCK_EX )。

SQLite的

PDO SQLite將使您能夠使用簡單的文本文件作為數據庫,並能夠解決諸如鎖定等問題。 如果您需要處理大量文件和數據,請考慮使用它,因為它具有開箱即用所需的所有功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM