2014-10-10 15 views
6

Tôi chạy PHP qua FCGI - đó là máy chủ web của tôi sinh ra một số quy trình PHP và chúng tiếp tục chạy cho 10.000 yêu cầu cho đến khi chúng được tái chế.

Câu hỏi của tôi là - nếu tôi có số $mysqli->connect ở đầu tập lệnh PHP, tôi có cần gọi số $mysqli->close khi tôi sắp kết thúc chạy tập lệnh không?

Vì quá trình PHP mở trong một thời gian dài, tôi muốn hình ảnh mỗi $mysqli->connect sẽ bị rò rỉ 1 kết nối, bởi vì quá trình tiếp tục chạy và không ai đóng kết nối.

Tôi có đúng trong suy nghĩ của mình hay không? Tôi có nên gọi $mysqli->close?

Trả lời

7

Khi thoát PHP, nó đóng các kết nối cơ sở dữ liệu một cách duyên dáng.

Lý do duy nhất để sử dụng phương pháp đóng là khi bạn muốn kết thúc kết nối cơ sở dữ liệu mà bạn không còn sử dụng nữa và bạn có rất nhiều việc cần làm: như xử lý và truyền dữ liệu. , bạn có thể quên đi câu lệnh đóng.

Đặt mã vào cuối tập lệnh nghĩa là dự phòng, không có hiệu suất hoặc tăng bộ nhớ.

+0

có, nhưng PHP không thoát trong trường hợp của tôi. Máy chủ web sinh ra chúng và sau đó tiếp tục đẩy chúng những thứ để chạy mà không làm cho quá trình thoát ra. Các quy trình vẫn mở cho 10.000 yêu cầu. (Ít nhất đó là những gì tôi hiểu bởi FCGI.) – bodacydo

+0

Theo như tôi có thể nghĩ, GC sẽ xóa chúng ra. Quá trình sẽ không thoát nhưng bộ nhớ phải được xóa giữa các lần thực thi tập lệnh. Nếu không, nó sẽ là một vấn đề an ninh thực sự vì các biến công cộng, vv sẽ nằm trong phạm vi. –

3

Chi tiết hơn một chút, đặc biệt về FastCGI:

FastCGI giữ cho việc xử lý PHP chạy giữa các yêu cầu. FastCGI rất hữu ích trong việc giảm mức sử dụng CPU bằng cách tận dụng RAM sẵn có của máy chủ để giữ cho các tập lệnh PHP trong bộ nhớ thay vì phải bắt đầu một tiến trình PHP riêng biệt cho mỗi và mọi yêu cầu PHP.

2

Tôi chưa bao giờ tin tưởng FCGI đóng các kết nối cơ sở dữ liệu của mình cho tôi. Một thói quen tôi học được trong một cuốn sách mới bắt đầu từ nhiều năm trước là luôn đóng kết nối cơ sở dữ liệu một cách rõ ràng.

Không nhập 16 lần nhấn phím có giá trị cho bộ nhớ có thể và rò rỉ kết nối không? Theo như tôi quan tâm bảo hiểm giá rẻ của nó.

+0

Tại sao một downvote? Tôi bán bảo hiểm, phải không? –

3

FastCGI sẽ bắt đầu quy trình tổng thể và càng nhiều nhánh của quy trình tổng thể đó như bạn đã xác định và có những quy trình chia đôi đó có thể tồn tại trong một thời gian dài. Điều này có nghĩa là quá trình này không bắt đầu quá trình PHP hoàn chỉnh mỗi lần nó cần thực thi một kịch bản lệnh. Nhưng nó không giống như bạn nghĩ rằng kịch bản của bạn đang chạy tất cả các thời gian. Vẫn còn một giai đoạn khởi động và tắt máy mỗi lần một tập lệnh phải được thực thi. Tại thời điểm này, những thứ như biến toàn cầu (ví dụ: $_POST$_GET) được điền vào, v.v. Bạn có thể thực thi các chức năng mỗi lần quy trình của bạn tắt qua register_shutdown_function().

Nếu bạn không sử dụng kết nối cơ sở dữ liệu liên tục và không đóng kết nối cơ sở dữ liệu, không có gì xấu xảy ra. Như Colin Schoen đã giải thích, PHP cuối cùng sẽ đóng chúng trong khi tắt máy.

Tuy nhiên, tôi cao khuyến khích bạn đóng kết nối vì chương trình được tạo thủ công chính xác biết thời điểm tồn tại của đối tượng kết thúc và tự dọn dẹp. Nó có thể cung cấp cho bạn chính xác milli hoặc nano giây mà bạn cần để cung cấp một cái gì đó trong thời gian.

Chỉ cần luôn tạo tạo các đối tượng độc lập cũng được dọn dẹp sau khi hoàn thành bất kỳ thứ gì họ đã làm.

2

Nếu bạn có các quy trình FastCGI chạy dài, ví dụ: php-fpm, bạn có thể đạt được hiệu suất bằng cách tái sử dụng kết nối cơ sở dữ liệu của bạn bên trong mỗi quá trình và tránh chi phí mở một.

Vì bạn có nhiều khả năng mở kết nối tại một số điểm trong mã của mình, bạn nên đọc về cách mở mysqli kết nối liên tục và gửi lại cho bạn về các yêu cầu tiếp theo được quản lý bởi cùng một quy trình.

http://php.net/manual/en/mysqli.quickstart.connections.php

http://php.net/manual/en/mysqli.persistconns.php

Trong trường hợp này bạn không muốn để đóng kết nối, nếu không bạn đang đánh bại mục đích của việc giữ nó mở. Ngoài ra, lưu ý rằng mỗi tiến trình PHP sẽ sử dụng một kết nối riêng biệt để cơ sở dữ liệu của bạn nên cho phép ít nhất số lượng kết nối đó được mở cùng một lúc.

1

Bạn đang ở trong tư duy của mình. Nó vẫn còn quan trọng để đóng kết nối để ngăn chặn rò rỉ bộ nhớ/dữ liệu và tham nhũng.

Bạn cũng có thể giảm lượng scipts được tái chế từng chu kỳ, để dừng kết nối gần.

Ví dụ: mỗi 2500 tập lệnh chạy, dừng và đóng và mở lại kết nối.

Cũng được đề nghị: sao lưu dữ liệu thường xuyên.

Hy vọng tôi đã giúp. Phantom

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