Hàm get_option có được lưu trong bộ nhớ cache không?


13

Trong plugin của tôi, tôi sử dụng đoạn mã sau để lấy một tùy chọn từ cơ sở dữ liệu:

$options = get_option('my_plugin_options');

Nếu tôi sử dụng 10 lần này trong các chức năng khác nhau của plugin, WordPress có thực hiện 10 truy vấn vào cơ sở dữ liệu không, hoặc nó chỉ thực hiện 1 cuộc gọi cơ sở dữ liệu cho mỗi yêu cầu HTTP và lưu trữ kết quả?

Câu trả lời:


25

Khi nghi ngờ, hãy nhìn vào mã nguồn.

Đi sâu vào get_option(), bạn sẽ thấy (viết tắt):

 $value = wp_cache_get( $option, 'options' );

if ( false === $value ) {
    $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

    // Has to be get_row instead of get_var because of funkiness with 0, false, null values
    if ( is_object( $row ) ) {
        $value = $row->option_value;
        wp_cache_add( $option, $value, 'options' );
    } else { // option does not exist, so we must cache its non-existence
        $notoptions[$option] = true;
        wp_cache_set( 'notoptions', $notoptions, 'options' );
        return apply_filters( 'default_option_' . $option, $default );
    }
}

Đầu tiên, WordPress kiểm tra xem nó đã có tùy chọn trong bộ nhớ chưa. Theo mặc định, wp_cache_get()sẽ truy xuất các giá trị từ kho lưu trữ dữ liệu trong bộ nhớ (thường chỉ là biến PHP). Nhưng một số cài đặt sử dụng bộ đệm đối tượng nâng cao hơn lưu trữ dữ liệu ở nơi khác.

Trong cả hai trường hợp, wp_cache_get()sẽ trả về giá trị tùy chọn của bạn nếu WordPress đã biết.

Nếu không, thì WordPress sẽ cố lấy nó từ cơ sở dữ liệu. Nếu tùy chọn tồn tại trong DB, thì WordPress sẽ lưu nó vào bộ nhớ và sau đó trả lại - làm cho việc tra cứu tiếp theo nhanh hơn.

Nếu tùy chọn không tồn tại trong cơ sở dữ liệu, thì WordPress sẽ gắn cờ nó trong một mảng "các tùy chọn này không tồn tại" bên trong để nó không cố gắng tìm kiếm nó sau đó và trả về một số giá trị mặc định.

Vì vậy, để trả lời câu hỏi ban đầu của bạn:

Nếu tôi sử dụng 10 lần này trong các chức năng khác nhau của plugin, WordPress có thực hiện 10 truy vấn vào cơ sở dữ liệu không, hoặc nó chỉ thực hiện 1 cuộc gọi cơ sở dữ liệu cho mỗi yêu cầu HTTP và lưu trữ kết quả?

WordPress sẽ thực hiện 1 cuộc gọi cơ sở dữ liệu cho mỗi yêu cầu HTTP và lưu trữ kết quả.


2

Vâng, nó được lưu trữ. Nhìn vào nguồn của hàm. Nó gọi wp_load_alloptions()trong nền, để tìm nạp tất cả các tùy chọn và chức năng đó thêm kết quả vào bộ đệm:

wp_cache_add( 'alloptions', $alloptions, 'options' );

Nếu bạn nhìn vào lớp WP_Object_Cachetrong wp-includes/cache.php, bạn sẽ thấy, mọi plugin đều có thể gọi phương thức công khai flush().

Trong trường hợp này, giá trị tùy chọn không được lưu trữ nữa và get_option()sẽ kích hoạt tra cứu cơ sở dữ liệu mới. Các plugin không nên làm điều này, nhưng để chắc chắn rằng bạn không bị ảnh hưởng, đừng gọi bộ đệm trực tiếp, hãy luôn sử dụng get_option().


Ngoài ra, các tùy chọn không được tải tự động sẽ được lưu vào bộ đệm sau lần đầu tiên bạn tra cứu chúng. Xem câu trả lời của tôi cho một mô tả đầy đủ.
EAMann

@EAMann Đúng, tôi chỉnh sửa nó ra.
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.