soulseekah/wp-lock

该软件包的最新版本(dev-master)没有提供许可信息。

WordPress Core的锁定和互斥锁库

dev-master 2023-05-10 17:42 UTC

This package is auto-updated.

Last update: 2024-09-10 20:40:19 UTC


README

因为WordPress不是线程安全的

PHPUnit Tests

WordPress不再仅仅是一个博客平台。它是一个框架。像所有成熟的框架一样,它迫切需要一个锁定API。

示例

考虑以下易受竞态条件影响的用户余额充值函数

// topup function that is not thread-safe
public function topup_user_balance( $user_id, $topup ) {
	$balance = get_user_meta( $user_id, 'balance', true );
	$balance = $balance + $topup;
	update_user_meta( $user_id, 'balance', $balance );
	return $balance;
}

尝试在16个线程中调用上述代码100次。余额将小于预期。

// A thread-safe version of the above topup function.
public function topup_user_balance( $user_id, $topup ) {
	$user_balance_lock = new WP_Lock( "$user_id:meta:balance" );
	$user_balance_lock->acquire( WP_Lock::WRITE );

	$balance = get_user_meta( $user_id, 'balance', true );
	$balance = $balance + $topup;
	update_user_meta( $user_id, 'balance', $balance );

	$user_balance_lock->release();

	return $balance;
}

上述代码是线程安全的。

锁定级别

  • WP_Lock::READ - 其他进程可以在原始锁释放之前获取读取权限但不能获取写入权限。共享读取锁。
  • WP_Lock::WRITE(默认)- 其他进程必须在原始锁释放之后才能获取读取或写入锁。独占的读写锁

使用方法

通过Composer composer require soulseekah/wp-lock 在您的插件中要求。

use soulseekah\WP_Lock;

require 'vendor/autoload.php';

$lock = new WP_Lock\WP_Lock( 'my-first-lock' );

注意事项

在高度并发的设置中,您可能会从MySQL收到死锁错误。这是正常的。该库会优雅地处理这些错误,并在需要时重试查询。