万源之源之drupal 之 drupal_flush_all_caches

来源:互联网 发布:软件测试好吗 编辑:程序博客网 时间:2024/04/18 22:04
(注:学习笔记,仅学习交流用,如果有错误的地方,在您方便的情况下指正一下,万分感激!)
<?phpfunction drupal_flush_all_caches(){// Change query-strings on css/js files to enforce reload for all users._drupal_flush_css_js();/**|->variable_set('css_js_query_string', base_convert(REQUEST_TIME, 10, 36));*///重新构建所有的注册信息。registry_rebuild();/**重新构建所有的modules数据,并且缓存|->system_rebuild_module_data();在网站的目录(module, sites/all/module,还有系统自定义的profile下的modules)下找到所有的module|->$modules = _system_rebuild_module_data();通过数据库system表,把$modules 中不存在的信息放到这里(以为上面得到的仅仅是通过文件(比如module.info)得到的信息,这里把数据库里相应的module信息放到这里缓存)|->system_get_files_database($modules, 'module')更新数据库system表中$modules的信息, 把 不存数据库中的 或者 改变的 或者 有数据但是没相应module文件 的信息的值做相应修改(insert,update,delete)|->system_update_files_database($modules, 'module');Updates the registry based on the latest files listed in the database.作用是更新注册表(registry(网站内所有的class,interface), registry_file(网站内所有的module files,和include文件夹里面的所有的.inc文件,和他们的hash_file))的信息, 清空一些静态变量|->registry_update();//得到当前运行模式是不是安装的模式|->$in_installer = drupal_installation_attempted();//如果不是 installer模式,验证是否正在被重新构建,如果正在被重新构建,则延时锁并且返回false,保证同一时间只有一个重建的进程。|->if (!$in_installer && !lock_acquire(__FUNCTION__))//更新注册表|->_registry_update();在68行:找到网站内所有的文件后,并且在system表里得到了所有的modules,触发了registry_files(alter)然后再更新的注册表信息|->  drupal_alter('registry_files', $files, $modules);////最后在清空一些静态变量Determines(确认) which modules are implementing(实现) a hook.//在这里调用这个函数,仅仅是清除 module 的 implements,如代码|->module_implements('', FALSE, TRUE);//module_implements($hook, $sort = FALSE, $reset = FALSE)|->static $drupal_static_fast;if (!isset($drupal_static_fast)) {$drupal_static_fast['implementations'] = &drupal_static(__FUNCTION__);}$implementations = &$drupal_static_fast['implementations'];if ($reset) {$implementations = array();cache_set('module_implements', array(), 'cache_bootstrap');drupal_static_reset('module_hook_info');drupal_static_reset('drupal_alter');cache_clear_all('hook_info', 'cache_bootstrap');return;}Checks for a resource in the registry.(检查注册表中的资源)//在这里调用,仅仅是清除 函数中的静态变量 $lookup_cache和$cache_update_needed|->_registry_check_code(REGISTRY_RESET_LOOKUP_CACHE);->static $lookup_cache, $cache_update_needed;if ($type == 'class' && class_exists($name) || $type == 'interface' && interface_exists($name)) {return TRUE;}if (!isset($lookup_cache)) {$lookup_cache = array();if ($cache = cache_get('lookup_cache', 'cache_bootstrap')) {$lookup_cache = $cache->data;}}// When we rebuild the registry, we need to reset this cache so// we don't keep lookups for resources that changed during the rebuild.if ($type == REGISTRY_RESET_LOOKUP_CACHE) {$cache_update_needed = TRUE;$lookup_cache = NULL;return;}//如果不是 installer 模式, 则解锁本函数。代表本次重构成功。|-> lock_release(__FUNCTION__);*/drupal_clear_css_cache();//|->//variable_del('drupal_css_cache_files');//file_scan_directory('public://css', '/.*/', array('callback' => 'drupal_delete_file_if_stale'));//*/drupal_clear_js_cache();//|->//variable_del('javascript_parsed');//variable_del('drupal_js_cache_files');//file_scan_directory('public://js', '/.*/', array('callback' => 'drupal_delete_file_if_stale'));//*/// Rebuild the theme data. Note that the module data is rebuilt above, as// part of registry_rebuild().system_rebuild_theme_data();/**根据文件(.info),整理并且得到所有的themes 信息|->$themes = _system_rebuild_theme_data();//在 themes 下找到所有的 .info 文件,每个info文件代表一个theme|->$themes = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'themes');|->这里触发了 system_theme_info hook,允许module修改主题信息。// Allow modules to add further themes.if ($module_themes = module_invoke_all('system_theme_info')) {foreach ($module_themes as $name => $uri) {// @see file_scan_directory()$themes[$name] = (object) array('uri' => $uri,'filename' => pathinfo($uri, PATHINFO_FILENAME),'name' => $name,);}}|->// Find theme engines$engines = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.engine$/', 'themes/engines');|->在这设置了 theme 默认的 info信息$defaults = array('engine' => 'phptemplate','regions' => array('sidebar_first' => 'Left sidebar','sidebar_second' => 'Right sidebar','content' => 'Content','header' => 'Header','footer' => 'Footer','highlighted' => 'Highlighted','help' => 'Help','page_top' => 'Page top','page_bottom' => 'Page bottom',),'description' => '','features' => _system_default_theme_features(),'screenshot' => 'screenshot.png','php' => DRUPAL_MINIMUM_PHP,'stylesheets' => array(),'scripts' => array(),);|-> 在整理 themes 循环中,触发了 system_info_alter hook ,可以修改相应的主题信息$type = 'theme';drupal_alter('system_info', $themes[$key]->info, $themes[$key], $type);|-> 剩下的就是整理base theme 和 其他的一些theme信息通过数据库system表,把$themes 中不存在的信息放到这里(以为上面得到的仅仅是通过文件(比如theme.info)得到的信息,这里把数据库里相应的module信息放到这里缓存)|->system_get_files_database($themes, 'theme')更新数据库system表中$themes的信息, 把 不存数据库中的 或者 改变的 或者 有数据但是没相应theme文件 的信息的值做相应修改(insert,update,delete)|->system_update_files_database($themes, 'theme');*/drupal_theme_rebuild();/**|->drupal_static_reset('theme_get_registry');|->cache_clear_all('theme_registry', 'cache', TRUE);*/ entity_info_cache_clear();/**|->drupal_static_reset('entity_get_info');// Clear all languages.|->cache_clear_all('entity_info:', 'cache', TRUE);*///重新整理所有的 node type, 并且按需修改 field bundlenode_types_rebuild(); /** 根据 node_info hook 的到module 中的 node type,然后在数据库 node_type 表中得到所有的node type, 通过判断其中的属性,得到最新的node type并且保存到 node_type 表中 |->_node_types_build(TRUE);|->触发 node_info hook, 得到模块中注册的 node_type foreach (module_implements('node_info') as $module) {$info_array = module_invoke($module, 'node_info');foreach ($info_array as $type => $info) {$info['type'] = $type;$_node_types->types[$type] = node_type_set_defaults($info); |->node type 的默认值$info = (array) $info;$new_type = $info + array('type' => '','name' => '','base' => '','description' => '','help' => '','custom' => 0,'modified' => 0,'locked' => 1,'disabled' => 0,'is_new' => 1,'has_title' => 1,'title_label' => 'Title',);$new_type = (object) $new_type;// If the type has no title, set an empty label.if (!$new_type->has_title) {$new_type->title_label = '';}if (empty($new_type->module)) {$new_type->module = $new_type->base == 'node_content' ? 'node' : '';}$new_type->orig_type = isset($info['type']) ? $info['type'] : '';return $new_type; $_node_types->types[$type]->module = $module;$_node_types->names[$type] = $info['name'];}}...|-> 在重建过程中,如果某个node_type 是新的 或者 状态被改变过,则更新这个 node typenode_type_save($type_object);|->在更新note type之后 触发了filed api 和 两个 hook//更新时触发if (!empty($type->old_type) && $type->old_type != $type->type) {field_attach_rename_bundle('node', $type->old_type, $type->type);}module_invoke_all('node_type_update', $type);//插入时触发field_attach_create_bundle('node', $type->type);module_invoke_all('node_type_insert', $type);  */  //重新组织menu结构。这个函数在同一时间,只能有一个程序运行它,直至程序结束或超过运行时间。menu_rebuild();/**|->menu_router_build();|->触发了 menu hook, $callbacks = array();foreach (module_implements('menu') as $module) {$router_items = call_user_func($module . '_menu');if (isset($router_items) && is_array($router_items)) {foreach (array_keys($router_items) as $path) {$router_items[$path]['module'] = $module;}$callbacks = array_merge($callbacks, $router_items);}}|-> 在得到所有的 items 之后, 触发了 menu_alter hook, 允许在module里修改menu信息// Alter the menu as defined in modules, keys are like user/%user.drupal_alter('menu', $callbacks);|->重新组织menus 和 links 把他们更新到数据库(menu_router, menu_links)list($menu, $masks) = _menu_router_build($callbacks);_menu_router_cache($menu);return array($menu, $masks);    */// Synchronize to catch any actions that were added or removed.//Synchronizes actions that are provided by modules in hook_action_info().actions_synchronize();/**触发action_info hook 得到所有的action, 之后触发 action_info_alter 允许module修改已经定义的action|-> actions_list(TRUE);|->$actions = module_invoke_all('action_info');|->drupal_alter('action_info', $actions); */// Don't clear cache_form - in-progress form submissions may break.// Ordered so clearing the page cache will always be the last action.$core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');$cache_tables = array_merge(module_invoke_all('flush_caches'), $core);foreach ($cache_tables as $table) {cache_clear_all('*', $table, TRUE);}// Rebuild the bootstrap module list. We do this here so that developers// can get new hook_boot() implementations registered without having to// write a hook_update_N() function.//重新定义系统加载模块_system_update_bootstrap_status();}