21. 缓存上下文CacheContext

龹龸龴龱 Context 龛龙龘龕龑龎龊龉龅龃龀齼齹齶齴齱齰齹齭齪齨齦齢龱齠齞齜齙齕齔龉龅龑齐齍齞齜齋齪齇龘齃齁鼾鼼鼺龴齔鼶鼴齍齕鼾鼰鼮齞齜鼬鼨龉鼤

鼠鼟龙鼛鼗 : 龹鼔鼐鼏鼋鼈 drupal 龛齔鼟黵黴黳黯龑黮鼨龉鼤鼾齔黪黦黢黠黝黙龹鼔龛默黗黔齔鼏齞齜齱齍齕齇齁齁鼤黒黑黍龹鼔龛龑黔齔龙龘龹鼔龛黋龑龸龴龱齔龙龘黔黋龑龸龴龱鼾黊

鼏黇黆黃麿齱齔龸龴龱龑齇麽麺麶鼾鼨麲麲麰齔齰麬黦麩麥鼏鼼鼺鼰鼾麤麡齁鼤鼼鼺麞黠麜黢麘麔麒麏麎龙麊晦麅鼾齁鼤齔麃麔鹿黝黙龹龸龴龱龛鹾齐齪龹鼼鼺龛黋鹻黍齔齰麬龑鹷鹴鼾麞

鹲鹱鹭鹩鹧鹣鹠鹝鹚鼐鼾鹗鹕鹑鹧鹐鹍鹕齔鹋龊鹇齰鹅鹂鸿鸽麎齱齔鸹齴鹋齇鸵齔鼔鸱齇黆鸮鸫黋龑鸩鸥鼼鼺齔鸡鼛鼗黯黋龑鸟黒黑鸞鸛鸗鼏鼾龸龴龱齔鸕鸒鼔鼬鹧鼨鸗鹻鸏

鸎齭龸龴龱鸍鸋龑鼟鸊鸆鹿齔鼏鸂鸁齙齕鷾鷺齇龘鷹麡鷷鼨鷳鼾鼾鹻黦龑鷾鷺鼏鼼鼺鷱龸鼾齔鷮鸮鷮鷪鷨龑鼟鸊

drupal 齱龸龴龱黋龑默齐鷦鷣鸿鹩鷟齔鷞鷛鸗齋鼾黃鷚鼼鼺齔龙龘鼼鼺鷗鷦鷣鷕鷞鷛鹱鷔鷒鷑鷏鷎齔鷞鷛鷊鷉鹿鸟黒黑鼼鼺鷇龸龴龱鷄鼬黝黙鸞鸛鷀鶿龊鹻鸏鷇鼐鶾齍龱鸗鶻鷄麞

鹋龊鶷鶴龸龴龱 CacheContext 龃齔黋龑默鹾麤齪鶷鶴鷞鷛鼾鼼鼺鷇鶷鶴鼼鼺龑鷞鷛鼼鼺鼾鸁鶰鷄齔鶷鶴鷞鷛鼶鶬鸊鼼鼺鼬鹧鼐鶪鹻鸏齔鶦鶣鶢鶞黋龑鶷鶴鼶鶬龙龘龸龴龱鹩鶴鹂鶛鶘鶕鼐鶪鼾鶔鶬麞

鼏鶷鶴鷞鷛齱齔鹾麤齪鶷鶴鶓鶏黗鶌鶷鶴鼨鶈麶鶅齦齔鶷鶴龸龴龱黗鶌鶔鶬鼾鶄鶣齔鷑齇鶃鶔鶬黠鷑鼼鼺鼨黠鷑鶄鶣齔鸎鶁黯鶷鶴龸龴龱鵾鹿鷳鼾黋龑鵻齶鶷鶴 id麞

鶷鶴龸龴龱鵶齁黍鶷鶴 id 齔鵳黋龑 Cid, 齰鵮齇鶓鵭齇鵩鶷鶴齔鵨齰鶘鶕鷕鹱鷔齇鵩鶷鶴齔鵤齪鶷鶴鷞鷛鼾鵣鵢鷦鵟鵝鷞麰齍齕鼾鵾鵜麞

龴齕鵙麬鹩鵟齇鵟鶷鶴龸龴龱鶿龊鵖鵨齔鶁鵔鷞鷛龑鼟鵐鶢鶞鼾麞

缓存上下文的用法:

鶷鶴龸龴龱鼾黊龑齇龘齠鵎鵌鶔鵋齔齠鵎鵌龑齃齁鼾齔黗鶌齇麽龸龴龱齔龙龘龸龴龱鵨齇龘龸龴龱麤麡鶢鶞齔鶁鼮鹍鼾鵊鵆鵃鴿鶴鼏齔鴻龸龹cache_context.龛齍鴳黋龑齰麤鶾鼾鼮鹍鵊鵆id麞

龙龘齠鵎鵌鴯齹鴬鴪鴦龹token龛齢龸龴龱id齢鶷鶴龸龴龱鴣鴢鵎鹷麞

鵝鴞龸鶻齰龑鴛齇鼼鼺鴗鶔鼾鶓鵭鵎齔鼏鴕鴓Cid鷇鶷鶴id鷄鷟鹭鴏麜麤鶾鼾龸龴龱鵊鵆麤麡鴎鸿鶦鶣鼾鼼鼺黊麞

齇龘鴋黴鼾鴈鸁齔鼠鼟鼏鴇鹣鹍鴃鶕鼾鳿鳾鶔鵋鸎鶁龙麊默齁鶷鶴麺麶鷷

$build = [  
  '#markup' => t('Hi, %name, welcome back!', ['%name' => $current_user->getUsername()]),  
  '#cache' => [  
    'keys' => [...],  
    'contexts' => ['user'],  
    'tags' => [...],  
    'max-age' => -1  
     ]  
];  

龙齙鼾'user'黋龑鶷鶴龸龴龱id齔鸎鶁鼨鳄龘龸龴龱id齔齰麬鵋鷎齇龘龸龴龱鶔鵋齔鷞鷛鳀鲿鲾鲻黍鶁龴龸龴龱id鷷鷇齭鲸鲶鼰鼮鲳鲱鷄

Array  
 (  
     [0] => cookies  
     [1] => headers  
     [2] => ip  
     [3] => languages  
     [4] => request_format  
     [5] => route  
     [6] => route.menu_active_trails  
     [7] => route.name  
     [8] => session  
     [9] => session.exists  
     [10] => theme  
     [11] => timezone  
     [12] => url  
     [13] => url.path  
     [14] => url.path.parent  
     [15] => url.query_args  
     [16] => url.query_args.pagers  
     [17] => url.site  
     [18] => user  
     [19] => user.is_super_user  
     [20] => user.node_grants  
     [21] => user.permissions  
     [22] => user.roles  
 )  

龙鲯龸龴龱 id 鲮鼨麤鶾鼾龸龴龱麤麡齔鴻龸龹 cache_context. 龛齍鴳黋龑龙鲯麤麡鼾鼮鹍鵊鵆 id 齔龴齕鵙麬鹩鵟齇龴鶷鶴龸龴龱鼾鶦鶣鶢鶞鷷

鴏麜麏鲬鶦鶣鶢鶞鹧鲫鲪鲩鲦鳄鲣鲟鵨鲛

齋麏鶷鶴龸龴龱鼾黗鲚鴢齪鷷 \core\lib\Drupal\Core\Cache\Context

鲐麽鹗鲍鼾鶷鶴龸龴龱鷞鷛鲮齁鼤黍齇龘鶷鶴龸龴龱麤麡鹩齋麏齔龙鲯麤麡鶦鲉鷒鷑齃麶齔鲆鴬鲅鲁鼏鶷鶴龸龴龱鱽鱼齱鷷 Drupal\Core\Cache\Context\CacheContextInterface

龙龘鱽鱼鱳鴋黴齔齁鼤黍鶁龴鱯鱭鲛鷷

public static function getLabel(); 鴎鸿鶷鶴龸龴龱鶓鶏齔龙龘鶓鶏鵨齪鱨鱦鶷鶴龸龴龱齔鱣鱡鱟鹕鹗鵟

public function getContext(); 鹭鶷鶴龸龴龱 id 鱜鸡黦鶷鶴龸龴龱黊齔鼠鼟默齁黍鶷鶴龸龴龱 id 黦龹 ip 龛齔鹋龊龙龘鱭鲛鹭鴃鶕鶦鶣鼾鱛鱘鱗 ip

public function getCacheableMetadata(); 鴃鶕鸎鶷鶴鱒鶔鶬齔齁鼤龙龘鱭鲛龑黦黍鱏鱍鶷鶴龸龴龱鱊鱆鷇齭龴龱鷄

龙齙鼨齇龘鱅鵜齔鷦龅鱂鷷鵙麬黝黙齇龘鶷鶴龸龴龱 id 默黗齇麽鼼鼺鴗鶔齔鶣鶞黍龙麽鼼鼺鴗鶔鼾鰾鶄鰽鹩鼾鶔鶬鶄鶣鰾鶄齔鸕鶅鼼鼺鴗鶔龑鰻齹鰻齹鳄鼾齔鼠鼟鷦鷣鰹齢 cookie 鼔麬鲮鰵鰱鱳鳄鸁鵩鷳

鲐龘鸁鵩鷳鲮鸎鶁龑齇龘龸龴龱 id 齔鹋龊鵙麬鰯黠龑鹿齁鼤鰻齹鳄鼾鶷鶴龸龴龱麤麡龀鰭鵙麬鰪鶞龙麊鼾龸龴龱鼨齇龘鷒鷑齃鰧鷷龙鲯鰥鰣鰠鳄鼾龸龴龱齰麬鲮龑鷑麶鴞鼾齇龘鰟鹗鼾鸁鹗

鶦鶣黯黋龑鸗鼨鼾鷦鷣鰹鵩鷳鲮龑鷦鷣鰹齔鸗鼨鼾 cookie 鶄鰜鲮龑 cookie

黦黍鲬鵶龙龘鱅鵜齔鰛鰙黍鴕鴓鲍鶷鶴龸龴龱鱽鱼 Drupal\Core\Cache\Context\CalculatedCacheContextInterface

CacheContextInterface 鹾鼠齔黠鷑鷱齋鰖龑鼔麬鼾鱭鲛鳄黍齇龘鴗鶔齔鵨鴗鶔默齁齇龘鰟鹗鼾鶦鶣鰒鹗齔龙麊鰟鰟鰏鰍黍鶷鶴龸龴龱麤麡鼾鶔鰜

黪黦鶢鶞龙龘鱽鱼鼾鶷鶴龸龴龱麤麡鼨鰉鳄鰒鹗齔鸗鶁鰆齁龙麊鼾鶷鶴龸龴龱鶁鰂鶔鵃鴿鯿鯼龸龴龱 id

鵖鵨龙麊鼾鶷鶴龸龴龱鷟鸎鶁鯻鯸鴗鶔齔龸龴龱 id 鷕鴗鶔鯴鵨鯰鯮鯪鯦齔龙鲯鴗鶔黗鶌龙齇鹗龸龴龱鼾鴛齇鶦鶣鶷鶴龸龴龱齔黠默齁鴗鶔黗鶌鯤鯢鸁鹗齔鹾齐齪默齁黍鯤鯢鴗鶔

笔者注:在写这篇帖子时(版本8.2.3),缓存上下文idsession 类:Drupal\Core\Cache\Context\SessionCacheContext没有实现接口,已向官网报告bug

如何自定义一个缓存上下文呢?

齁鼤齇龘鵊鵆齔齰鶢鶞黍鶁龸鯡麽鱽鱼鷱齇齔鵊鵆 id 黦鷷 cache_context.context_id, 龙齙龹 cache_context. 龛龑鷞鷛鹿鷣鼾鯝鹣齍鴳齔龹 context_id 龛黋龑鹿鵖鵨鼾龸龴龱 id

齁鼤鯙鵊鵆鸒鱟鹝龹 cache.context 龛鶓鶏齔龴齕龑齇龘麰鸁鷷

  cache_context.ip:
    class: Drupal\Core\Cache\Context\IpCacheContext
    arguments: ['@request_stack']
    tags:
      - { name: cache.context }

鸕鸒鸆鯋鯇鯃鼮鹍鯂鸎鷇黒鯁鶷鶴鷄齔鯇鯃鹍鷷 \core\lib\Drupal\Core\Cache\Context\CacheContextsPass 鹭鼏鼮鹍鯇鯃鮹鮶鮵鶰齋麏龙鲯鶷鶴龸龴龱齔鮲鹭齰麬鮰鶴鸿鼮鹍鴗鶔 cache_contexts

鷞鷛鲾鲻黍齇龘鴪鴦鶷鶴龸龴龱鮯麏鹍鼾麤麡鶁鱭鮭鵖鵨齔鵊鵆 id 黦龹 cache_contexts_manager 龛齔鹗鷷 Drupal\Core\Cache\Context\CacheContextsManager

齰鼾鵾鹿鷚鵨龑鱽鮪鶷鶴龸龴龱齁鼤鴗鶔鸕鸒鹇齰鱜鱆黦鶷鶴 id convertTokensToKeys(array $context_tokens)

龙龘鱭鲛鴃鶕鶷鶴 id 鼾鷟鮠齔鮲黠龑齇龘齠鵎鵌齔鶅龑 Drupal\Core\Cache\Context\ContextCacheKeys 麤麡齔黦龎龊鹿龙麊齋麏龀黪黦鶷鶴龸龴龱鱊鱆齔齭龴麞

鶷鶴龸龴龱鮯麏鹍鷑鷟鵳鲾鲻黍齇鲯鲆鼔鲸鲶鱭鲛齔鼠鮜鴋黴齔黠鳄鶻齔鸆鰧龑鶷鶴龸龴龱鱊鱆

缓存上下文优化

黢鸎鹧鮙鴯鮗龉鸿黍鼨鲯鶷鶴 id 鰵鰱鼛鰧齔龙鸎鹧黗鶌龎龊鮓龀鲆鶢鶷鶴龸龴龱龑鯪鮒鲟鼾齔鼛鰧黋龑鮒鲟鯴鼾鯪鯦齔鮎鮊鸿鮇黋龑鮎鮃鸿鸁

黦龎龊鹿鯪鮒鲟龀龙龑黦黍鮂鸿鶷鶴龸龴龱鱊鱆鷚鵨齔鶿龊鱊鱆龃龀魾鸒鼾魺麏龑龎龊龀鱊鱆鼾鷳鼾黠龑魶魵鵻齶鰟鰜鶄鶣齔鶅龑魶魵鼏鵻齶 Cid 鷟魳鹻麜鳄鼾鴕鴓

鶢魲龸鮒鲟鯴鯪鲟鼾魺魮黋龑鮃鲦魭魫齔鸁鲦鶦麡

魧龘鴈鸁鷷鼟黵齇龘龸龴龱鷑鷟默齁黍 user user.permissions 齔鲆鶢鵨鱘鼾鰾鶄鵳黋魥鰱黍魣魡鼾鰾鶄齔鮃鮒鲦鴻魭魫齔鸗鶁龙齙魣魡龸龴龱龑鳄魟鼾齔齰鸎鶁鴬鱊鱆魛鷇鵳黋龑麒魛黍鷄

鸕鶅龙麊鼾鱊鱆麎鵻齶齇龘鱅鵜齔齐鵨鱘魣魡鶄鱆鷟齔麎鶘鶕鷱齍鼾鶷鶴齔龙鸎鹧龑鼨鱅鵜鼾齔鶿龊魙龀龙黋麔鹿鹭魣魡鼾鶄鱆魗鶾鸿鶷鶴鼾鶔鶬齱

黪鸊鲬鵶魙鲛龑鱟鶷鶴龸龴龱鴻龸鶷鶴麺麶齔鮲鹇龙鲯鴬鱊鱆魛鼾鶷鶴龸龴龱鼾鶷鶴鶔鶬鯰魕鸿鴬鶷鶴鼾鶔鶬齱齔龙鵳黋龑鶷鶴龸龴龱鱽鱼黦龎龊麔鹿鼨 getCacheableMetadata 鱭鲛鼾魺黪麞

鼟龸麰齱 user.permissions 魒鸕鴬鱊鱆魛黍齔鰭齰鼾鶷鶴鶓鶏魎黠麎魌魛齔齰鼾鶷鶴麺麶麎鯻鯸鱟鴬鶷鶴鼾鶔鶬齔鸊鷟魣魡鶄鱆鹭鰛鮂鶷鶴魊鶈齔龙麊黋鮰魆黍鶔鶬鼾鼐鶪麶

龙麽魙鲛魅鰽鹩齇龘魁鬾鼾鯙齋齔黋龑魶魵鬻鬸鶷鶴鷇鬷黠麜鬵齢鵳黠魊鶈齔鰭鬷黠麎鵨鸿鼾鶷鶴鷄齔鬱鬱龸齕龙龘鴈鸁鼟黵黠魳鹻鱊鱆齔齐魣魡鶄鱆龑鹭鵻齶鯋鼾 Cid 齔魺 Cid 鸎鹧黋鷎黦鬻鬸鶷鶴黍

鲦齇鬰鼾鬭麡龑鷷鼟黵齇龘鶷鶴龸龴龱鼶鬩齪鴛鱏鷔齔鶅鱏鷔鸎鹧鰾鶄齔鬦鬣鶷鶴龸龴龱鶦鶣黊鰾鶄齔鹋龊齐鱊鱆魛鷀龸龴龱鷟齔鬟鬜鹭齰鼾鶷鶴麺麶鱍鮲鷇鵳鴪鴦鯰魕鷄鸿鴬鶷鶴鼾鶔鶬

龙鲆鶢龑齇麽鬘鴿鼾默齁龸龴龱齔鶈黵鹾齐齪鶷鶴黍 getContext() 鼾鬖黵齔魶魵麒鬔鬑鴕鴓 getContext() 齔黋鬍鸿黍鱊鱆鼾鷳鼾鷷麶鹧鲾鬌鬊麤齰鼾鴕鴓鮙鴯鶣鶞鼏鶷鶴鶓鶏龸齕黍

鼟黵鷀鶷鶴龸龴龱鼶鬩鼾鱏鷔鰾鶄鼾鬇鬄齔黋鸎鶁鹱鷔 max-age = 0 鹩鬀髼龸龴龱鱊鱆

鶕麜鰹鹩齔鶾鷀髸髴黦龎龊鶷鶴鮯麏鹍鼏鴕鴓鴃鶕 cid 鷟鴃鶕鼾龑 ContextCacheKeys 麤麡黍髲齔齰髱髭鶷鶴鶔鶬鯰魕鼾黃鷚齔龙龘麤麡鰵鰱黍鶷鶴麺麶齔鶷鶴鷞鷛鹭鱍鮲齰鸿鴬鶷鶴鶔鶬鼾鶷鶴麺麶

龸龴龱鱊鱆鼾魺魮龑默齁鼾鶷鶴龸龴龱齱齔鼟黵鷑鷟鶴鼏鶦鲉鷒鷑鮃鲟鼾龸龴龱齔鹭麃鮰麥鷒鷑鮃鲟龸龴龱齔鯰鯮髫黦鼛鰧齔鶦鶣鱊鱆鱜鶄麰鸁鼟龴鷷

['a', 'a.b'] -> ['a']

['a', 'a.b.c'] -> ['a']

['a.b', 'a.b.c'] -> ['a.b']

['a', 'a.b', 'a.b.c'] -> ['a']

['x', 'x:foo'] -> ['x']

['a', 'a.b.c:bar'] -> ['a']

鱊鱆鶢鶞鼾黗鲚齭鷷 Drupal\Core\Cache\Context\CacheContextsManager::optimizeTokens(array $context_tokens)

额外的笔者提醒思考以下问题:

鶷鶴 ID 髨髧鷷

鼨黮鼨鸎鹧鯡鶃鶔鶬鹝鶞鷑齇龘 Cid 龃龀

鲆鶢龑鼨鸎鹧鼾齔鰭鷞鷛髦鶘鼾髥髣鱳髢髡鸿龙麊鼾鸫髠齔鷊鷉黠鷑鵨髞鼾鶔鶬鮙鴯鯪髚鴬鹂鼏黠鷑鶷鶴 Bin 齙齕齔鯂鵖髨髧鵳黮鼨鵤鷞齔鬔鬑鶔鶬麎鵖鵨鳄龘鶷鶴龸龴龱鼾鵋鱍齔龙髓髑黍髨髧鸍髍

鲐齇龘鶷鶴龸龴龱麤鶾齇龘齃齁鼼鼺齔鷑齇龘齃齁鼼鼺鹝鶞鯡鶃鶔鶬鼾鸍髍鹾齐髑

鸊鬾黦黍魳齇髌髊髉 Cid 髨髧齔魅鸎鶁魁鬾默齁鶷鶴髅齔鼠鼟鳿鳾鶔鵋黋髦鵨黍龙麊鼾髥髣

鶷鶴龸龴龱鷕鶓鶏鼾鲳髚鷷

鼏鵝龱髂鰹鰟鰜髀鱦黍龸龴龱齔黋龑黦黍鯝骾龸龴龱黗鶌鼾龑鹾麤齪鶔鶬鶅齦鬾鼏鼾鼼鼺齔鶅鶓鶏黗鶌鼾龑鶔鶬鸞骽齔鼨鯡龘鵤髅龕龹鬾鼏龛齢龹鸞骽龛齃髚鸆鹿

龸龱鼾 user.permissions 龸龴龱齔齰鴬鱊鱆魛鸒鲆鶓鶏魒鸕鷕鶔鶬鶓鶏鱍鮲齔鰭齰鼾鶓鶏鰽鹩鼾鶔鶬魊鶈龑鼏龙麽鼼鼺龴鶔鶬魊鶈黍齔鶅鶔鶬鸞鸛鼾鶓鶏鰽鹩鼾魊鶈龑鸗鼨鸫髠龴齰鲮魊鶈黍

鸗鶁龙鯡麽鶓鶏鼶鸕鶣鶞黍鬾鼏鼼鼺鷕鸞鸛鵝骽鷱鯴鼾鲳髚齔鱍鮲麃龑齇麽骻骹鶅鮙麞

缓存上下文官网文档:

https://www.drupal.org/docs/8/api/cache-api/cache-contexts

bug报告:

cookiesheaders上下文对象的getContext($parameter = NULL) 方法,参数为空时,返回的是数组,它应该是返回一个字符串,修复办法:返回数组的哈希值

缓存上下文:session 类:Drupal\Core\Cache\Context\SessionCacheContext 没有实现接口CacheContextInterface

题外话:

齇骷骳骱鲐骯鹝齇骫骩鸁鹩鵣鵢 drupal 齔龙骫骩鸁骥骡龑 2016 骚鼾骙鸒齇骫齔鷟鯴麜鼾鯙鬄齔 drupal8 齇骓黍齔鵙鼾鯡龘骒骐齔鰒鼾鵳齇骓鳄黍齔鼏 drupal 齱鷕齶齴齙鲮鼨鯙鳄验骈

黦龎龊鹿骳骱骅鷚龃龀

齇鱭齕骁齪驽驼麤齱驸髂骁鸽鲳鼨鸗驷驳麞鶞鮹鮶驸鼰鹕麬鲮鱳驱齔齶齴驯驮鼠鮜鰟齔鰍鼨马驮麒髂骁鸽鲳魵驪黃鷚齔黠驨鰪鬍驸驦鯂鵖龎龊鵳黠鴦驥鰍驤驠麎鲾鲻魭鵝齶齴鮰驟

龙鬦鬣鱳髢鰪驞鹝齇龘鯙鼾髂骁鸽鲳齔鱳鶞鶢鼾黯驸鼰髢鼨龙麊鼾鵩黆齔鰭髂骁黇黆鼨鰻齹鳄鼾鯙齋齔鵙麬麔鹿驛鲫鱊驗驔髂骁鼾黇黆齔驑驎驊鹩 drupal 麎鷎黦驸鼰驇驅鷞鷛鼾鵾齜齔黋驨 linux 齇麊

齇龘鯙鼾黇黆黠麃龑骻驁鹋龊鴋黴齔鲦鸆鹿鼾龑齶騾齔齶騾齙齕鼨鶔鰜騽鳄騻龉驷驳鼾鹕齔黠髼鼨髂鰪騸魅鼨鵖鵨騸齔龙鼬龑鵤髅鬊鷮騽騴騳鼬鹧騱鹠黠騭齔 drupal 黋龑龙麊鼾鵻騩齔驛鲫鱊驗齔齶騾驛鲫鰟麞

騨鸕驸鼰髢鼨騤騢髂骁鼾騞騝齔 drupal 鼏鯤騚騘鴦鼾鹋龊鹝騖齔鹋黋鴗騔髲齔験騒齰騎鰟驦鲮鮪騍齔鰭龑驸鼰騌騈齱龱騇騆齔鷎黍鼋鼈驟騅齔騔鲆騂騀鼾駽鯃黠鼟魺騱齔骅齇鲯鹧騎驸鹕鵟鼾駺鼾龱齠麞

駶齇鱭齕鵙鼨齇龘騻駴鷷齐駲鵙驸駯鯋駬駫齔騱駩騱鯋齶駦駥駥齔龑齇龘马駢鼾駞駝麞鹕齔齶鹩龑麔鹿鴦鰧鸮鸫鼾齔駚駚齇齶驽驼鹧麥龴鰧龎龊齔鵙鼨齇麽鸫駗齔齃髚駖駕鹋鲯麒駞鸒鹧鼏駔駐龸齕麥龴齇鹻駌鴿鼾駉鼋驦齔

鹕齶鼾鷳鼾鶾鷀黠龑黦黍鴎鸿齔黋鴓鴎鸿駈髂鷟鵳鬟鹭鹂駄齔麥龴鼬鼨龉鼤齔鼬龑鹚鶢鼾齔鹋黗鶌鸞鸛鶴鼏麜齔鮲鼏鸞鸛駁麒鸒黗鶌鸞鸛齇骷齴駀齔鸗鶁鵙馽鷣馻鹝齔騎馻鹝鼾鼏鸞鸛駈髂龙龘駞駝鷟鴎鶁麥龴麞

鹧鵖鵨 drupal 髂鰪鼾黃麿馹馵齼鲮鼠鮜鲣齔驽驼鼏龙龘麜麿齱鬖鵭齇馳鱊驗鼾鹕鼬齔齇鮂麒鴦鰧鸮齔験鸏鸽麎鼾鰪驞齔鴎鶁麥龴齇鲯馱馰齔騎齶鯿鼨鸗鹴黊齔鸎鶁鴏麜麥龴鼾馯鷞鱭鴿騎鵙麬馮鸿齇鮂麞

最后奉上非常喜欢的一段话:

人生中出现的一切,都无法占有,只能经历。我们只是时间的过客,总有一天,我们会和所有的一切永别。

深知这一点的人,就会懂得:无所谓失去,而只是经过而已;亦无所谓得到,那只是体验罢了。

经过的,即使再美好,终究只能是一种记忆;得到的,就该好好珍惜,然后在失去时坦然地告别。

本书共63小节:

评论 (写第一个评论)