2012-05-04 42 views
6

Chúng tôi có một máy chủ FreeBSD với samba mà nhân viên sao chép tập tin hình ảnh vào, sau đó được tải lên máy chủ web của chúng tôi (theo cách này họ không phải gây rối với ftp). Đôi khi, nếu tập lệnh tải lên đang chạy cùng lúc với các tệp đang được sao chép, tập lệnh đó có thể tải lên tệp không hoàn chỉnh.Có cách nào tốt hơn để xem liệu tệp có đang được ghi vào không?

Chúng tôi đã sửa lỗi này bằng cách lấy danh sách tệp cùng với kích thước tệp, sau đó chờ 5 giây và kiểm tra lại kích thước tệp. Nếu kích thước phù hợp thì lưu của nó sẽ được tải lên, nếu chúng không khớp với nó sẽ kiểm tra lại sau 5 giây nữa.

Điều này có vẻ giống như một cách kỳ lạ để kiểm tra xem tệp có đang được ghi vào hay không. có cách nào tốt hơn, đơn giản hơn để làm điều này?

+0

'if (! Flock ($ fp, LOCK_EX | LOCK_NB)) {// tệp bị khóa để ghi'? – DaveRandom

+0

'flock()' có thể? –

+0

không chắc chắn nếu 'flock()' và ổ khóa của samab sẽ nhìn thấy nhau một cách đáng tin cậy - có một số vấn đề có năm trước –

Trả lời

2

Sử dụng một flock chức năng http://php.net/flock - khi viết một tập tin có được một khóa độc quyền flock($handle, LOCK_EX), sau khi nó được viết ra mắt khóa flock($handle, LOCK_UN).

Tập lệnh tải lên cũng có thể cố gắng lấy khóa viết độc quyền, nếu thành công thì OK để di chuyển tệp, nếu không thì không.

EDIT: Xin lỗi, tôi quên về người dùng sao chép các tập tin đến máy chủ thông qua samba ... Vì vậy, không có không gian để sử dụng flock khi sao chép ... Nhưng kịch bản tải lên vẫn có thể sử dụng flock($handle, LOCK_EX) để xem, nếu nó thành công hay không.

2

Tôi khuyên bạn nên sử dụng shell_exec() smbstatus (1), ví dụ: smbstatus -LB để kiểm tra các tệp bị khóa

0

Viết tập lệnh để sao chép tệp vào thư mục tạm thời trên máy chủ Samba và sau đó, khi được sao chép và xóa hoàn toàn, di chuyển, (nghĩa là hủy liên kết/liên kết, không sao chép lại), thư mục tải lên.

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