soulseekah / wp-lock
该软件包的最新版本(dev-master)没有提供许可信息。
WordPress Core的锁定和互斥锁库
dev-master
2023-05-10 17:42 UTC
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9
- yoast/phpunit-polyfills: ^1.0
This package is auto-updated.
Last update: 2024-09-10 20:40:19 UTC
README
因为WordPress不是线程安全的
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收到死锁错误。这是正常的。该库会优雅地处理这些错误,并在需要时重试查询。