2012-05-29 26 views
5

Đọc đồng thời các tệp phẳng gần như không giới hạn (sửa tôi nếu tôi sai); nhưng làm thế nào là đồng thời để viết? Hãy xem xét một bản ghi truy cập đơn giản bằng văn bản (đối với lần) trong PHP như để thêm một dòng chi tiết truy cập kết thúc với \nCách LOCK hoạt động để ghi nhật ký vào tệp phẳng?

fopen(); // in append mode 
fwrite(); 
fclose(); 

Kể từ khi chúng tôi có khách truy cập đồng thời, cách hệ thống (một người sử dụng đó là sử dụng wbserver/php) viết nhật ký xem đồng thời?

Sự nhầm lẫn của tôi là: hàm file_put_contents() (là một trình bao bọc của ba hàm trên) có tùy chọn khóa (LOCK_EX)? Có lợi khi sử dụng tùy chọn khóa này không? Làm thế nào điều này sẽ ảnh hưởng đến việc viết nhật ký?

CẬP NHẬT: Câu hỏi của tôi là về cách LOCK ing ban đầu hoạt động/ảnh hưởng đến việc ghi nhật ký vào tệp. Tôi không so sánh file_put_contentsfwrite; ngay cả câu hỏi của tôi không giới hạn ở PHP. Câu hỏi đặt ra là khóa một tập tin trong quá trình ghi.

+0

'file_put_contents() 'không có một lựa chọn cho khóa, đánh dấu vào [tay] (http://php.net/manual/en/function.file-put-contents.php). – yannis

+0

@YannisRizos Như tôi đã trích dẫn trong câu hỏi ban đầu, tôi biết rằng 'file_put_contents' có' LOCK_EX'. Câu hỏi của tôi là làm thế nào nó ảnh hưởng đến việc viết một bản ghi truy cập. – Googlebot

+0

Vâng, bạn nói đúng, rõ ràng là bình luận của tôi là cho lần sửa đổi thứ hai của câu hỏi. Chỉnh sửa không đúng, cái đó. – yannis

Trả lời

3

file_put_contents() không có tùy chọn khóa, nhưng theo ý kiến ​​của tôi, bạn nên sử dụng flock() để thay thế.

Từ thủ công:

cờ sẵn

FILE_USE_INCLUDE_PATH
Tìm kiếm tên tập tin trong thư mục bao gồm. Xem include_path để biết thêm thông tin .

FILE_APPEND Nếu tên tệp đã tồn tại, hãy thêm dữ liệu vào tệp thay vì ghi đè lên tệp.

LOCK_EX Có được khóa độc quyền trên tệp trong khi tiếp tục viết.

flock() phép bạn sử dụng các phương pháp khác:

LOCK_SH để có được một khóa chia sẻ (reader).
LOCK_EX để mua khóa độc quyền (tác giả).
LOCK_UN để nhả khóa (được chia sẻ hoặc độc quyền).

Xem ở đây: http://php.net/manual/en/function.flock.php và ở đây: http://php.net/manual/en/function.file-put-contents.php

0

Được cảnh báo, tập tin khóa cho các bản ghi truy cập là một môi trường mà có thể dễ dàng đưa ra một điều kiện chủng tộc. có lẽ nhìn vào một phương pháp khác? đăng nhập vào cơ sở dữ liệu, có thể? Nó quá dễ dàng cho một hệ thống được thiết kế tốt để cố gắng mở và ghi vào nhật ký cùng một lúc với các quá trình song song.

Có thể hãy xem monolog?có một số trình xử lý ghi nhật ký trong đó để ghi nhật ký không đồng bộ, điều này lý tưởng cho mọi việc cần làm với ghi nhật ký truy cập.

https://github.com/Seldaek/monolog

+0

Rất vui khi biết về 'monolog'; nhưng đây là nhật ký truy cập tùy chỉnh, không phải là nhật ký hệ thống. Nó có thể chứa thông tin từ phiên, cookie, đăng nhập thành viên, vv Ngoài ra, câu hỏi của tôi là nói chung để ghi vào đĩa. – Googlebot

+0

@Ali Bạn cần phải rất cẩn thận sau đó nếu nó sẽ được nối với bất cứ điều gì trò chuyện; thường xuyên hơn bạn sẽ được ghi lại dữ liệu, cao hơn cơ hội có mã của bạn đi để gắn vào nhật ký chỉ để có nó nhấn khóa tập tin và không thể đăng nhập. Trong trường hợp này, bạn cần đăng nhập vào một thứ gì đó trên SSD (tốc độ ghi nhanh, nhưng không có phần cứng máy chủ), ramdisk (viết nhanh nhưng không ổn định; mất nguồn và dữ liệu bị mất) hoặc bạn có thể đăng nhập một đĩa spinny và qua các ngón tay của bạn và hy vọng rằng không có gì bị khóa tập tin bằng văn bản vào nhật ký. – damianb

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