Số lượt truy cập trong PHP là gì?

omgzui

Làm theo

Ngày 6 tháng 8 năm 2022

·

5 phút đọc

·

Chỉ dành cho thành viên

Cơ chế thu gom rác PHP dễ hiểu

Ảnh của zhang kaiyv trên Unsplashnhững điều cơ bản về đếm tham chiếu
  • Mỗi biến PHP được lưu trữ trong một vùng chứa biến có tên là zval
  • Một bộ chứa biến zval, ngoài loại và giá trị của biến, còn chứa hai byte thông tin bổ sung
  • Đầu tiên là is_ref, là một giá trị bool xác định xem biến…

Nhờ PHP là một ngôn ngữ được thông dịch và nó có bộ thu gom rác, các nhà phát triển PHP thường không phải suy nghĩ về việc quản lý bộ nhớ. Không giống như các nhà phát triển trong các ngôn ngữ được biên dịch, chẳng hạn như C/C++, chúng tôi không phải suy nghĩ nhiều về việc phân bổ và giải phóng bộ nhớ

Tuy nhiên, sẽ rất hữu ích nếu bạn có hiểu biết rộng về cách hoạt động của bộ sưu tập rác trong PHP, cùng với cách bạn có thể tương tác với nó để bạn có thể tạo các ứng dụng có hiệu suất cao

Trong bài viết này, chúng tôi sẽ đề cập đến hai điều

  • Khái niệm cơ bản về cách hoạt động của bộ sưu tập rác trong PHP
  • Giới thiệu về một số chức năng có sẵn để tương tác với nó

Đến cuối bài viết, bạn sẽ có thể hiểu rõ hơn việc thu gom rác ảnh hưởng đến ứng dụng của bạn như thế nào

Bộ sưu tập rác hoạt động như thế nào trong PHP?

Bộ sưu tập rác của PHP hoạt động theo ba cách

  • Các biến nằm ngoài phạm vi
  • Đếm tham chiếu
  • Thu gom rác thải

Biến nằm ngoài phạm vi

Nếu một biến nằm ngoài phạm vi và không được sử dụng ở bất kỳ nơi nào khác, thì nó sẽ tự động được thu gom rác. Tuy nhiên, quá trình này có thể được gọi thủ công bằng cách sử dụng unset[]. Trong ví dụ dưới đây

  • $foo sẽ được tự động thu gom rác ngay sau khi display_var[] hoàn thành việc thực thi;
  • $user sẽ được thu gom rác vì nó đã bị xóa qua unset[]
0 được khởi tạo thành “giá trị“, và sau đó 
1 được khởi tạo trỏ đến 
2

Khi

2 được khởi tạo lần đầu, nó có một tham chiếu, phạm vi hiện tại. Khi 
1 được khởi tạo để trỏ đến 
2, thì có 2 tham chiếu đến 
2. Nếu tại một thời điểm nào đó, 
1 bị xóa, thì 
2 sẽ đủ điều kiện được thu gom rác

Để xem có bao nhiêu tham chiếu được lưu trữ cho

2, trong đoạn mã trên, bạn có thể gọi 
a: [refcount=1, is_ref=0]='value' 
0, giả sử rằng bạn đã cài đặt Xdebug. Sử dụng ví dụ trên, bạn sẽ thấy đầu ra sau

a: [refcount=1, is_ref=0]='value' 

Nếu một biến là một phần của tham chiếu tuần hoàn, e. g. , trong đó

2 trỏ đến 
1 và 
1 trở lại 
2, thì biến chỉ có thể được dọn sạch bởi trình thu gom rác của PHP. Trình thu gom rác được kích hoạt bất cứ khi nào có 10.000 đối tượng hoặc mảng tuần hoàn có thể có trong bộ nhớ và một trong số chúng nằm ngoài phạm vi

Trình thu thập được bật theo mặc định trong mọi yêu cầu. Và đây, nói chung là một điều tốt. Tuy nhiên, vì đây là một quy trình chạy nên nó yêu cầu các chu kỳ và tài nguyên tính toán, không thể dành cho ứng dụng của bạn. Vì vậy, nếu ứng dụng của bạn rất nhạy cảm với thời gian, có thể cần phải tắt nó, nếu chỉ trong thời gian ngắn

Nó có thể bị vô hiệu hóa theo hai cách

  1. Bằng cách gọi gc_disable
  2. Bằng cách đặt
    a: [refcount=1, is_ref=0]='value' 
    5 thành
    a: [refcount=1, is_ref=0]='value' 
    6

Ngoài ra, nếu bạn gọi hàm gc_collect_cycles, thì bộ sưu tập rác sẽ được kích hoạt ngay cả khi bạn chưa có 10.000 trong số chúng trong bộ nhớ

Bộ sưu tập rác đã được cải thiện trong PHP 7. 3

Thu gom rác đã được cải thiện đáng kể trong 7. 3 phát hành PHP, sau khi hợp nhất PR của Dmitry Stogov và Nikita Popov. Các thay đổi, như các điểm chuẩn bên dưới chứng thực, cho thấy sự cải thiện rõ rệt về hiệu suất của trình thu gom rác của PHP — đặc biệt là đối với một ứng dụng có số lượng đối tượng lớn

// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 

Bạn có thể thấy rằng thời gian thực hiện của trình thu gom rác giảm đáng kể, trừ khi một ứng dụng chỉ có một số lượng nhỏ các đối tượng;

Thống kê thu gom rác

Bây giờ chúng ta đã hiểu cơ bản về bộ sưu tập rác là gì, nó được triển khai như thế nào trong PHP và khi nào nó được kích hoạt. Tuy nhiên, chúng tôi cần thêm thông tin để có thể sử dụng nó một cách hiệu quả. Cụ thể, thời điểm nó được kích hoạt và hiệu quả của mỗi lần chạy thu gom rác

Kể từ PHP 7. 3, PHP cung cấp thông tin thu gom rác cơ bản trong vùng đất của người dùng PHP, thông qua gc_status. Hàm trả về

  • Số lần thu gom rác chạy
  • Số hiện vật sưu tầm được
  • Ngưỡng thu gom rác hiện tại
  • Số lượng rễ thu gom rác

Tuy nhiên, để biết chi tiết hơn, cần có Xdebug. Nó hỗ trợ ghi số liệu thống kê thu gom rác toàn diện hơn nhiều ở định dạng bảng, người có thể đọc được vào một tệp và thư mục có thể định cấu hình. Dưới đây, bạn có thể thấy tập tin trông như thế nào

Garbage Collection Report version: 1 creator: xdebug 2.6.0 [PHP 7.2.0]

Collected | Efficiency% | Duration | Memory Before | Memory After | Reduction% | Function ----------+-------------+----------+---------------+--------------+------------+---------     10000 |    100.00 % |  0.00 ms |       5539880 |       579880 |    79.53 % | bar     10000 |    100.00 % |  0.00 ms |       5540040 |       580040 |    79.53 % | Garbage::produce      4001 |     40.01 % |  0.00 ms |       2563048 |       578968 |    77.41 % | gc_collect_cycles 

Đây là ý nghĩa của mỗi cột trong bảng

CộtMô tả
a: [refcount=1, is_ref=0]='value' 
7Số lượng đồ vật mà người thu gom rác đã dọn sạch.
a: [refcount=1, is_ref=0]='value' 
8Tỷ lệ phần trăm hiệu suất thu gom rác.
a: [refcount=1, is_ref=0]='value' 
9Thời gian hoàn thành việc thu gom rác.
// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
0Dung lượng bộ nhớ khả dụng trước khi thu gom rác.
// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
1Dung lượng bộ nhớ khả dụng sau khi thu gom rác.
// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
2Tỷ lệ phần trăm bộ nhớ được lưu bởi lần chạy thu gom rác.
// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
3Tên của chức năng mà bộ sưu tập rác được chạy trên đó.
// Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s

// Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s

// Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
4 [không được hiển thị trong ví dụ này] Tên của lớp mà bộ sưu tập rác được chạy trên đó

Cài đặt khả dụng

Tiện ích mở rộng thêm ba cài đặt Xdebug mới;

  • xdebug. gc_stats_enable. Điều này cho phép thu thập số liệu thống kê thu gom rác, bị tắt theo mặc định. Tên tệp và thư mục ghi số liệu thống kê có thể định cấu hình lần lượt bằng
    // Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s
    
    // Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s
    
    // Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
    5 và
    // Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s
    
    // Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s
    
    // Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
    6
  • xdebug. gc_stats_output_dir. Điều này đặt thư mục nơi tệp thống kê được ghi vào. Lưu ý, không thể đặt cài đặt này với
    // Very, very, very many objects GC       |    OLD |   NEW disabled |  1.32s | 1.50s enabled  | 12.75s | 2.32s
    
    // Very many objects GC       |    OLD |   NEW disabled |  0.87s | 0.87s enabled  |  1.48s | 0.94s
    
    // Less many objects GC       |    OLD |   NEW disabled |  1.65s | 1.62s enabled  |  1.75s | 1.62s 
    7
  • xdebug. gc_stats_output_name. Cái này đặt tên của tệp mà số liệu thống kê được ghi vào

Tóm lại là

Mặc dù không phải là điều mà các nhà phát triển PHP phải cân nhắc nhiều, nhưng tất nhiên, như một vấn đề thường ngày, việc thu gom rác vẫn là điều cần thiết phải biết, nếu chúng ta muốn đảm bảo rằng các ứng dụng của mình hoạt động tối ưu nhất có thể

Nếu bạn muốn biết thêm về nó, hãy đảm bảo rằng bạn đã tham khảo hướng dẫn sử dụng PHP và các liên kết khác trong phần đọc thêm bên dưới

Tính tham chiếu trong PHP là gì?

Đếm tham chiếu là trong đó PHP theo dõi nội bộ có bao nhiêu ký hiệu trỏ đến một biến nhất định . Khi số lượng ký hiệu trỏ đến một biến giảm xuống 0, thì biến đó có thể được thu gom rác ở cuối yêu cầu hiện tại.

Có con trỏ trong PHP không?

PHP không có con trỏ , nhưng nó có tham chiếu. Cú pháp mà bạn đang trích dẫn về cơ bản giống như truy cập một thành viên từ một con trỏ đến một lớp trong C++ [trong khi ký hiệu dấu chấm được sử dụng khi nó không phải là một con trỏ. ]

Chủ Đề