2010-07-21 29 views
7

Tôi có câu hỏi về cách PHP xử lý các hoạt động của hệ thống tệp. Tôi đang chạy mã này phụ thuộc vào một tệp được tạo trước khi nó được sử dụng, và nó cảm thấy như khi tôi chạy mã nó trở thành một điều kiện chủng tộc - đôi khi nó hoạt động, tệp được tạo và mã php sử dụng nó, đôi khi nó không thành công.PHP có đợi các hoạt động của hệ thống tập tin (như file_put_contents) hoàn thành trước khi tiếp tục không?

Vì vậy, tôi đã tự hỏi làm thế nào php xử lý các hoạt động hệ thống tập tin, nó gửi nó ở chế độ nền hay nó đợi cho đến khi hoạt động hoàn tất?

+2

'chặn' là cụm từ bạn quan tâm. Việc chặn hoạt động khiến chương trình của bạn phải chờ (hoặc 'chặn') cho đến khi chúng hoàn tất. Các hoạt động không bị chặn hoặc không đồng bộ là những hoạt động được gửi 'off to the background' :) – meagar

Trả lời

6

Có, trừ khi bạn mở một tập tin xử lý và sau đó đặt nó là non-blocking mode: stream_set_blocking()

+2

Điều này thực sự không đúng sự thật. Nếu bạn mở và chỉ đơn giản là (f) ghi vào nó, dữ liệu không được ghi vào đĩa. Nếu fwrite sử dụng hàm fwrite C, với cơ hội cao, dữ liệu thậm chí không đạt được hệ điều hành. Như @Matthew Flaschen đã chỉ ra, dữ liệu chỉ được flushed vào đĩa trong fclose và fflush. – dmeister

+0

@ircmaxell, Trả lời nhu cầu xây dựng. – Pacerier

3

PHP nên đợi cho đến khi quá trình hoàn tất. Nhưng không biết làm thế nào bạn đang thực hiện các hoạt động rất khó để nói. Nếu bạn có thể đăng một mã ví dụ mà bạn đang sử dụng sẽ hữu ích để chúng tôi có thể giúp bạn tìm ra lý do tại sao mã không hoạt động đúng cách.

+0

nên, nhưng có vẻ không đúng sự thật. Tôi chỉ có vấn đề mà các tập tin có vẻ chưa được viết đầy đủ trước khi một bộ mã chạy để xử lý chúng gây ra vấn đề lạ –

8

file_put_contents tương đương với fopen, fwrite, fclose. fclose phải đảm bảo tệp được xả hoàn toàn vào đĩa.

+3

Trên thực tế, cách duy nhất để biết chắc chắn rằng tệp đã được xả hoàn toàn vào đĩa là tắt bộ nhớ đệm ghi đè trên các ổ đĩa. Nếu không, tất cả các bạn có thể nói là hệ thống tập tin đã ban hành lệnh ghi, không phải là ghi thực sự đã cam kết thành công vào đĩa ... – ircmaxell

+0

Cờ 'LOCK_EX' có giải quyết được điều này không? http://php.net/manual/en/function.file-put-contents.php – martin

2

Năm 2013, trên vps Linux vườn phổ biến của tôi với cPanel, với cài đặt mặc định, với php 5.2.17, file_put_contents luôn mất ~ 5ms cho độ dài chuỗi ngắn.

Vô tình 5ms là về thời gian ghi cam kết đầy đủ của một hdd chất lượng cao.

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND); 

Điều này cần ~ 5ms nhất quán. Điều đó dường như bao gồm 'chặn' và 'đỏ bừng'. Vì vậy, đối với những người tự hỏi về tốc độ của file_put_contents, ít nhất là 5ms/hoạt động trên các máy chủ thông thường 2013 04.

Nếu bạn cần tốc độ, ví dụ đối với một số khai thác gỗ, @Matthew Flaschen nói:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk. 

Rồi một nhu cầu :

function file_put_contents_fast() {...no fclose...} 

Nhưng sẽ có một số nghiên cứu để tìm hiểu xem điều gì sẽ xảy ra nếu xử lý tệp được mở. Php closes them at exit, nhưng nó thực sự làm như vậy tất cả các thời gian? Ngay cả khi nó bị treo? Điều gì sẽ xảy ra nếu một tập tin được mở bởi php sau một vụ tai nạn? vv vv Sau 30 phút đọc sách hướng dẫn sử dụng php và googling, không có đề cập đến như vậy và hậu quả của nó.

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