2011-06-20 37 views
30

Điều gì là tốt hơn? Tôi có bản ghi MySQL của riêng mình vì vậy nó có khoảng 90MB, nhưng tôi không chắc mình nên dùng cái nào. Nó mở file EVERYTIME có truy vấn để thực thi.Có gì nhanh hơn? file_put_contents(); fopen(); fwrite(); fclose() ;?

Điều gì nhanh hơn?

+4

Chạy điểm chuẩn của riêng bạn. Tôi chắc rằng nó không mất nhiều giờ để mở một tập tin 90 MB. – BoltClock

+0

không. Đó là vấn đề, tôi đang ở trên máy chủ chia sẻ và nó đang được sản xuất nên tôi không thể "thử nghiệm" nó được. – genesis

+0

Bạn có thể thử nghiệm trên máy phát triển địa phương của mình. – KingCrunch

Trả lời

35

Theo this article, fwrite() là smidgen nhanh hơn. (Link để Wayback Machine, vì trang web không còn tồn tại.)

đoán của tôi là file_put_contents() chỉ là một wrapper xung quanh những ba phương pháp anyways, vì vậy bạn sẽ mất chi phí.

EDIT: This site có cùng thông tin.

+0

-1 Làm thế nào điều này thậm chí có thể là câu trả lời chỉ đề cập đến một trang web không còn tồn tại - bạn có thể trích dẫn trang web hoặc các bài viết tham khảo từ nó - downvote – TheBlackBenzKid

+0

Er, trang web đã tồn tại một năm trước. Tôi có lẽ nên thay đổi điều gì đó gần đây hơn. – hwrdprkns

+1

Bài viết gốc vẫn có thể được nhìn thấy trên Máy Wayback: http://web.archive.org/web/20100109103851/http://balancedbraces.com/2008/06/12/fopen-fwrite-fclose-vs-file_put_contents/ –

5

Như thường lệ, bạn đã đo điểm chuẩn chưa? Về cơ bản, file_put_contents chỉ là một trình bao bọc xung quanh các cuộc gọi 3 f*(), vì vậy, hầu hết bạn sẽ bị mất bằng cách thực hiện một cuộc gọi hàm bổ sung, nhưng tăng phần nào bằng cách có ít mã front-end hơn để phân tích cú pháp.

22

Chức năng này giống hệt như gọi hàm fopen(), fwrite() và fclose() liên tiếp để ghi dữ liệu vào tệp.

Kiểm tra các tài liệu: http://php.net/manual/en/function.file-put-contents.php

Shaun

+0

http://www.php.net/downloads.php bạn cũng có thể lấy nguồn để có được gritty nitty dưới mui xe, nên giúp trả lời các loại câu hỏi. – shaunhusain

+1

Tôi nhìn vào nguồn một số chi tiết, có vẻ như fwrite trực tiếp sử dụng php_stream_write từ stream.c, miễn là bạn không sử dụng bất kỳ tính năng zend nào gọi hàm file_put_contents cũng sẽ cuối cùng (sau khi thực hiện một vài kiểm tra cho cờ Zend) gọi php_stream_write, giống như những người khác đã nói thử nghiệm này (ngay cả khi không sản xuất nhưng trên một hộp kiểm tra) là cách tốt nhất để trả lời câu hỏi và sẽ thay đổi cho các tình huống cụ thể. – shaunhusain

8

Phụ thuộc vào use-case của bạn. Tôi đã mở các tệp có dung lượng lớn hơn 0,5 GB và tôi chắc chắn không muốn sử dụng tệp() hoặc file_get_contents(); Và file_put_contents không thể làm việc vì tôi cũng cần đọc tệp.

Nếu bạn thực sự chỉ quan tâm đến việc thêm một tệp mà không đọc, điều đó không quá quan trọng; nếu bạn đang cố gắng đọc toàn bộ tập tin vào bộ nhớ (hoặc viết toàn bộ tập tin từ bộ nhớ), nó cũng không thực sự quan trọng - tốc độ tăng, gần như tôi đã thấy, là lỗi tròn. NHƯNG, nếu bạn mong đợi các tệp này sẽ phát triển thành những con thú khổng lồ, hoặc nếu bạn chỉ cần một tập con nhỏ số dòng của một tệp nhất định, tôi không thể đề xuất sử dụng fopen (hoặc SplFileObject, mà là TUYỆT VỜI) đủ mạnh - nó thực sự dễ dàng để đọc từ giữa một tập tin với những.


Vì bạn chỉ cần đăng nhập, mặt khác, cá nhân tôi, tìm thấy nó rõ ràng hơn và ngắn gọn hơn để chỉ sử dụng file_put_contents với cờ gắn thêm. Nó cho phép mọi người biết những gì đang xảy ra mà không cần phải nhìn hai lần.

+0

được, cảm ơn. Howver tôi chỉ viết với kịch bản của tôi – genesis

+0

@genesis. Rất tiếc, tôi đang gặp sự cố với máy tính của mình hôm nay (Có thể có liên quan đến việc thanh toán SVN lớn đang diễn ra, nhưng bất kỳ điều gì) và tôi không thể nhận được phụ lục đó trước khi bạn xem. – cwallenpoole

6
  1. Nếu chỉ có một thao tác ghi cho một tệp trong yêu cầu, tệp_put_contents tốt hơn fwrite, vì nó đã bao bọc các chức năng mở, viết và đóng và nhanh như fwrite.
  2. Nếu có nhiều ghi cho một tệp trong một yêu cầu, chúng tôi cần mở tệp trước, sau đó viết nhiều lần, vì vậy fwrite nhanh hơn. Nhưng, nếu nó là một hệ thống rất bận rộn, trong đó có rất nhiều "tập tin mở" (ulimit -a | grep "mở tập tin"), file_put_contents sẽ là một lựa chọn hợp lý hơn, bởi vì nó giữ cho trình xử lý tệp ngắn hơn fwrite.
Các vấn đề liên quan