get_option () vs get_theme_mod (): Tại sao một cái chậm hơn?


17

Tôi đã sử dụng get_theme_mod()một thời gian trong các dự án khác nhau của tôi. Tôi đã quyết định tận dụng API tùy chỉnh chủ đề trong WordPress v3.4 một khi nó có sẵn vì tôi cảm thấy đó là một công cụ không thể thiếu cho khách hàng của mình sử dụng.

Sau một thời gian, tôi bắt đầu nhận thấy rằng các trang web của tôi cảm thấy chậm chạp hơn bình thường một chút và đặc biệt là Trình tùy chỉnh mất khá nhiều thời gian để tải. Thông qua rất nhiều thử nghiệm và lỗi trong quá trình điều tra, tôi đã quyết định thử chuyển đổi typekhi đăng ký cài đặt của mình (tức là $wp_customize->add_setting()) từ theme_modsang option.

Khi tôi đã thực hiện điều này và hoán đổi tất cả các get_theme_mod()cuộc gọi của mình get_option(), tôi nhận thấy tốc độ tăng rất đáng kể khi sử dụng thiết lập sau so với trước trên giao diện và đặc biệt là trong Trình tùy chỉnh trên phụ trợ. Tôi đã xem qua lõi WordPress trong một nỗ lực để cố gắng tìm ra câu trả lời cho lý do tại sao, nhưng dường như không thể nhận ra hangout cụ thể là gì trong kịch bản này.

Bất kỳ hiểu biết nào mà cộng đồng có thể có liên quan đến get_option()việc thực hiện nhanh hơn đáng kể get_theme_mod()sẽ được đánh giá rất cao.


1
Nếu bạn nhìn /wp-includesvào option.phpnơi get_option()được xác định và tại theme.phpnơi get_theme_mod()được xác định, bạn có thể thấy rằng cái sau thực sự get_option()tự gọi mình, hoạt động như một phần mở rộng của nó cũng áp dụng bất kỳ bộ lọc cần thiết nào. Có thể giải thích tại sao nó chậm hơn.
Jody Heavener

1
Jody, tôi nghĩ rằng bản thân mình, nhưng cảm giác như chỉ cần tham khảo get_option()và áp dụng một số bộ lọc không nên làm cho nó chậm đi đáng kể như vậy. Chắc chắn là một điểm khởi đầu tuyệt vời, nhưng tôi tự hỏi nếu không có cái gì khác trong các tác phẩm ở đây.
ntg2

3
Không có lý do cho bất kỳ sự khác biệt tốc độ nào ở đó, vì vậy tôi nghi ngờ điều gì đó khác đang gây ra sự khác biệt nhận thức của bạn. Mod chủ đề được lưu trữ dưới dạng tùy chọn.
Otto

Có thể quá trình tuần tự hóa / hủy đăng ký trong việc tìm nạp các mod riêng lẻ có thể đóng một phần trong đó theo một cách nào đó không? Tôi tò mò liệu công việc bổ sung để giải nén mod có thể là một sự cố hay không, chỉ đơn giản là tìm nạp tùy chọn mà không cần phải làm điều đó. Khi thực hiện sự thay đổi từ get_theme_mod()đến get_option()tốc độ của tất cả các dự án tăng gấp đôi trung bình trên cả lối vào và trong Customizer. Đây là thay đổi duy nhất được thực hiện trong nỗ lực cô lập nó khỏi bất kỳ tác dụng phụ nào khác.
ntg2

Câu trả lời:


19

Câu trả lời là có, các hàm theme_mod sẽ chậm hơn, nhưng không đáng kể và lợi ích vượt xa sự khác biệt.

Mod chủ đề được lưu trữ dưới dạng tùy chọn. Vì vậy, về bản chất, các hàm theme_mod là các hàm bao quanh các hàm tùy chọn.

Trước tiên, hãy hiểu rằng các cài đặt theme_mod được lưu trữ dưới dạng một mảng trong một tùy chọn duy nhất, được khóa với tên chủ đề cụ thể. Vì vậy, nếu tôi làm điều này:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

Sau đó, những gì tôi thực sự nhận được trong cơ sở dữ liệu là một hàng tùy chọn duy nhất có tên theme_mods_themename chứa một mảng được tuần tự hóa với ('aaa' => 123, 'bbb' => 456) trong đó.

Bây giờ, get_theme_modsẽ chậm hơn vì nó thực sự thực hiện hai get_optioncuộc gọi. Đầu tiên, nó được tên của chủ đề. Sau đó, nó được theme_mods_themenametùy chọn. Vì vậy, ngay đó là mất 50% tốc độ. Phần còn lại của công việc được thực hiện chủ yếu nằm ở các bộ lọc, trong đó có một cuộc gọi bộ lọc bổ sung, nhưng trừ khi bạn có một cái gì đó trên bộ lọc đó, điều này không đáng kể.

Lưu ý rằng hệ thống tùy chọn lưu trữ dữ liệu đã truy xuất trong bộ đệm đối tượng, do đó, nó không thực hiện nhiều cuộc gọi cơ sở dữ liệu ở đây. Chỉ sử dụng kết quả đầu tiên trong một cơ sở dữ liệu nhấn.

Việc set_theme_modnày sẽ chậm hơn một chút vì nó thực hiện hai cuộc gọi tùy chọn tương tự, sau đó nó thực hiện một get_optioncuộc gọi khác để lấy lại tên chủ đề, và sau đó thực hiện update_optionvới toàn bộ các tùy chọn đã thay đổi. Điều này gây ra cập nhật cơ sở dữ liệu và việc nó gửi nhiều dữ liệu hơn thực sự có thể là nguyên nhân gây ra sự chậm chạp đáng chú ý. Cập nhật một vài byte nhanh hơn cập nhật một hàng lớn hơn. Nhưng thường thì không nhiều như bạn chú ý. Trừ khi bạn có cả đống thiết lập ...

Các chức năng mod chủ đề có thể là do tối ưu hóa tổng thể, chắc chắn, tuy nhiên bạn vẫn nên sử dụng chúng thay vì get_option và như vậy vì các chủ đề con.

Vấn đề với việc sử dụng các hàng tùy chọn trực tiếp là bạn đang sử dụng chúng trực tiếp và sử dụng tên khóa cụ thể cho cài đặt của mình.

Nếu tôi có một chủ đề gọi là "AAA" và tôi tạo một chủ đề con của nó có tên là "BBB" để sử dụng trên một trang web khác, thì chủ đề "AAA" của tôi có thể sử dụng một tùy chọn có tên là "ví dụ". Khi tôi cập nhật một trang web và nó cập nhật tùy chọn của tôi, thì tùy chọn tương tự bây giờ sẽ áp dụng cho chủ đề con của tôi. Điều gì xảy ra nếu tôi không muốn nó làm như vậy? Nếu tôi muốn chủ đề con sử dụng một bộ cài đặt tùy chọn khác thì sao?

Các mod chủ đề, bằng cách bao gồm tên chủ đề thực tế (và không phải là giá trị được mã hóa cứng) như một phần của khóa đảm bảo rằng mỗi "chủ đề" trên trang web sử dụng bộ cài đặt rất riêng của nó. Tôi có thể chuyển đổi qua lại và các cài đặt không chuyển giữa chúng, chúng giữ nguyên cách tôi đặt chúng. Đơn giản hơn, rõ ràng hơn, trực quan hơn.

Và nếu một số thay đổi cốt lõi hoặc plugin trong tương lai sửa đổi cách theme_mods hoạt động, thì bạn sẽ tự động nhận được lợi ích của điều đó mà không có bất kỳ thay đổi nào. Wrappers luôn luôn sẽ chậm hơn, đó là điều không thể tránh khỏi, đó là bản chất của Wrappers. Tuy nhiên, bạn vẫn đang viết mã PHP, không phải ngôn ngữ máy. Chúng tôi sử dụng các hàm bao như thế này để đơn giản hóa mọi thứ và chức năng riêng biệt. Chủ đề không cần phải biết, hoặc quan tâm, làm thế nào các tùy chọn của chúng được lưu trữ trong cơ sở dữ liệu hoặc cách đặt tên hoạt động. Các hàm theme_mod cung cấp một giải pháp đơn giản hơn, sạch hơn.


3

get_theme_modchỉ là một bao bọc xung quanh get_option. Về lý thuyết bởi vì nó là một lớp trừu tượng khác, nó sẽ hoạt động chậm hơn nhưng trong thực tế, sự khác biệt không nên đủ lớn để được con người chú ý.

Sự khác biệt tốc độ thực tế có thể được gây ra nếu bạn có một số mã chậm được nối trên các hook theme_mod.


1

Có thể có một cái gì đó xảy ra trong Customizer sau đó? Tôi đang thấy điều tương tự như OP ở đây.

Tôi có thể xác nhận rằng với khoảng 30 tùy chọn, thời gian tải Tùy biến của tôi giảm từ khoảng 3 giây xuống còn khoảng 0,5 giây khi chuyển sang get_optionhơnget_theme_mod

Gọi trực tiếp các phương thức tôi thấy sự khác biệt 2ms.

kết quả kiểm tra ( https://gist.github.com/anonymous/d98a46d00d52d40e7dec )

Có thể không đáng chú ý khi bạn so sánh trực tiếp các API, nhưng phải có một cái gì đó với cách chúng được sử dụng trong Tùy biến.


1

Bạn có thể KIỂM TRA THỜI GIAN của get_option(100 lần lặp) bằng cách sử dụng mã này (đặt vào functions.phphoặc ở đâu đó):

add_action('wp','My_Test');
function My_Test(){
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_option('blogdescription'); }
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_theme_mod('blogdescription'); }
    var_dump(microtime(true));
    exit;
}   




Những suy nghĩ khác

Tôi không biết, nếu nó tạo ra sự khác biệt (có thể các nhà phát triển Wordpress biết điều đó tốt hơn), nhưng tôi nghĩ, nếu một trang web có lưu lượng CAO và trên mỗi lần tải trang, nó cần có hàng trăm tùy chọn, nếu tôi sẽ tham gia nhiều lựa chọn thành một get_option? như thế này:

update_option('my_extra_optss',  array(
      'myNAME' => 'George',
      'myAGE'  => 43 ));

sau đó :

$x = get_option('my_extra_optss');
$x['myNAME'];
$x['myAGE'];
................

điều này sẽ làm cho một trang web nhanh hơn một chút?


2
Đó chính xác là những gì get_theme_mod đã làm. Tất cả các mod chủ đề đã được tham gia vào một tùy chọn duy nhất. Bất cứ khi nào bạn gọi get_theme_mod, nó sẽ thực hiện hai cuộc gọi cơ sở dữ liệu lần đầu tiên và không có cuộc gọi cơ sở dữ liệu nào sau đó.
Otto

0

TL; DR: Nếu bạn là nhà phát triển chủ đề, bạn nên sử dụng get_theme_mod

Câu trả lời đầy đủ:

Nếu bạn có 100 cuộc gọi get_option, phải mất 100 truy vấn vào cơ sở dữ liệu của bạn.

Nếu bạn có 100 cuộc gọi get_theme_mod, chỉ cần 1 truy vấn vào cơ sở dữ liệu của bạn.

Tại sao? Bởi vì tất cả các mod chủ đề được lưu trữ trong một hàng cơ sở dữ liệu duy nhất và sẽ chỉ được gọi là một, trong khi mỗi tùy chọn là một hàng và 100 lệnh gọi get_option sẽ dẫn đến 100 truy vấn cơ sở dữ liệu và tất nhiên, nó làm chậm trang web của bạn.

Nếu chủ đề của bạn có nhiều tùy chọn, sử dụng get_theme_mod sẽ giảm đáng kể số lượng truy vấn của bạn vào cơ sở dữ liệu.

Bạn có thể kiểm tra hiệu suất và số lượng truy vấn bằng Plugin Monitor Monitor

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.