2013-02-27 34 views
10

Tôi đang tìm cách triển khai các hoạt động hệ thống tập tin bằng cách sử dụng php với hỗ trợ giao dịch. Giống như nếu tôi đang thực hiện các thao tác như di chuyển, sao chép và xóa bên trong một giao dịch, nếu một trong số đó không thành công, tập lệnh cần hoàn nguyên tất cả các hoạt động đã được thực hiện. Tôi là loại không biết gì và đang tìm kiếm hướng dẫn làm thế nào nó có thể đạt được. Và nếu các thư viện hoặc giải pháp có sẵn tồn tại? Tôi xin lỗi nếu câu hỏi có vẻ mơ hồ.Làm thế nào để thực hiện các hoạt động hệ thống tập tin trong giao dịch với php?

+0

Có thể sử dụng mẫu thiết kế đơn để tạo một thể hiện của đối tượng tạo danh sách các sự kiện được xử lý và hoàn thành và một thuật toán sẽ là đảo ngược của từng sự kiện này (chuyển đổi ví dụ từ <-> thành vị trí). Nếu nó không thành công vì bất kỳ lý do nào thực thi cá thể mà sẽ đảo ngược tất cả các thay đổi được thực hiện. – MaxSan

Trả lời

2

Hệ thống tệp - trái ngược với hệ thống quản lý cơ sở dữ liệu - không hỗ trợ giao dịch. Tuy nhiên một số cung cấp những thứ bạn cần để thực hiện các giao dịch; đó là khóa và đăng nhập. Đăng nhập sẽ không phải là vấn đề của bạn bởi vì bạn có thể làm điều đó trong php, nhưng bạn sẽ cần một hệ thống tập tin cung cấp khóa tập tin.

Tôi khuyên bạn không nên tự mình triển khai bất kỳ thứ gì như thế này - có rất nhiều vấn đề bạn có thể gặp phải. Các cơ sở dữ liệu nhìn lại một lịch sử nghiên cứu trong nhiều thập kỷ, ở đây.

Nhưng nếu bạn phải, bạn có thể (để bắt đầu) thực hiện một cái gì đó như Two-phase locking trong php. Ngoài ra, bạn có thể xem xét sử dụng command pattern, giúp hoàn tác chức năng cho khôi phục của bạn.

3

Một tùy chọn là xem xét lưu trữ tệp của bạn dưới dạng BLOB trong cơ sở dữ liệu, chứ không phải dưới dạng tệp. Chúng sẽ hỗ trợ các giao dịch và tất cả các tính năng khác của cơ sở dữ liệu của bạn.

Có thể hỗ trợ các giao dịch trên hệ thống tệp nâng cao như ZFS, nhưng không trực tiếp với PHP và ZFS không được cài đặt theo mặc định trên Linux.

3

Mẫu phổ biến nhất cho việc này là sao chép mọi thứ sang một nơi khác, thao tác trên bản sao và thay thế bản gốc nếu mọi thứ diễn ra đúng.

Điều gì đó cho tôi biết rằng trình bao bọc luồng PHP cũng có thể hữu ích cho việc này. Có thể ghi đè giao thức 'file: //' và hoạt động trong hệ thống tệp ảo (bằng chứng về khái niệm: https://github.com/Respect/Test#streamwrapper).

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