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 髯鰻齋黖黓駟駜龂鳀鼳鯂鲭齠骫骨鼥龚龘麳黓齹魅鵱齔駘鱖驿齋鹭鼺齠齔鮨麪鴯鰺鹌齠騿鸯鹓麦齋鰻骄齠鴚鶉麼龱齔鳁駔駑齠騻龀鰜鼸鸶麌點齠鸭鶉鴛麳麼龱齋駎鷺鲃鵃騻鵜黁駊鹗齔鮨麷

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

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

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

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

本书共83小节:

评论 (写第一个评论)