2008-11-16 49 views
10

Tôi đang xây dựng một ứng dụng web nhỏ bằng PHP lưu trữ một số thông tin trong một tệp văn bản thuần túy. Tuy nhiên, tệp văn bản này được sử dụng/sửa đổi bởi tất cả người dùng ứng dụng của tôi tại một số thời điểm nhất định và có thể cùng một lúc.Truy cập tệp PHP và đồng thời

Vì vậy, câu hỏi là. Điều gì sẽ là cách tốt nhất để đảm bảo rằng chỉ một người dùng có thể thực hiện thay đổi đối với tệp tại bất kỳ thời điểm cụ thể nào?

Trả lời

19

Bạn nên đặt một khóa trên các tập tin

<?php 

$fp = fopen("/tmp/lock.txt", "w+"); 

if (flock($fp, LOCK_EX)) { // do an exclusive lock 
    fwrite($fp, "Write something here\n"); 
    flock($fp, LOCK_UN); // release the lock 
} else { 
    echo "Couldn't lock the file !"; 
} 

fclose($fp); 

?> 

Hãy nhìn vào các http://www.php.net/flock

10

Đề xuất của tôi là sử dụng SQLite. Nó nhanh, nhẹ, được lưu trữ trong một tệp và có các cơ chế để ngăn việc sửa đổi đồng thời. Trừ khi bạn đang đối phó với một định dạng tập tin từ trước, SQLite là con đường để đi.

2

Một tệp duy nhất cho nhiều người dùng thực sự không nên là chiến lược bạn sử dụng mà tôi không nghĩ - nếu không bạn có thể cần phải triển khai một điểm truy cập duy nhất (toàn cầu) giám sát nếu tệp hiện đang được chỉnh sửa hoặc không phải. Aquire một khóa, làm sửa đổi của bạn, phát hành khóa vv Tôi muốn đi với 'Không ai đề nghị để sử dụng một cơ sở dữ liệu (SQLite nếu bạn không muốn chi phí của một RDBMS đầy đủ decked)

3

Bạn có thể làm một cam kết loại đăng nhập của định dạng, sắp xếp như thế nào wikipedia nào.

Sử dụng cơ sở dữ liệu và mọi thay đổi đã lưu sẽ tạo hàng mới trong cơ sở dữ liệu, làm cho bản ghi trước đó dư thừa, với giá trị gia tăng, sau đó bạn chỉ phải lo lắng về việc nhận khóa bảng trong giai đoạn lưu. Bằng cách đó ít nhất là nếu 2 người đồng thời xảy ra để chỉnh sửa một cái gì đó, cả hai thay đổi sẽ xuất hiện trong lịch sử và bất cứ điều gì một mất ra để chiến tranh cam kết có thể được sao chép vào bản sửa đổi mới. Các tính năng chính:

Bây giờ nếu bạn không muốn sử dụng cơ sở dữ liệu, thì bạn phải lo lắng về việc có tệp kiểm soát sửa đổi sao lưu mọi tệp hiển thị.

Bạn có thể đặt một kiểm soát sửa đổi (GIT/Mercurial/SVN) trên hệ thống tập tin và sau đó tự động hóa các cam kết trong giai đoạn tiết kiệm,

Mã giả:

user->save : 
    getWritelock(); 
    write($file); 
    write_commitmessage($commitmessagefile); # <-- author , comment, etc 
    call "hg commit -l $commitmessagefile $file " ; 
    releaseWriteLock(); 
done. 

Ít nhất theo cách này khi 2 người thực hiện các cam kết quan trọng cùng một lúc, sẽ không bị mất.

Các vấn đề liên quan