Debounce Wordpress 操作挂钩(或任何其他 PHP 函数)
Debounce Wordpress action hook (or any other PHP function)
我有一个 Wordpress 插件,它在发生 post/postmeta 更改后发送 post 数据。
问题是在一个繁忙的 Wordpress 站点上可能会有很多 post 元数据更改,所以我想 debounce/throttle/aggregate 元数据更新到单个 POST 调用,包含在 1第二期.
不知道如何处理这个问题,因为我已经使用异步语言一段时间了,并且找不到 PHP.
的 setTimeout 等价物
有什么可以分享的想法吗?
add_action( 'updated_post_meta', 'a3_updated_post_meta', 10, 4 );
function a3_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value){
global $wpdb;
global $a3_types_to_send;
a3_write_log('---> u p d a t e d post m e t a');
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
$mongo_dest_address = 'http://localhost:8080/admin/dirty';
$reason = 'edit_meta';
$dirty_post_ids = get_option('a3_dirty_post_ids');
if(! is_array($dirty_post_ids) ){
$dirty_post_ids = array();
}
$dirty_post_ids[] = (int) $post_id;
update_option('a3_dirty_post_ids', array_unique($dirty_post_ids));
$object_type = $wpdb->get_var( $wpdb->prepare("select post_type from $wpdb->posts where ID = %d", $post_id) );
if(in_array($object_type, $a3_types_to_send)){
a3_send_post_trans($post_id, $reason);
}
}
在 PHP 中没有直接的方法可以做到这一点。我建议您探索其他想法,例如:
A) 每隔 x 秒停止触发这些操作和 运行 cron 脚本(简单的 php 脚本由服务器在特定时间间隔触发以处理帖子)
B) 以与您现在类似的方式触发操作并将帖子放入特定队列(根据您的专业知识,它可以有任何形式,从最简单的到例如 RabbitMQ)。之后,您将必须创建 queueHandler 脚本(以与第一点类似的方式)来处理队列中的帖子。
这就是我在 save_post
挂钩
上解决这个问题的方法
function debounce_send() {
$send_time = get_transient('send_time');
if($send_time) {
wp_clear_scheduled_hook('run_send')
wp_schedule_single_event($send_time, 'run_send');
} else {
run_send();
set_transient('send_time', time() + 60, 60);
}
}
add_action('save_post', 'debounce_send');
然后我这样做:
function run_send() {
// Send an email here
}
add_action( 'run_send', 'run_send' );
结果是它最多每 60 秒发送 1 封电子邮件。
我有一个 Wordpress 插件,它在发生 post/postmeta 更改后发送 post 数据。
问题是在一个繁忙的 Wordpress 站点上可能会有很多 post 元数据更改,所以我想 debounce/throttle/aggregate 元数据更新到单个 POST 调用,包含在 1第二期.
不知道如何处理这个问题,因为我已经使用异步语言一段时间了,并且找不到 PHP.
的 setTimeout 等价物
有什么可以分享的想法吗?
add_action( 'updated_post_meta', 'a3_updated_post_meta', 10, 4 );
function a3_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value){
global $wpdb;
global $a3_types_to_send;
a3_write_log('---> u p d a t e d post m e t a');
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
$mongo_dest_address = 'http://localhost:8080/admin/dirty';
$reason = 'edit_meta';
$dirty_post_ids = get_option('a3_dirty_post_ids');
if(! is_array($dirty_post_ids) ){
$dirty_post_ids = array();
}
$dirty_post_ids[] = (int) $post_id;
update_option('a3_dirty_post_ids', array_unique($dirty_post_ids));
$object_type = $wpdb->get_var( $wpdb->prepare("select post_type from $wpdb->posts where ID = %d", $post_id) );
if(in_array($object_type, $a3_types_to_send)){
a3_send_post_trans($post_id, $reason);
}
}
在 PHP 中没有直接的方法可以做到这一点。我建议您探索其他想法,例如:
A) 每隔 x 秒停止触发这些操作和 运行 cron 脚本(简单的 php 脚本由服务器在特定时间间隔触发以处理帖子) B) 以与您现在类似的方式触发操作并将帖子放入特定队列(根据您的专业知识,它可以有任何形式,从最简单的到例如 RabbitMQ)。之后,您将必须创建 queueHandler 脚本(以与第一点类似的方式)来处理队列中的帖子。
这就是我在 save_post
挂钩
function debounce_send() {
$send_time = get_transient('send_time');
if($send_time) {
wp_clear_scheduled_hook('run_send')
wp_schedule_single_event($send_time, 'run_send');
} else {
run_send();
set_transient('send_time', time() + 60, 60);
}
}
add_action('save_post', 'debounce_send');
然后我这样做:
function run_send() {
// Send an email here
}
add_action( 'run_send', 'run_send' );
结果是它最多每 60 秒发送 1 封电子邮件。