WordPress 插件开发用到的所有钩子 hook

所有钩子列表:

muplugins_loaded    在必须使用的插件加载之后。
registered_taxonomy    对于类别,post_tag 等
Registered_post_type    用于帖子,页面等
plugins_loaded    加载活动插件和可插拔功能后。
sanitize_comment_cookies    注释cookie被清理后。
setup_theme    加载主题之前。
load_textdomain    对于默认域
after_setup_theme    通常用于初始化主题设置/选项。这是可用于主题的第一个动作挂钩,在激活主题的functions.php文件加载后立即触发。add_theme_support()应该在这里调用,因为init动作钩子来不及添加一些功能。在此阶段,当前用户尚未认证。
auth_cookie_malformed
auth_cookie_valid
set_current_user
在里面    通常由插件用来初始化。目前,当前用户已经通过身份验证。
└─ widgets_init    用于注册边栏。以“ init”优先级1触发(因此在优先级≥1的“ init”动作之前执行!)
register_sidebar    对于每个侧边栏和页脚区域
wp_register_sidebar_widget    对于每个小部件
wp_default_scripts    (参考数组)
wp_default_styles    (参考数组)
admin_bar_init
add_admin_bar_menus
wp_loaded    WordPress完全加载后
parse_request    允许处理HTTP请求处理(参考数组)
send_headers    允许自定义HTTP标头(参考数组)
parse_query    设置查询变量后(引用数组)
pre_get_posts    在执行查询之前公开查询变量对象。(参考数组)
posts_selection    由缓存插件使用。
wp    设置WP对象后(引用数组)
template_redirect    在确定要加载哪个模板之前。
get_header    在加载头模板文件之前。
wp_enqueue_scripts    脚本和样式排入队列时。
二十一个enqueue_color_scheme    (特定于二十一)
wp_head    用于在前端的head标签中打印脚本或数据。
wp_print_styles    在打印$ handles队列中的样式之前。
wp_print_scripts    在打印$ handles队列中的脚本之前。
get_search_form
loop_start    (参考数组)
the_post    (引用数组)允许在查询后立即修改post对象
get_template_part_content    内容的模板部分
loop_end    (参考数组)
get_sidebar    在加载侧栏模板文件之前。
dynamic_sidebar    在调用小部件的显示回调之前。
get_search_form
pre_get_comments    (参考数组)
wp_meta    在边栏中显示回显内容之前。
get_footer    在加载页脚模板文件之前。
get_sidebar    在加载侧栏模板文件之前。
二十一信用    (特定于二十一)
wp_footer    在确定要加载哪个模板之前。
wp_print_footer_scripts    打印页脚脚本时。
admin_bar_menu    (参考数组)
wp_before_admin_bar_render    在呈现管理栏之前。
wp_after_admin_bar_render    呈现管理栏之后。
关掉    在PHP执行即将结束之前。
在管理页面请求期间运行的操作
当登录用户打开版本3.3.1中的“ 帖子”页面时,将运行这些操作。该列表仅显示首次调用动作,并且在许多情况下,没有函数挂接到该动作。每个管理页面都有不同的操作列表,具体取决于该页面的目的和所安装的插件。此列表应被视为指南或近似值,而不是具体规范。

在这些操作中,(挂钩名称)取决于页面。对于“帖子”页面,它是edit.php;对于主题的“背景”页面,它是presenting_page_custom -background。

动作是通过do_action()函数调用的,标记为(ref array)的动作除外,它们是通过do_action_ref_array()函数调用的。

muplugins_loaded    在必须使用的插件加载后
registered_taxonomy    对于类别,post_tag 等
Registered_post_type    用于帖子,页面等
plugins_loaded    加载活动插件和可插拔功能后
sanitize_comment_cookies
setup_theme
load_textdomain    对于域默认
after_setup_theme    在此阶段,当前用户尚未认证。
load_textdomain    对于域二十一
auth_cookie_valid
set_current_user
在里面    通常由插件用来初始化。目前,当前用户已经通过身份验证。
└─ widgets_init    用于注册边栏。以“ init”触发,优先级为1。
register_sidebar    对于每个侧边栏
wp_register_sidebar_widget    对于每个小部件
wp_default_scripts    (参考数组)
wp_default_styles    (参考数组)
admin_bar_init
add_admin_bar_menus
wp_loaded    WordPress完全加载后
auth_cookie_valid
auth_redirect
admin_menu    另请参见:user_admin_menu,network_admin_menu
管理员菜单    另请参阅:user_admin_menu,network_admin_menu
admin_init
current_screen
加载-(页)
send_headers    可以在其中添加自定义HTTP标头的位置
pre_get_posts    在执行查询之前公开查询变量对象。(参考数组)
posts_selection
wp    设置WP对象后(引用数组)
admin_xml_ns
admin_xml_ns
admin_enqueue_scripts
admin_print_styles-(挂钩名称)
admin_print_styles
admin_print_scripts-(挂钩名称)
admin_print_scripts
wp_print_scripts
admin_head-(钩名)
admin_head
管理员菜单
in_admin_header
admin_notices
all_admin_notices
(挂钩名称)
strict_manage_posts
the_post    (参考数组)
pre_user_query    (参考数组)
in_admin_footer
admin_footer
admin_bar_menu    (参考数组)
wp_before_admin_bar_render
wp_after_admin_bar_render
admin_print_footer_scripts
admin_footer-(挂钩名称)    管理员页面页脚
关掉    PHP执行即将结束
wp_dashboard_setup    允许自定义管理仪表板
帖子,页面,附件和类别操作(管理员)
post_submitbox_misc_actions
在生成编辑页面以将一些内容(例如字段)添加到提交框(显示发布按钮的位置)时运行。没有函数参数。
添加附件
在附件首次添加到数据库时运行。动作函数参数:附件ID。
add_category
与create_category相同。
category_add_form_fields
在admin中指定类别添加表单时运行。在提交按钮之前在此表单中添加字段很有用
category_edit_form
在admin中创建类别编辑表单时运行。在此表单中添加新字段很有用
clean_post_cache
在清理后缓存时运行。动作函数参数:帖子ID。参见clean_post_cache()。
create_category
创建新类别时运行。动作函数参数:类别ID。
delete_attachment
从数据库删除附件之前运行。动作函数参数:附件ID。(在版本2.8之前,删除附件后触发了此挂钩。)
delete_category
在从数据库中删除类别并更新其相应的链接/帖子以删除该类别之后运行。动作函数参数:类别ID。
wp_trash_post
在帖子或页面即将被垃圾回收时运行。动作函数参数:帖子或页面ID。
trashed_post
在帖子或页面被删除后立即运行。动作函数参数:帖子或页面ID。
untrash_post
恢复帖子或页面时,在取消删除之前运行。动作函数参数:帖子或页面ID。
untrashed_post
恢复帖子或页面后,在取消删除后立即运行。动作函数参数:帖子或页面ID。
before_delete_post
当帖子或页面即将被删除时运行。注释,附件和元数据仍然可用。动作函数参数:帖子或页面ID。
delete_post
当帖子或页面即将被删除时运行。注释,附件和元数据已被删除。动作函数参数:帖子或页面ID。
Deleted_post
在帖子或页面被删除后立即运行。动作函数参数:帖子或页面ID。
edit_attachment
在将附件编辑/更新到数据库时运行。动作函数参数:附件ID。
edit_category
在更新/编辑类别时运行,包括添加/删除帖子或博客链接或更新其类别(这会导致该类别的计数更新)时运行。动作函数参数:类别ID。
edit_post
在更新或编辑帖子或页面时运行,包括添加或更新评论(这会导致帖子的评论计数更新)时运行。动作函数参数:帖子或页面ID。
pre_post_update
在帖子或页面更新之前运行。动作函数参数:帖子或页面ID。
post_updated
在帖子或页面更新后运行。动作函数参数:更新之前或更新之后的帖子或页面ID,帖子的WP_Post对象。
transition_post_status
在发生任何发布状态转换时运行。动作函数参数:$ new_status,$ old_status,$ post对象。(另请参见发布状态转换。)
(旧状态)到(新状态)
当帖子的状态从$ old_status更改为$ new_status时运行。动作函数参数:$ post对象。(另请参见发布状态转换。)
(状态)(职位类型)
当类型$ post_type的帖子从任何其他状态过渡到$ status时运行。动作函数自变量:帖子ID,$ post对象。(另请参见发布状态转换。)
publish_post(不建议使用)
在发布帖子或对其进行编辑并且其状态更改为“已发布”时运行。该动作挂钩符合(status)(post_type)动作挂钩类型。动作函数自变量:帖子ID,$ post对象。(另请参见发布状态转换。)
publish_page
在发布页面或对其进行编辑并且其状态更改为“已发布”时运行。该动作挂钩符合(status)(post_type)动作挂钩类型。动作函数自变量:帖子ID,$ post对象。(另请参见发布状态转换。)
publish_phone
通过电子邮件添加帖子后运行。动作函数参数:帖子ID。
publish_future_post
在发布将来的帖子或页面时运行。动作函数参数:帖子ID。
save_post
每当创建或更新帖子或页面时运行,该帖子或页面可以来自导入,帖子/页面编辑表单,xmlrpc或通过电子邮件发布。动作函数参数:发布ID和发布对象。将数据保存到数据库后运行。请注意,帖子ID可能引用帖子修订,而不是最后保存的帖子。使用wp_is_post_revision()获取真实帖子的ID。
Updated_postmeta
在元数据已更新时运行。
wp_insert_post
与save_post相同,此后立即运行。
xmlrpc_publish_post
通过XMLRPC请求发布帖子时,或者通过XMLRPC编辑帖子且其状态为“已发布”时运行。动作函数参数:帖子ID。
分类和术语
create_term
在创建新术语之后,在清理术语缓存之前运行。
created_term
在创建新术语以及清除术语缓存后运行。
create $分类
在为特定分类法创建新术语后运行。
created_ $分类
在创建特定分类法中的新术语之后以及清除术语缓存后运行。
add_term_relationship(从2.9.0版开始)
在添加对象项关系之前运行。
add_term_relationship(从2.9.0版开始)
在添加对象项关系之后运行。
set_object_terms(从2.8.0版开始)
在设置对象的条件后运行。
edit_terms(从2.9.0版开始)
在编辑给定术语之前运行。
edited_terms
在将分类法/类别更改保存在数据库中后运行。
edit_term_taxonomy
在更新术语-分类法关系之前运行。
edited_term_taxonomy
在术语-分类关系更新后运行。
edit_term_taxonomies(从2.9.0版开始)
在将删除项的子项重新分配给父项之前运行。
edited_term_taxonomies(从2.9.0版开始)
在删除项的子项重新分配父项之后运行。
edit_ $分类
在为特定分类法编辑术语后运行。
edited_ $分类
在特定分类法中的术语被编辑之后,以及术语缓存被清除之后运行。
pre_delete_term(从4.1.0版开始)
在对帖子或条款进行任何修改之前运行。
delete_term_taxonomy(从2.9.0版开始)
在从数据库中删除术语分类法ID之前运行(更改了孩子的术语之后)。
delete_term_taxonomy(从2.9.0版开始)
在删除术语分类法ID之后运行。
delete_term(从2.5.0版开始)
从数据库中删除术语并清除缓存后运行。(参数:$ Term_ID,$ Term_taxonomy_ID,$ Taxonomy_slug,$ already_deleted_term)
delete_ $ taxonomy(从2.3.0版开始)
删除特定分类法中的术语后运行。(参数:$ Term_ID,$ Term_taxonomy_ID,$ already_deleted_term)
Deleted_ $分类
在删除特定分类法中的术语之后以及清除术语缓存后运行。
delete_term_relationships(从2.9.0版开始)
在删除对象术语关系之前运行。
Deleted_term_relationships(从2.9.0版开始)
在删除对象项关系之后运行。
clean_object_term_cache(自2.5.0版开始)
在清除对象术语缓存后运行。
clean_term_cache(自2.5.0版开始)
在清除每个分类法的术语缓存之后运行。
split_shared_term(从4.2.0版开始)
在先前共享的分类术语被拆分为两个单独的术语之后运行。
pre_term_description
在将分类术语的描述保存到数据库之前运行。
pre_category_description
在将类别的描述保存到数据库之前运行。
评论,Ping和引用动作
comment_closed
在尝试显示评论条目表单时将该帖子标记为不允许评论时运行。动作函数参数:帖子ID。
comment_id_not_found
在尝试显示评论或评论输入表单时未找到帖子ID时运行。动作函数参数:帖子ID。
comment_flood_trigger
在检测到评论泛滥时运行,就在调用wp_die以停止接受评论之前。动作函数自变量:上一条评论的时间,当前评论的时间。
comment_(旧状态)to(新状态)
在发生注释状态转换时运行。动作函数参数:Comment对象。
comment_on_draft
当帖子为草稿时尝试显示评论输入表单或评论时运行。动作函数参数:帖子ID。
comment_post
将注释保存在数据库中后立即运行。动作函数参数:注释ID,批准状态(“垃圾邮件”,或0/1(表示不批准/已批准))。
edit_comment
在数据库中更新/编辑注释后运行。动作函数参数:注释ID。
delete_comment
从数据库中删除评论之前立即触发。动作函数参数:注释ID。
Deleted_comment
从数据库中删除评论后立即触发。动作函数参数:注释ID。
垃圾评论
在将评论发送到垃圾箱之前立即触发。动作函数参数:注释ID。
垃圾评论
将评论发送到回收站后立即触发。动作函数参数:注释ID。
untrash_comment
从垃圾桶还原评论之前立即触发。动作函数参数:注释ID。
untrashed_comment
从垃圾桶还原评论后立即触发。动作函数参数:注释ID。
spam_comment
在评论标记为垃圾邮件之前立即触发。动作函数参数:注释ID。
spammed_comment
将评论标记为垃圾邮件后立即触发。动作函数参数:注释ID。
unspam_comment
在评论未标记为垃圾邮件之前立即触发。动作函数参数:注释ID。
unspammed_comment
在评论未标记为垃圾邮件后立即触发。动作函数参数:注释ID。
pingback_post
将ping添加到帖子时运行。动作函数参数:注释ID。
pre_ping
在完全处理ping之前运行。动作函数参数:要处理的帖子链接的数组,以及帖子的“ pung”设置。
trackback_post
将引用引用添加到帖子时运行。动作函数参数:注释ID。
wp_blacklist_check
运行以检查是否应将评论列入黑名单。动作函数参数:作者姓名,作者电子邮件,作者URL,注释文本,作者IP地址,作者的用户代理(浏览器)。您的函数可以执行wp_die拒绝评论,或者修改输入参数之一,使其包含WordPress选项中设置的黑名单关键字之一。
wp_insert_comment
每当创建注释时运行。
wp_set_comment_status
当注释状态更改时运行。动作函数自变量:注释ID,指示新状态的状态字符串(“删除”,“批准”,“垃圾邮件”,“保留”)。
Blogroll操作
add_link
当新的Blogroll链接首次添加到数据库时运行。动作函数参数:链接ID。
delete_link
删除Blogroll链接时运行。动作函数参数:链接ID。
编辑链接
编辑Blogroll链接时运行。动作函数参数:链接ID。
提要动作
atom_entry
在原子供稿中每个博客条目的条目信息被打印之后(但在关闭条目标签之前)运行。
atom_head
在博客信息已打印到原子供稿中之后,在第一个条目之前运行。
atom_ns
在原子供稿的根XML元素内运行(以添加名称空间)。
commentrss2_item
在评论供稿中打印单个评论的信息之后(但在关闭item标记之前)运行。动作函数参数:注释ID,帖子ID。
do_feed_ (提要)
在生成供稿时运行,其中供稿是供稿的类型(rss2,atom,rdf等)。在打印Feed 之前,请使用小于10的优先级运行。动作函数参数:true(提要用于评论)或false(用于帖子)。
rdf_header
在将博客信息打印到RDF feed中之后,即在第一个条目之前,即运行。
rdf_item
在为RDF提要中的每个博客条目打印条目信息之后(但在关闭item标签之前)运行。
rdf_ns
在RDF提要中的根XML元素内运行(以添加名称空间)。
rss_head
在博客信息已在RSS提要中打印之后,在第一个条目之前运行。
rss_item
在RSS提要中为每个博客条目打印条目信息之后(但在关闭item标记之前)运行。
rss2_head
在将博客信息打印在RSS 2 feed中之后,在第一个条目之前运行。
rss2_item
在RSS 2 feed中为每个博客条目打印条目信息之后(但在关闭item标记之前)运行。
rss2_ns
在RSS 2 feed中的根XML元素内运行(以添加名称空间)。
模板动作
after_setup_theme
在主题初始化期间运行。通常用于执行主题的基本设置,注册和初始化操作。
comment_form
在由comment_form()呈现的注释表单的底部,紧接在</ form>之前运行。动作函数参数:帖子ID。
comment_form_after
在结束</ div>之后,由comment_form()呈现注释表单后运行。
do_robots
当模板文件选择器确定它是robots.txt请求时运行。
do_robotstxt
在do_robots()函数中运行,然后打印出robots.txt文件的“禁止”列表。
get_footer
在模板调用footer.php模板文件之前,在模板调用get_footer()函数时运行。
get_header
在模板调用get_header()函数时(在header.php模板文件加载之前)运行。
switch_theme
当博客的主题更改时运行。动作函数自变量:新主题的名称。如果用于主题中,则仅当添加了操作的主题被禁用时,该主题才起作用。
after_switch_theme
当博客的主题更改时运行。动作函数自变量:新主题的名称。如果用于主题中,则只有在添加了动作的主题被启用的情况下,该主题才起作用。启用主题时可用于运行某些代码。
load-themes.php
在激活或停用主题(由其他主题替代)时运行。
template_redirect
在确定用于显示所请求页面的模板文件之前运行。
wp_footer
当模板调用wp_footer()函数时运行,通常在博客页面底部附近。
wp_head
当模板调用wp_head()函数时运行。该挂钩通常位于和</ head>之间的页面模板顶部附近。这个钩子没有任何参数。
wp_meta
在sidebar.php模板文件调用wp_meta()函数时运行,以允许插件将内容插入到侧栏中。
wp_print_scripts
在WordPress将注册的JavaScript脚本打印到页面页眉之前运行。
行政行为
activate_(插件文件名)
在首次激活插件时运行。参见Function_Reference / register_activation_hook。
activity_box_end
在管理仪表板屏幕上活动框的末尾运行。
add_category_form_pre
在将添加类别表单放在管理菜单的屏幕上之前运行。
add_option_(选项名称)
在add_option()函数添加了WordPress选项后运行。动作函数参数:选项名称,选项值。您必须为要响应的特定选项添加操作,例如添加了选项“ foo”后才能响应的“ add_option_foo”。
add_option
在将选项添加到数据库之前运行。
add_option
在添加选项后运行。
admin_head
在管理面板的HTML 部分中运行。
admin_head-(page_hook)或admin_head-(plugin_page)
在特定管理页面的HTML 部分或由插件生成的页面的管理面板中运行。
admin_init
在呈现该页面之前,在每个管理页面的开头运行。请参阅wp-admin / admin.php,wp-admin / admin-post.php和wp-admin / admin-ajax.php。
admin_footer-(plugin_page)
在插件生成页面的管理面板的部分的末尾运行。
admin_post_(操作)
还:admin_post_nopriv_(action) -为未指定的GET或POST请求运行处理程序。
admin_footer
在body标签内管理面板的末尾运行
admin_enqueue_scripts
在HTML标头中运行,因此插件或主题可以将JavaScript和CSS排入所有管理页面。
admin_print_scripts
在HTML标头中运行,因此插件可以将JavaScript脚本添加到所有管理页面。
admin_print_scripts-(page_hook)或admin_print_scripts-(plugin_page)
在特定的插件生成的管理页面的HTML标头部分运行以打印JavaScript脚本。使用将插件菜单项添加到管理菜单的任何功能时,将返回(page_hook):add_management_page(),add_options_page()等。示例:
函数myplugin_menu(){
如果(function_exists(’add_management_page’)){
$ page = add_management_page(’myplugin’,’myplugin’,’manage_options’,’myplugin_slug’,’myplugin_admin_page’);
add_action(“ admin_print_scripts- $ page”,’myplugin_admin_head’);
}
}
admin_print_styles
在HTML标头中运行,因此插件可以将CSS /样式表添加到所有管理页面。
admin_print_styles-(page_hook)或admin_print_style-(plugin_page)
当样式应使用wp_enqueue_style()排入特定管理页面时运行。使用诸如add_submenu_page()之类的函数的返回值来确定(page_hook)的值。
check_passwords
在创建新用户时运行以验证密码的两次输入。动作函数参数:登录名,第一密码,第二密码的数组。
dbx_page_advanced
在管理菜单中页面编辑屏幕上“高级”部分的底部运行。
dbx_page_sidebar
在管理菜单页面编辑屏幕的侧边栏底部运行。
dbx_post_advanced
在管理菜单的帖子编辑屏幕上“高级”部分的底部运行。
dbx_post_sidebar
在管理菜单的帖子编辑屏幕上,在侧栏底部运行。在Wordpress 2.5及更高版本中使用add_meta_box()。
deactivate_(插件文件名)
当插件被停用时运行。
delete_option_(选项名称)
在delete_option()函数删除WordPress选项后运行。动作函数参数:选项名称。您必须为要响应的特定选项添加操作,例如“ delete_option_foo”,以在删除选项“ foo”时做出响应。
delete_option
在从数据库中删除选项之前运行。
Deleted_option
删除选项后运行。
delete_user
在删除用户时运行。动作函数参数:用户标识。
edit_category_form
在将添加/编辑类别表单显示在屏幕上之后(但在HTML表单标签的末尾之前)运行。
edit_category_form_pre
在将编辑类别表单放在管理菜单的屏幕上之前运行。
edit_tag_form
在将添加/编辑标签表单显示在屏幕上之后(但在HTML表单标签结尾之前)运行。
edit_tag_form_pre
在将编辑标签表单放在管理菜单的屏幕上之前运行。
edit_form_top
在WordPress帖子编辑屏幕上的标题(和自定义帖子类型)上的标题之前,但在初始隐藏字段(user_ID,操作等)之后的表单中运行。
edit_form_after_title
在WordPress帖子编辑屏幕(和自定义帖子类型)上的标题之后但在内置WordPress内容区域之前运行。
edit_form_after_editor
在WordPress帖子编辑器之后但在所有其他meta框之前运行。在自定义帖子类型中也可用。
edit_form_advanced
在管理菜单中帖子编辑表单的“高级”部分之前运行。
edit_page_form
在管理菜单中页面编辑表单的“高级”部分之前运行。
edit_user_profile
在管理菜单中用户个人资料编辑屏幕的末尾附近运行。
加载-(页)
在加载管理菜单页面时运行。通常不会直接添加此操作- 有关如何添加管理菜单的更多详细信息,请参见添加管理菜单。如果确实要直接使用它,则add_options_page()和类似函数的返回值将为您提供动作名称的“(页面)”部分。
登录表格
在登录表单末尾之前运行。
login_head
在登录页面的HTML标头部分的末尾之前运行。
忘记密码
在登录屏幕上打印“通过电子邮件获取密码”表单之前运行。
lostpassword_form
在用于通过电子邮件检索用户密码的表格末尾运行,以允许插件提供额外的字段。
lostpassword_post
当用户请求一封电子邮件以检索其密码时运行,以允许插件在处理之前修改PHP $ POST变量。
manage_link_custom_column
当Blogroll管理管理员屏幕的列名未知时运行。动作函数参数:列名,链接ID。另请参阅“ 插件API /过滤器参考”中的过滤器manage_link_columns,其中添加了自定义列。
manage_posts_custom_column
当管理职位“管理”屏幕的列名未知时运行。动作函数参数:列名,帖子ID。另请参阅“ 插件API /过滤器参考”中的filter manage_posts_columns,其中添加了自定义列。(有关示例和用法,请参见Scompt的教程。)
manage_pages_custom_column
当管理页面“管理”屏幕的列名未知时运行。动作函数参数:列名,页面ID。另请参阅“ 插件API /过滤器参考”中的过滤器manage_pages_columns,其中添加了自定义列。
manage_media_custom_column
当管理媒体管理屏幕的列名未知时运行。动作函数参数:列名,页面ID。另请参阅“ 插件API /过滤器参考”中的过滤器manage_media_columns,其中添加了自定义列。
manage _ {$ post_type} posts_custom_column
当管理自定义帖子类型admin屏幕的列名未知时运行。动作函数参数:列名,帖子ID。另请参阅“ 插件API /过滤器参考”中的过滤器manage _ $ {post_type} posts_columns,其中添加了用于自定义帖子类型的自定义列。
重设密码
在用户的密码重置为随机的新密码之前运行。
personal_options_update
当用户从管理屏幕更新个人选项时运行。
plugins_loaded
在所有插件均已加载后运行。
profile_personal_options
在用户个人资料编辑屏幕的“个人选项”部分的末尾运行。
profile_update
在更新用户的配置文件时运行。动作函数参数:用户标识。
quick_edit_custom_box
在创建快速编辑器时,当列名未知时运行。
register_form
在新用户注册表单的末尾之前运行。
register_post
在处理新的用户注册请求之前运行。
strict_manage_posts
在管理菜单的屏幕上显示要编辑的帖子列表之前运行。
找回密码
在检索用户密码时运行,以向他们发送提醒电子邮件。动作函数参数:登录名。
set_current_user
在默认的wp_set_current_user()函数更改用户后运行。注意,wp_set_current_user()也是一个“可插入”功能,这意味着插件可以覆盖它。请参阅插件API)。
show_user_profile
在用户个人资料编辑屏幕的结尾附近运行。
sidebar_admin_page
在窗口小部件管理页面上的主要内容之后运行。
sidebar_admin_setup
在编辑侧边栏中显示的窗口小部件时尽早运行。
simple_edit_form
在管理菜单中的“简单”帖子编辑表单的末尾运行(默认情况下,简单表单仅用于书签-它没有“高级”部分)。
update_option(选项名称)
在update_option()函数更新了WordPress选项后运行。动作函数参数:旧选项值,新选项值。您必须为要响应的特定选项添加操作,例如“ update_option_foo”,以在选项“ foo”更新后响应。
update_option
在将选项更新到数据库之前运行。
Updated_option
在更新选项后运行。
upload_files(标签)
运行以在上传文件管理屏幕上打印屏幕;“选项卡”是自定义操作选项卡的名称。使用wp_upload_tabs过滤器定义自定义标签(请参阅插件API /过滤器参考)。
user_new_form
在“添加新用户”屏幕的末尾运行。动作函数自变量:在多站点上为网络管理员传递字符串“ add-existing-user”,在单个站点上传递“ add-new-user”。
user_profile_update_errors
在将更新的用户详细信息提交到数据库之前运行。
wpmu_new_user
在多站点环境中首次创建用户配置文件时运行。动作函数参数:用户标识。如果不在多站点中,则使用user_register。
user_register
在首次创建用户个人资料时运行。动作函数参数:用户标识。
welcome_panel
使您可以隐藏仪表板中的“欢迎使用面板”。这也是一个智能过滤器,它隐藏了相关的屏幕选项。
wp_ajax(动作)
还:wp_ajax_nopriv_(action)-运行以执行未知类型的AJAX请求处理程序。
wp_authenticate
在用户登录时运行以对用户进行身份验证。动作函数参数:具有用户名和密码的数组。
wp_login
用户登录时运行。
wp_logout
用户注销时运行。
仪表板“立即操作”小部件操作
right_now_content_table_end
在“立即操作仪表板”小部件的内容列的底部添加表行。
right_now_table_end
在“立即显示板”小部件的“讨论”列中显示垃圾邮件评论数后调用。
right_now_discussion_table_end
在显示“垃圾邮件”评论的数量之后,并在“立即显示板”窗口小部件的“讨论”列中的right_now_table_end操作之后调用。
right_now_end
在“立即显示板”窗口小部件上显示当前版本信息后调用。(注意:在v3.4中,这实际上是rightnow_end。请参见故障单#21046。)
activity_box_end
在“立即显示板”小部件上调用的最后一个动作。
进阶动作
本部分包含与WordPress用于确定要显示的帖子,WordPress循环,激活插件以及其他基本级别WordPress代码的查询有关的操作。

activate_plugin
任何成功激活任何插件即可运行
add_meta_boxes
在“编辑帖子”页面加载时运行。(3.0以上)
管理员菜单
在基本的管理面板菜单结构就绪后运行。
network_admin_notices
在将管理菜单打印到网络管理屏幕后运行。
user_admin_notices
在将管理菜单打印到用户管理屏幕后运行。
admin_notices
在将管理菜单打印到不是网络或用户管理屏幕的屏幕后运行。
all_admin_notices
在将管理菜单打印到所有屏幕后运行。
blog_privacy_selector
在默认的博客隐私选项显示在屏幕上后运行。
check_admin_referer
为了安全起见,在检查了随机数后,将在默认的check_admin_referrer()函数中运行,以允许插件出于额外的安全原因而迫使WordPress死亡。注意,check_admin_referrer也是一个“可插入”功能,这意味着插件可以覆盖它。请参阅插件API)。
check_ajax_referer
在成功通过cookie验证了用户的登录名和密码之后,在默认的check_ajax_referer()函数(当AJAX请求转到wp-admin / admin-ajax.php脚本时调用)中运行,以允许插件强制使用WordPress因额外的安全原因而死亡。注意,check_ajax_referer也是一个“可插入”功能,这意味着插件可以覆盖它。请参阅插件API)。
custom_controls_enqueue_scripts
在调用custom_controls_init之后调用WP Theme Customizer后触发,执行其操作/回调,并使其自身的样式和脚本排队,因此您可以使用此挂钩为WP Theme Customizer注册自己的脚本和样式。与主题自定义API配合使用(从3.4版开始)。
custom_register
在每个请求上运行,使开发人员可以注册新的主题选项和控件,以供主题自定义API使用(从3.4版开始)。
custom_preview_init
仅允许您直接在主题定制器中使资产(例如javascript文件)入队。与主题自定义API配合使用(从3.4版开始)。
deactivated_plugin
在成功停用任何插件的任何时间运行
generate_rewrite_rules
在生成重写规则之后运行。动作函数自变量:WP_Rewrite对象($ wp_rewrite)通过引用。请注意,使用rewrite_rules_array过滤器而不是此操作更容易修改重写规则。
在里面
在WordPress完成加载之后但在发送任何标头之前运行。对于拦截$ _GET或$ POST触发器很有用。
loop_end
在处理WordPress循环的最后一个帖子后运行。
loop_start
在处理WordPress循环的第一篇文章之前运行。
network_admin_menu
在为“ 网络管理”页面准备基本菜单结构时运行。(管理菜单)
parse_query
在主查询或WP_Query的任何实例中的查询解析结束时运行,例如query_posts,get_posts或get_children。动作函数参数:WP_Query对象按引用。
parse_request
在主WordPress函数wp中解析查询请求后运行。动作函数自变量:WP对象($ wp)通过引用。
pre_get_posts
在主查询或WP_Query的任何实例中执行查询之前运行,例如query_posts(),get_posts()或get_children()。在创建查询变量对象之后,但在实际运行查询之前,将调用此挂钩,并且可用于在运行主查询之前更改主查询。另请参见is_main_query()。动作函数参数:WP_Query对象按引用。
sanitize_comment_cookies
从HTTP请求读取cookie后运行。
send_headers
在基本的HTTP标头在主要的WordPress函数wp()中发送后运行。动作函数自变量:WP对象($ wp)通过引用。
关掉
页面输出完成后运行。
update(meta_type)meta
保存元数据时运行。
Updated(meta_type)_meta
在元数据已更新时运行。
upgrader_process_complete
当插件下载程序/升级程序类完成运行时运行
wp_loaded
一旦WP,所有插件和主题完全加载并实例化,就会触发此钩子。
wp
在查询被解析并加载后,但在任何模板执行之前,在主要的WordPress函数wp()中执行。如果您需要访问发布数据但不能使用模板进行输出,则很有用。动作函数自变量:WP对象($ wp)通过引用

禁止crontab -r清空定时任务列表误操作

关于crontab
1、附件cron.sh放/usr/bin目录下面
2、在/etc/bashrc文件末尾添加
alias crontab=’/usr/bin/cron.sh’

或者在当前root用户下在~/.bashrc文件末尾添加:
alias crontab=’/usr/bin/cron.sh’

===================================
cron.sh作用
1、禁止crontab -r
2、每次编辑都备份cron列表到~/cronbak目录下面

##########cron.sh

#!/bin/bash
source ~/.bashrc

etime=`date -d "0 days ago" +%Y%m%d_%H%M%S`

if [ "$1" = "-r" ] ; then
    echo "My God! Dangerous..."
    echo "Exit..."
    exit 2
fi

if [ "$1" = "-l" ] ; then
    /usr/bin/crontab -l
    exit 0
fi

if [ "$1" = "-e" ] ; then
    mkdir -p  ~/cronbak
    /usr/bin/crontab -l  >  ~/cronbak/cron.bak.$etime.a
    /usr/bin/crontab -e
    /usr/bin/crontab -l  >  ~/cronbak/cron.bak.$etime.b
fi

#linux

portainer清理docker文件

docker安装教程一堆

我这里使用dokcer-compose部署的所以下面是配置

portainer:
image: portainer/portainer
restart: always
ports:
– “9000:9000”
volumes:
– /var/run/docker.sock:/var/run/docker.sock
– /data/docker/portainer/data:/data
up -d 起来以后 nginx把端口搞出来,访问丫的

把那些【unuse】的全【remove】完事

VMware安装CentOS后时间相差8小时解决方法

1、执行date查看时区设置是否正确,如果是CST就是中国标准时间

2、将/etc/localtime指向上海时间

ln –sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、下载ntp(前提是机器能联网)

yum –y install ntp
4、执行对时

ntpdate cn.pool.ntp.org
5、对时后再次执行date查看时间,如果已经是正确的时间则进入下一步

6、将系统时间写入硬件(这步如果不执行重启机器后时间又会出问题)

hwclock -w

【Java】Springboot集成Druid

Springboot集成Druid方案:一个是在POM中直接配置druid-spring-boot-starter,不用写任何代码;一个是配置druid,写几行代码,可以加入;在方案一基础上加入stat、wall后进行验证登录。

测试环境是:SpringBoot2.1.4.RELEASE。

一、直接使用druid-spring-boot-starter

1、POM配置

复制代码
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--自启动Druid管理后台-->
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid-spring-boot-starter</artifactId>
                    <version>1.1.10</version>
                </dependency>
复制代码

2、application.properties配置

复制代码
### db config ###
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/XXX?useUnicode=true&characterEncoding=utf8&currentSchema=public
spring.datasource.username=postgres
spring.datasource.password=XXX
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#config druid
#连接池的设置
#初始化时建立物理连接的个数
spring.datasource.druid.initial-size=5
#最小连接池数量
spring.datasource.druid.min-idle=5
#最大连接池数量 maxIdle已经不再使用
spring.datasource.druid.max-active=20
#获取连接时最大等待时间,单位毫秒
spring.datasource.druid.max-wait=60000
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
spring.datasource.druid.test-while-idle=true
#既作为检测的间隔时间又作为testWhileIdel执行的依据
spring.datasource.druid.time-between-eviction-runs-millis=60000
#销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接
spring.datasource.druid.min-evictable-idle-time-millis=30000
#用来检测连接是否有效的sql 必须是一个查询语句
#mysql中为 select 'x'
#oracle中为 select 1 from dual
spring.datasource.druid.validation-query=select 'x'
#申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
spring.datasource.druid.test-on-borrow=false
#归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
spring.datasource.druid.test-on-return=false
#当数据库抛出不可恢复的异常时,抛弃该连接
spring.datasource.druid.exception-sorter=true
#是否缓存preparedStatement,mysql5.5+建议开启
#spring.datasource.druid.pool-prepared-statements=true
#当值大于0时poolPreparedStatements会自动修改为true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#配置扩展插件
spring.datasource.druid.filters=stat,wall
#通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#合并多个DruidDataSource的监控数据
spring.datasource.druid.use-global-data-source-stat=true
#设置访问druid监控页的账号和密码,默认没有
#spring.datasource.druid.stat-view-servlet.login-username=admin
#spring.datasource.druid.stat-view-servlet.login-password=admin

### mybatis config ###
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.jrsc.supervisor.model
### log config ###
logging.config=classpath:logback-spring.xml
复制代码

3、输入http://localhost:9091/druid/webapp.html后,即可看到Druid监控面板

PS:广告无处不在

 

二、使用代码,可验证登录的方案

1、POM配置,删除:druid-spring-boot-starter

复制代码
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--自启动Druid管理后台-->
        <!--        <dependency>-->
        <!--            <groupId>com.alibaba</groupId>-->
        <!--            <artifactId>druid-spring-boot-starter</artifactId>-->
        <!--            <version>1.1.10</version>-->
        <!--        </dependency>-->
复制代码

2、application.properties配置不变

3、新建一个类:DruidConfig,注意包的引入,特别是:

复制代码
package com.jrsc.supervisor.druid;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
复制代码

3、DruidConfig具体实现如下:

复制代码
@Configuration
public class DruidConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource getDataSource() {
        return new DruidDataSource();
    }

    @Bean
    public ServletRegistrationBean druidStatViewServlet() {
        //ServletRegistrationBean提供类的进行注册
        ServletRegistrationBean servletRegistrationBean =
                new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        //添加初始化参数:initParams
        //白名单:
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        //IP黑名单(同时存在时,deny优先于allow)
        //如果满足deny,就提示:sorry,you are not permitted to view this page
        servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
        //登录查看信息的账号和密码
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }


    @Bean
    public FilterRegistrationBean druidStatFilter() {
        FilterRegistrationBean filterRegistrationBean =
                new FilterRegistrationBean(new WebStatFilter());
        //添加过滤规则
        filterRegistrationBean.addUrlPatterns("/*");
        //添加需要忽略的格式信息
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif," +
                "*.jpg,*.png, *.css,*.ico,/druid/*");
        return filterRegistrationBean;

    }
复制代码

4、对于SpringBoot的启动类,加入注解:@ServletComponentScan

5、输入:http://localhost:9091/druid/sql.html,观察Druid监控面板

三、通过在方案一基础上加入如下代码,实现验证登录

复制代码
#设置访问druid监控页的账号和密码,默认没有
## Druid WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*
# Druid StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=

VMware虚拟机中Centos 6.x系统磁盘空间扩容实战

环境:
CentOS 6.9

平常在VMware上创建Linux系统虚拟机的时候,往往当时不会给太多的磁盘空间,在后期的使用过程中经常会遇到磁盘空间不足的情况,所以需要对Linux系统扩展磁盘空间。

扩展磁盘步骤:
1.磁盘扩展

注意:只能在虚拟机关机的情况下操作,并且这个虚拟机上没有磁盘快照文件,如有需要删除才可以扩展。

此时虽然在VMware虚拟机管理界面的扩容操作已经完成,但是这还只是扩容的第一步,后面还需要到操作系统内部进行操作。

2.查看分区信息

[root@test-centos6 ~]# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a16bc

Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2611 20458496 8e Linux LVM

Disk /dev/mapper/vg_testcentos6-lv_root: 18.8 GB, 18798870528 bytes
255 heads, 63 sectors/track, 2285 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/vg_testcentos6-lv_swap: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

[root@test-centos6 ~]# lsblk //列出块设备信息
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 447M 0 rom
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part
├─vg_testcentos6-lv_root (dm-0) 253:0 0 17.5G 0 lvm /
└─vg_testcentos6-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]

可以看到目前磁盘/dev/sda已经有两个分区,分别为sda1、sda2。

3.新建分区sda3

[root@test-centos6 ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It’s strongly recommended to
switch off the mode (command ‘c’) and change display units to
sectors (command ‘u’).

Command (m for help): m //列出可以执行的命令
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition //选择分区,删除现有分区
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help): n //建立新的磁盘分区
Command action
e extended //逻辑分区
p primary partition (1-4) //主分区
p //建立主分区
Partition number (1-4): 3 //输入分区号
First cylinder (2611-7832, default 2611): //分区起始位置(可直接回车也可以根据情况输入)
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-7832, default 7832): //回车
Using default value 7832

Command (m for help): p //列出磁盘目前的分区情况

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a16bc

Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2611 20458496 8e Linux LVM
/dev/sda3 2611 7832 41939020 83 Linux

Command (m for help): w //对分区操作进行保存
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks. //正在同步磁盘

[root@test-centos6 ~]# fdisk -l //查看分区创建情况

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a16bc

Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2611 20458496 8e Linux LVM
/dev/sda3 2611 7832 41939020 83 Linux

Disk /dev/mapper/vg_testcentos6-lv_root: 18.8 GB, 18798870528 bytes
255 heads, 63 sectors/track, 2285 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/vg_testcentos6-lv_swap: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

4.重启系统并格式化分区sda3文件系统

[root@test-centos6 ~]# reboot

[root@test-centos6 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 447M 0 rom
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 19.5G 0 part
│ ├─vg_testcentos6-lv_root (dm-0) 253:0 0 17.5G 0 lvm /
│ └─vg_testcentos6-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]
└─sda3 8:3 0 40G 0 part

[root@test-centos6 ~]# mkfs.ext4 /dev/sda3 //将/dev/sda3分区文件系统格式化为ext4
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2621440 inodes, 10484755 blocks
524237 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=4294967296
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624

正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

5.创建物理卷(pv)

此步骤可省略:当将分区直接添加到卷组(vg)时,LVM会自动将分区转换为物理卷(pv)。

[root@test-centos6 ~]# lvm
lvm> pvcreate /dev/sda3 //创建物理卷pv
Physical volume “/dev/sda3” successfully created
lvm> pvdisplay //显示物理卷pv信息
— Physical volume —
PV Name /dev/sda2
VG Name vg_testcentos6
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID jMIPOc-sduo-sl4T-6iQ5-ledQ-1w9O-cweeEC

“/dev/sda3” is a new physical volume of “40.00 GiB”
— NEW Physical volume —
PV Name /dev/sda3
VG Name
PV Size 40.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID PVrdc7-fUEX-PAxZ-ME92-IuNU-khDC-c5tYlp

lvm> pvdisplay
— Physical volume —
PV Name /dev/sda2
VG Name vg_testcentos6
PV Size 19.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4994
Free PE 0
Allocated PE 4994
PV UUID jMIPOc-sduo-sl4T-6iQ5-ledQ-1w9O-cweeEC

“/dev/sda3” is a new physical volume of “40.00 GiB”
— NEW Physical volume —
PV Name /dev/sda3
VG Name
PV Size 40.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID PVrdc7-fUEX-PAxZ-ME92-IuNU-khDC-c5tYlp

6.查看并创建卷组(vg)

lvm> vgdisplay //查看需要扩展的卷组vg名称
— Volume group —
VG Name vg_testcentos6 //卷组vg名称
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 3
Act PV 3
VG Size 59.49 GiB
PE Size 4.00 MiB
Total PE 17790
Alloc PE / Size 15232 / 19.50 GiB
Free PE / Size 2558 / 9.99 GiB
VG UUID yVVWYi-mV3I-f1WI-2QeH-HkVT-oBXP-2KkQ8v

lvm> vgextend vg_testcentos6 /dev/sda3 //扩展卷组(这里的“vg_testcentos6”名称为上面的卷组名称)
Volume group “vg_testcentos6” successfully extended

7.扩展逻辑卷(lv)

[root@test-centos6 ~]# df -h //查看扩展路径,这里也可以用fdisk -l查看
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_testcentos6-lv_root —–》 //**扩展路径**
18G 18G 0 100% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/sda1 485M 58M 403M 13% /boot

[root@test-centos6 ~]# lvm //进入LVM管理器

lvm> lvextend -L +39.99G /dev/mapper/vg_testcentos6-lv_root //扩展逻辑卷lv大小(通过fdisk -l/df -h查看要扩展过去的磁盘)
Rounding size to boundary between physical extents: 39.99 GiB.
Size of logical volume vg_testcentos6/lv_root changed from 17.51 GiB (4482 extents) to 57.50 GiB (14720 extents)
Logical volume lv_root successfully resized.

lvm> lvscan
ACTIVE ‘/dev/vg_testcentos6/lv_root’ [57.50 GiB] inherit
ACTIVE ‘/dev/vg_testcentos6/lv_swap’ [2.00 GiB] inherit

lvm> pvscan
PV /dev/sda2 VG vg_testcentos6 lvm2 [19.51 GiB / 0 free]
PV /dev/sda3 VG vg_testcentos6 lvm2 [39.99 GiB / 0 free]
Total: 2 [59.50 GiB] / in use: 2 [59.50 GiB] / in no VG: 0 [0 ]

lvm> exit
Exiting.

8.查看分区情况

[root@test-centos6 ~]# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a16bc

Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2611 20458496 8e Linux LVM
/dev/sda3 2611 7832 41939020 83 Linux

Disk /dev/mapper/vg_testcentos6-lv_root: 18.8 GB, 18798870528 bytes
255 heads, 63 sectors/track, 2285 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/vg_testcentos6-lv_swap: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

注意:上面虽然显示物理卷/dev/sdb3有40G空闲,但是这里不能全部使用,可能只有39.99G可以使用。

7.激活即重新读取磁盘信息

查看/dev/mapper/vg_testcentos6-lv_root的Type为ext4,所以使用resize2fs;如果文件类型是 xfs ,则使用xfs_growfs命令格式化。

[root@test-centos6 ~]# blkid //查看文件系统
/dev/sda1: UUID=”32a489a3-65c2-43a4-9aff-12c03eabc4dd” TYPE=”ext4″
/dev/sda2: UUID=”jMIPOc-sduo-sl4T-6iQ5-ledQ-1w9O-cweeEC” TYPE=”LVM2_member”
/dev/sda3: UUID=”PVrdc7-fUEX-PAxZ-ME92-IuNU-khDC-c5tYlp” TYPE=”LVM2_member”
/dev/mapper/vg_testcentos6-lv_root: UUID=”e8adf717-e78c-4845-a750-2a22a60689ed” TYPE=”ext4″ //可以看到文件系统格式化为ext4
/dev/mapper/vg_testcentos6-lv_swap: UUID=”ac33f130-95cc-4046-8bdd-db2d7c450f6d” TYPE=”swap”

[root@test-centos6 ~]# resize2fs /dev/mapper/vg_testcentos6-lv_root //ext4文件系统使用resize2fs
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vg_testcentos6-lv_root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 4
Performing an on-line resize of /dev/mapper/vg_testcentos6-lv_root to 15073280 (4k) blocks.
The filesystem on /dev/mapper/vg_testcentos6-lv_root is now 15073280 blocks long.

[root@test-centos6 ~]# df -h //查看激活状态
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_testcentos6-lv_root
57G 4.4G 50G 9% /
tmpfs 1.9G 244K 1.9G 1% /dev/shm
/dev/sda1 485M 58M 403M 13% /boot

可以看到现在我们的磁盘已经从最开始的19G扩展到了57G。

linux cpu 内存爆满 mysql停止_一文搞定MySQL性能调优

服务器硬件的优化
提升硬件设备,例如选择尽量高频率的内存(频率不能高于主板的支持)、提升网络带宽、使用SSD高速磁盘、提升CPU性能等。

CPU的选择:

对于数据库并发比较高的场景,CPU的数量比频率重要。

对于CPU密集型场景和频繁执行复杂SQL的场景,CPU的频率越高越好。

MySQL数据库配置优化
表示缓冲池字节大小。
推荐值为物理内存的50%~80%。
innodb_buffer_pool_size

用来控制redo log刷新到磁盘的策略。
innodb_flush_log_at_trx_commit=1

每提交1次事务同步写到磁盘中,可以设置为n。
sync_binlog=1

脏页占innodb_buffer_pool_size的比例时,触发刷脏页到磁盘。推荐值为25%~50%。
innodb_max_dirty_pages_pct=30

后台进程最大IO性能指标。
默认200,如果SSD,调整为5000~20000
innodb_io_capacity=200

指定innodb共享表空间文件的大小。
innodb_data_file_path

慢查询日志的阈值设置,单位秒。
long_qurey_time=0.3

mysql复制的形式,row为MySQL8.0的默认形式。
binlog_format=row

调高该参数则应降低interactive_timeout、wait_timeout的值。
max_connections=200

过大,实例恢复时间长;过小,造成日志切换频繁。
innodb_log_file_size

全量日志建议关闭。
默认关闭。
general_log=0

CentOS系统针对mysql的参数优化
本节只提及部分重要的参数,更全面的参数优化,可以查看这本书。

内核相关参数(/etc/sysctl.conf)
以下参数可以直接放到sysctl.conf文件的末尾。

1.增加监听队列上限:

net.core.somaxconn = 65535net.core.netdev_max_backlog = 65535net.ipv4.tcp_max_syn_backlog = 65535

2.加快TCP连接的回收:

net.ipv4.tcp_fin_timeout = 10net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1

3.TCP连接接收和发送缓冲区大小的默认值和最大值:

net.core.wmem_default = 87380net.core.wmem_max = 16777216net.core.rmem_default = 87380net.core.rmem_max = 16777216

4.减少失效连接所占用的TCP资源的数量,加快资源回收的效率:

net.ipv4.tcp_keepalive_time = 120net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3

5.单个共享内存段的最大值:

kernel.shmmax = 4294967295

这个参数应该设置的足够大,以便能在一个共享内存段下容纳整个的Innodb缓冲池的大小。

这个值的大小对于64位linux系统,可取的最大值为(物理内存值-1)byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可。

6.控制换出运行时内存的相对权重:

vm.swappiness = 0

这个参数当内存不足时会对性能产生比较明显的影响。(设置为0,表示Linux内核虚拟内存完全被占用,才会要使用交换区。)

Linux系统内存交换区:在Linux系统安装时都会有一个特殊的磁盘分区,称之为系统交换分区。使用 free -m 命令可以看到swap就是内存交换区。作用:当操作系统没有足够的内存时,就会将部分虚拟内存写到磁盘的交换区中,这样就会发生内存交换。

如果Linux系统上完全禁用交换分区,带来的风险:

降低操作系统的性能

容易造成内存溢出,崩溃,或都被操作系统kill掉

增加资源限制(/etc/security/limit.conf)
打开文件数的限制(以下参数可以直接放到limit.conf文件的末尾):

* soft nofile 65535* hard nofile 65535

*:表示对所有用户有效soft:表示当前系统生效的设置(soft不能大于hard )hard:表明系统中所能设定的最大值nofile:表示所限制的资源是打开文件的最大数目65535:限制的数量

以上两行配置将可打开的文件数量增加到65535个,以保证可以打开足够多的文件句柄。

注意:这个文件的修改需要重启系统才能生效。

磁盘调度策略
1.cfq (完全公平队列策略,Linux2.6.18之后内核的系统默认策略)

该模式按进程创建多个队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每个IO请求都是公平的。该策略适合离散读的应用。

2.deadline (截止时间调度策略)

deadline,包含读和写两个队列,确保在一个截止时间内服务请求(截止时间是可调整的),而默认读期限短于写期限。这样就防止了写操作因为不能被读取而饿死的现象,deadline对数据库类应用是最好的选择。

3.noop (电梯式调度策略)

noop只实现一个简单的FIFO队列,倾向饿死读而利于写,因此noop对于闪存设备、RAM及嵌入式系统是最好的选择。

4.anticipatory (预料I/O调度策略)

本质上与deadline策略一样,但在最后一次读操作之后,要等待6ms,才能继续进行对其它I/O请求进行调度。它会在每个6ms中插入新的I/O操作,合并写入流,用写入延时换取最大的写入吞吐量。anticipatory适合于写入较多的环境,比如文件服务器。该策略对数据库环境表现很差。

查看调度策略的方法:

cat /sys/block/devname/queue/scheduler

修改调度策略的方法:

echo > /sys/block/devname/queue/scheduler

MySQL的参数配置
请阅读笔者的CSDN博客《MySQL服务器参数配置》,点击跳转。如无法跳转,请查看原文即可查看。

MySQL表结构与SQL优化
索引优化规则
结合笔者的上一篇博客——《彻底搞懂MySQL的索引》,可以很容易理解索引优化的原理。

1.使用最左前缀规则
如果使用联合索引,要遵守最左前缀规则。即要求使用联合索引进行查询,从索引的最左前列开始,不跳过索引中的列并且不能使用范围查询(>、

2.模糊查询不能利用索引(like ‘%XX’或者like ‘%XX%’)
假如索引列code的值为’AAA’,’AAB’,’BAA’,’BAB’,如果where code like ‘%AB’条件,由于条件前面是模糊的,所以不能利用索引的顺序,必须逐个查找,看是否满足条件。这样会导致全索引扫描或者全表扫描。

如果是where code like ‘A%’,就可以查找code中A开头的数据,当碰到B开头的数据时,就可以停止查找了,因为后面的数据一定不满足要求,这样可以提高查询效率。

3.不要过多创建索引
过多的索引会占用更多的空间,而且每次增、删、改操作都会重建索引。

在一般的互联网场景中,查询语句的执行次数远远大于增删改语句的执行次数,所以重建索引的开销可以忽略不计。但在大数据量导入时,可以考虑先删除索引,批量插入数据,然后添加索引。

尽量扩展索引,比如现有索引(a),现在又要对(a,b)进行索引,那么只需要修改索引(a)即可,避免不必要的索引冗余。

4.索引长度尽量短
短索引可以节省索引空间,使查找的速度得到提升,同时内存中也可以装载更多的索引键值。

太长的列,可以选择建立前缀索引

5.索引更新不能频繁
更新非常频繁的数据不适宜建索引,因为维护索引的成本。

6.索引列不能参与计算
不要在索引列上做任何的操作,包括计算、函数、自动或者手动类型的转换,这样都会导致索引失效。

比如,where from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成where create_time = unix_timestamp(’2014-05-29’)。

查询时的优化
小表驱动大表

第一张表是全表索引(要以此关联其他表),其余表的查询类型type为range(索引区间获得),也就是6 * 1 * 1,共遍历查询6次即可;

建议使用left join时,以小表关联大表,因为使用join的话,第一张表是必须全扫描的,以少关联多就可以减少这个扫描次数.

这里所说的表的type,指的是explain执行计划中的结果字段。详情点击查看,explain的属性详解与提速百倍的优化示例

避免全表扫描
mysql在使用不等于(!=或者<>)的时候无法使用导致全表扫描。在查询的时候,如果对索引使用不等于的操作将会导致索引失效,进行全表扫描

避免mysql放弃索引查询
如果mysql估计使用全表扫描要比使用索引快,则不使用索引。(最典型的场景就是数据量少的时候)

使用覆盖索引,少使用select*
需要用到什么数据就查询什么数据,这样可以减少网络的传输和mysql的全表扫描。

尽量使用覆盖索引,比如索引为name,age,address的组合索引,那么尽量覆盖这三个字段之中的值,mysql将会直接在索引上取值(using index),并且返回值不包含不是索引的字段。

如果查询select的列过多,覆盖索引的效率会大大下降,这时可以考虑放弃覆盖索引查询。

order by的索引生效
order by排序应该遵循最佳左前缀查询,如果是使用多个索引字段进行排序,那么排序的规则必须相同(同是升序或者降序),否则索引同样会失效。

不正确的使用导致索引失效
如果查询中有某个列的范围查询,则其右边所有列都无法使用索引。

for update锁表
A, B两个事务分别使用select … where … for update进行查询时:

A事务执行查询操作的时候,如果这个查询结果为空,无论where条件是否是索引字段,B事务执行查询操作时,不会被阻塞。

A事务执行查询操作的时候,当where条件是索引字段,则B事务执行同样的查询时会被行加锁阻塞;当where条件不是索引字段,则B事务执行有结果集的查询,都会被阻塞。

for update操作一定要谨慎,之前笔者就遇到过for update产生gap锁,导致后续请求阻塞的问题。之后的博客单独介绍MySQL的锁机制,同时讲解下更多死锁的情况。

其他优化
开启慢查询
开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,更好的优化数据库系统的性能。

以后单独的博客进行详细的讲解

实时获取有性能问题的SQL
利用information_schema数据库的processlist表,实时查看执行时间过长的线程,定位需要优化的SQL。

例如下面的SQL的作用是查看正在执行的线程,并按Time倒排序,查看执行时间过长的线程。

select * from information_schema.processlist where Command != ‘Sleep’ order by Time desc;

垂直分割
“垂直分割”是一种把数据库中的表,按列变成几张表的方法。这样可以降低表的复杂度和字段的数目,从而达到优化的目的。

示例一:

在Users表中有一个字段是address,它是可选字段,并且不需要经常读取或是修改。

那么,就可以把它放到另外一张表中,这样会让原表有更好的性能。

示例二:

有一个叫 “last_login”的字段,它会在每次用户登录时被更新,每次更新时会导致该表的查询缓存被清空。

所以,可以把这个字段放到另一个表中。

这样就不会影响对用户ID、用户名、用户角色(假设这几个属性并不频繁修改)的不停地读取了,因为查询缓存会增加很多性能。

拆分执行时间长的DELETE或INSERT语句
避免在生产环境上执行会锁表的DELETE或INSERT的操作。一定把其拆分,或者使用LIMIT条件也是一个好的方法。

下面是一个示例:

while (1) { //每次只做1000条 mysql_query(“DELETE FROM logs WHERE log_date <= ‘2009-11-01’ LIMIT 1000”); if (mysql_affected_rows() == 0) { // 没得可删了,退出! break; } // 每次都要休息一会儿 usleep(50000);}
好书推荐
高性能MySQL
MySQL优化绝不是一篇博客就能讲解全面的,所以笔者隆重推荐《高性能mysql》一书,如果没看过的话,一定要看。

图书简介:

《高性能MySQL(第3版)》是MySQL领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了最新MySQL 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16章和6个附录,内容涵盖MySQL架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的mysql和mysql相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。