Bộ sưu tập rác trong php là gì?

Thật thú vị khi chỉ một vài năm có thể tạo ra sự khác biệt trong những cái tên được đặt cho mọi thứ. Nếu điều này xuất hiện ngày hôm nay, nó có thể được gọi là Tùy chọn tái chế PHP, bởi vì thay vì nhặt mọi thứ và ném chúng vào bãi rác nơi chúng sẽ không bao giờ được nhìn thấy nữa, chúng ta thực sự đang nói về việc lấy những thứ đã qua sử dụng và . Tuy nhiên, tái chế không phải là điều nhỏ nhặt của xã hội khi ý tưởng này được phát triển và vì vậy nhiệm vụ này được đặt cho cái tên thô tục là 'Thu gom rác'. Chúng ta có thể làm gì ngoài việc làm theo những gì lịch sử và cách sử dụng phổ biến đã cho chúng ta?

Rác do chương trình tạo ra

Các chương trình sử dụng tài nguyên; . Một ví dụ sẽ là một trường dữ liệu. Một chương trình có thể xác định một trường dữ liệu, chẳng hạn như một số thứ tự, được sử dụng trong chương trình. Và sau khi được xác định, trường dữ liệu này sẽ chiếm dung lượng trong bộ nhớ, có thể chỉ một vài byte, nhưng dù sao cũng là dung lượng. Vì mọi máy hoặc môi trường lập trình đều có một lượng không gian hữu hạn [mặc dù lớn], nên không gian còn lại mà nó còn lại sẽ bị giảm đi bởi lượng không gian mà trường này chiếm

Khi chương trình kết thúc, một cách tự nhiên, chương trình và bất kỳ dung lượng nào mà nó đã kết nối sẽ biến mất và tổng dung lượng có sẵn sẽ mở rộng trở lại kích thước tối đa của nó. Nhưng điều gì xảy ra nếu chương trình không bao giờ kết thúc?

Tôi đã viết một vài trong số những chương trình như vậy trong thời gian của mình. Chúng là những tác phẩm tuyệt đẹp và tôi luôn hài lòng khi những người khác trong cửa hàng nhận thấy rằng tôi đã tạo ra một tác phẩm. Không có gì chứng tỏ khả năng của bạn nhiều bằng việc tự mình làm đứng yên một cục sắt IBM to tướng, trong khi từ các buồng xung quanh hết người này đến người khác nói to, “này, có gì đó không ổn với

Nhưng một số chương trình thậm chí còn được thiết kế để chạy mãi mãi, như daemon và những thứ tương tự khác. Và khi chúng chạy, lượng mảnh vụn chúng tạo ra có khả năng tiếp tục tăng lên. Nếu tài nguyên bị khóa là đáng kể, thì nó có thể có tác động tiêu cực thực sự đến hệ thống của bạn

Do đó, mọi ngôn ngữ phải có cách xóa các tài nguyên mồ côi, cung cấp chúng cho những người dùng khác và đảm bảo rằng tổng dung lượng hệ thống có sẵn không đổi. May mắn thay, PHP có cách tiếp cận ba tầng để loại bỏ rác

Cấp độ đầu tiên – Kết thúc phạm vi

Đầu tiên, giống như hầu hết các ngôn ngữ, bất cứ khi nào một phạm vi hành động kết thúc, mọi thứ trong phạm vi hành động đó sẽ bị hủy và mọi tài nguyên được phân bổ sẽ được giải phóng. Phạm vi hành động có thể bao gồm một chức năng, tập lệnh, phiên, v.v. và khi phạm vi đó kết thúc, mọi thứ mà nó đang nắm giữ cũng vậy. Tất nhiên, bạn luôn có thể giải phóng tài nguyên bất kỳ lúc nào bạn muốn bằng cách sử dụng hàm unset[]

Đây là một lý do tại sao các hàm và phương thức lại rất quan trọng, bởi vì chúng thiết lập một phạm vi hoạt động, khi nào thì việc sử dụng bộ nhớ cụ thể bắt đầu và khi nào nên kết thúc, đồng thời giới hạn khoảng thời gian mọi thứ có thể tồn tại. Chúng nên được sử dụng bất cứ khi nào có thể thay vì các thực thể toàn cầu

Cấp độ thứ hai - Đếm tham chiếu

Thứ hai, giống như hầu hết các ngôn ngữ kịch bản, PHP theo dõi có bao nhiêu thực thể đang sử dụng một biến nhất định bằng một kỹ thuật gọi là đếm tham chiếu

Khi một biến được tạo trong tập lệnh PHP, PHP sẽ tạo một 'vùng chứa' nhỏ được gọi là zval bao gồm giá trị được gán cho biến đó cộng với hai phần thông tin khác. is_ref và đếm lại. Các vùng chứa zval được giữ trong một bảng trong đó có một bảng cho mỗi phạm vi hành động [tập lệnh, hàm, phương thức, bất cứ thứ gì]

is_ref là một giá trị true/false đơn giản cho biết liệu biến có phải là một phần của tập tham chiếu hay không, do đó giúp PHP biết đây là biến đơn giản hay tham chiếu

Số lần đếm lại thú vị hơn ở chỗ nó chứa một giá trị số cho biết có bao nhiêu biến khác nhau đang sử dụng giá trị này. Nghĩa là, nếu bạn xác định biến $dave = 6, thì số đếm lại sẽ được đặt thành 1. Nếu sau đó tôi nói $programmer = $dave, số lần đếm lại sẽ tăng lên 2. PHP biết đủ để không tạo zval thứ hai cho giá trị 6; . Khi chương trình kết thúc hoặc khi chúng ta rời khỏi phạm vi của hàm hoặc khi sử dụng unset[] thì số lần đếm lại này sẽ bị giảm đi. Khi số lần truy cập về 0, zval bị hủy và bất kỳ bộ nhớ nào mà nó đang giữ đều miễn phí

Tất nhiên, đây là một ví dụ đơn giản cho một biến đơn giản. Khi bạn đang nói về mảng hoặc đối tượng thì sẽ phức tạp hơn nhiều khi có nhiều zrefs được tạo cho nhiều giá trị cho một phần tử trong một mảng, nhưng quá trình xử lý cơ bản là như nhau

Tuy nhiên, sẽ xảy ra sự cố nếu chúng ta sử dụng một mảng trong một mảng khác, điều gì đó sẽ xảy ra với tần suất nhất định trong các tập lệnh PHP phức tạp hơn. Trong trường hợp này, số đếm lại cho một giá trị mảng được đặt thành 1 khi giá trị mảng ban đầu được đặt, sau đó tăng lên 2 khi mảng được liên kết với một mảng khác. Nếu hết phạm vi sử dụng của mảng thứ 2 thì số lần đếm giảm đi 1. Bây giờ chúng ta đang ở trong tình huống mà bản thân giá trị không còn được liên kết với bất kỳ thứ gì, nhưng vùng chứa [zval] đại diện cho nó vẫn có số lượng truy cập lớn hơn 0

Kết quả cuối cùng là dung lượng lưu trữ được đại diện bởi mảng ban đầu sẽ không được giải phóng và dung lượng bộ nhớ đó hiện không có sẵn để sử dụng bởi bất kỳ thứ gì. Thông thường, chúng tôi cho rằng dung lượng lưu trữ bị mất này là nhỏ, nhưng thường thì không phải vậy. Mảng có thể là những thứ rất lớn ngày nay và nó đặc biệt có vấn đề nếu tập lệnh xảy ra điều này là một daemon hoặc một chức năng gần như chạy liên tục khác. Trong trường hợp này, kết quả là 'rò rỉ bộ nhớ' có thể gây ra hậu quả nghiêm trọng đối với hiệu suất và thậm chí cả khả năng hoạt động của máy chủ

Cấp độ thứ ba – Thu gom rác chính thức

Rõ ràng, việc xóa định hướng đếm tham chiếu có những hạn chế của chúng nhưng may mắn thay, PHP 5. 3 đưa ra một lựa chọn khác để giải quyết tình huống này

Tình huống cụ thể mà chúng tôi muốn chu kỳ rác của mình giải quyết là trường hợp zval đã bị giảm, nhưng nó vẫn là một giá trị khác không. Về cơ bản, chu kỳ xem giá trị nào có thể giảm hơn nữa và sau đó giải phóng giá trị về 0

Điều thực sự xảy ra là PHP theo dõi tất cả các bộ chứa gốc [zvals]. Việc này được thực hiện cho dù bộ sưu tập rác có được bật hay không [vì nó chỉ làm điều đó nhanh hơn thay vì hỏi xem bộ sưu tập rác có được bật hay không, yada, yada, yada]. Bộ đệm gốc này chứa tới 10.000 gốc [kích thước cố định, nhưng điều này có thể thay đổi]. Khi đầy, cơ chế thu gom rác sẽ khởi động và nó sẽ bắt đầu phân tích bộ đệm này

Điều đầu tiên mà thủ tục GC thực hiện là trích xuất bộ đệm gốc và giảm tất cả số lượng zval đi 1. Khi làm điều này, nó đánh dấu mỗi cái bằng một dấu kiểm giống như vậy để nó chỉ giảm một gốc một lần

Sau đó, nó đi qua một lần nữa và đánh dấu [lần này với một đường nguệch ngoạc nhỏ] tất cả các zval có số lần giảm bằng 0. Những cái khác không được tăng lên để chúng tiếp tục các giá trị ban đầu của chúng

Cuối cùng, nó sẽ cuộn qua đó một lần nữa, xóa các zval khác 0 khỏi bộ đệm và giải phóng bộ nhớ cho những zval có số lần truy cập bằng 0

Bộ sưu tập rác luôn được bật trong PHP, nhưng bạn có thể tắt nó trong tệp php.ini bằng lệnh zend.enable_gc. Hoặc, bạn có thể làm điều đó trong tập lệnh của mình bằng cách gọi các hàm gc_enable[]gc_disable[]

Như đã lưu ý ở trên, bộ sưu tập rác, nếu được bật, sẽ chạy khi thư mục gốc đầy, nhưng bạn có thể ghi đè lên bộ sưu tập này và chạy bộ sưu tập khi bạn cảm thấy thích với hàm gc_collect_cycles[]. Và, bạn có thể sửa đổi kích thước của bộ đệm gốc với giá trị gc_root_buffer_max_entries trong giá trị $dave = 60 trong mã nguồn PHP

Nói chung, điều này cho phép bạn kiểm soát xem GC có chạy hay không, khi nào và nó có chạy hay không, đây là một điều tốt vì nó hơi tốn tài nguyên và vì vậy có thể không phải là thứ bạn chạy chỉ vì nó.

Khi nào bạn nên sử dụng nó

Bởi vì có một điểm nhấn về hiệu suất gắn liền với bộ sưu tập rác, nên đáng để dành một phút để tìm ra khi nào nên sử dụng nó

Trước tiên, hãy nhớ rằng trừ khi bạn chạy nó một cách công khai [với chức năng gc_collect_cycles[]], việc thu gom rác chính thức sẽ không xảy ra cho đến khi bảng gốc [10.000 mục nhập] đầy và vì bảng này ở mức phạm vi nên điều đó không

Bạn có nên sử dụng nó trên các tập lệnh nhỏ không? . Thật khó để nói rằng việc chạy thứ gì đó như thu gom rác là một điều xấu, nhưng nếu bạn có các tập lệnh nhỏ, chạy nhanh, bắt đầu rồi kết thúc và biến mất thì có thể không thu được nhiều lợi nhuận. Nhưng nếu máy chủ của bạn đang chạy nhiều tập lệnh nhỏ liên tục hoạt động, thì có lẽ nó sẽ đáng để bạn nỗ lực. Cách thực sự duy nhất để biết là đánh giá ứng dụng của bạn và xem. Và chắc chắn, nếu bạn có các tập lệnh chạy dài hoặc đặc biệt là các tập lệnh không kết thúc, thì việc thu gom rác là điều cần thiết nếu bạn muốn ngăn chặn kiểu rò rỉ bộ nhớ mà chúng ta đã đề cập ở trên

Có lẽ quan trọng nhất, chúng ta phải luôn cố gắng tuân theo các nguyên tắc lập trình tốt để giảm thiểu hoặc loại bỏ các biến toàn cục và thay vào đó buộc các biến của chúng ta vào phạm vi, để ngay cả khi chúng ta có một tập lệnh chạy dài, chúng ta vẫn giải phóng bộ nhớ đó khi hàm, đúng hơn là . Ngoài ra, hãy lưu ý khi bạn đang sử dụng mảng trong mảng hoặc đối tượng tham chiếu đối tượng, vì những tình huống như vậy có thể gây rò rỉ bộ nhớ và là mục tiêu thực sự của quy trình thu gom rác chính thức

Hình ảnh qua Fotolia

Chia sẻ bài viết này

David Shirey

Dave Shirey là chủ sở hữu của Dịch vụ tư vấn Shirey cung cấp dịch vụ quản lý dự án kinh doanh và kỹ thuật, thiết lập và hỗ trợ EDI cũng như các dịch vụ kỹ thuật khác nhau cho thế giới máy tính lớn, tầm trung và máy tính để bàn. Ngoài PHP Master, anh còn viết bài thường xuyên cho MC Press và Pro Developer [trước đây là System iNews]. Khi rảnh rỗi, anh ấy có xu hướng lo lắng mơ hồ về tương lai và tự hỏi một cách ám ảnh rằng cuộc sống của mình có thể khác biết bao nếu anh ấy vừa hoàn thành cuốn tiểu thuyết đầu tiên đó khi vừa tốt nghiệp đại học

thu gom rác giải thích là gì?

Thu gom rác [GC] là tính năng khôi phục bộ nhớ được tích hợp trong các ngôn ngữ lập trình như C# và Java . Ngôn ngữ lập trình hỗ trợ GC bao gồm một hoặc nhiều bộ thu gom rác [công cụ GC] tự động giải phóng không gian bộ nhớ đã được cấp phát cho các đối tượng mà chương trình không cần nữa.

Bộ sưu tập rác với ví dụ là gì?

Thu gom rác trong Java là quá trình mà các chương trình Java thực hiện quản lý bộ nhớ tự động . Các chương trình Java biên dịch thành mã byte có thể chạy trên Máy ảo Java hoặc viết tắt là JVM. Khi các chương trình Java chạy trên JVM, các đối tượng được tạo trên heap, đây là một phần bộ nhớ dành riêng cho chương trình.

Phương thức nào được gọi bởi bộ sưu tập rác?

Phương thức finalize[] trong Java là một phương thức của lớp Object được sử dụng để thực hiện hoạt động dọn dẹp trước khi hủy bất kỳ đối tượng nào. Nó được gọi bởi Trình thu gom rác trước khi hủy các đối tượng khỏi bộ nhớ. phương thức finalize[] được gọi theo mặc định cho mọi đối tượng trước khi xóa

Bộ sưu tập rác trong cơ sở dữ liệu là gì?

Thu gom rác là quy trình vệ sinh được thiết kế để giải phóng dung lượng trong cơ sở dữ liệu Active Directory . Quá trình này chạy trên mọi bộ điều khiển miền trong doanh nghiệp với khoảng thời gian tồn tại mặc định là 12 giờ.

Chủ Đề