异步任务回调中的变量作用域陷阱:从内存泄漏到正确捕获的演进
开发WordPress插件时经常需要处理异步任务,很多开发者会在回调函数中直接使用外部变量,导致意料之外的作用域问题。来看这段典型错误代码:
function send_async_email() {
$subject = '订单通知'; // 外部变量
wp_schedule_single_event(time(), 'send_email_hook', [
'subject' => $subject // 试图传递变量
]);
}
add_action('send_email_hook', function($args) {
// 实际收到的是序列化后的字符串副本
wp_mail('admin@example.com', $args['subject'], '内容');
});
问题出在WordPress的定时任务机制会将参数序列化存储到数据库,等真正执行时反序列化出来的$subject已是全新副本,原变量的后续修改不会影响任务执行。
正确做法应该直接传递确定值,或使用闭包绑定:
// 方案1:直接传递字面量
wp_schedule_single_event(time(), 'send_email_hook', [
'subject' => '订单通知' // 固定值
]);
// 方案2:闭包绑定(PHP5.4+)
add_action('send_email_hook', function() use ($subject) {
wp_mail('admin@example.com', $subject, '内容');
});
特别提醒:如果使用闭包方案,务必确保$subject在任务执行时仍然存在(避免对象析构),必要时可采用静态变量或全局存储。
最新打赏

