Я работаю над новым проектом, который должен быть реализован расширением Swoole.
Вот документы для замков Swoole:
https://www.swoole.co.uk/docs/modules/swoole-lock
Вот поддерживаемые типы блокировки:
SWOOLE_FILELOCK: file lock
SWOOLE_RWLOCK: read write lock
SWOOLE_SEM: Linux semaphore
SWOOLE_MUTEX: Mutex
SWOOLE_SPINLOCK: spin lock
Вот мои вопросы:
Почему работает только SWOOLE_SPINLOCK, а все остальные блокировки возвращают false при попытке получить блокировку?
Как заблокировать чтение или запись и как снять блокировку чтения или записи в режиме SWOOLE_RWLOCK? В документах говорится только о получении блокировок чтения (что, как я сказал в # 1, всегда возвращает false).
Результаты выполнения:
SWOOLE_RWLOCK:
$lock_1 = new swoole_lock(1);
$lock_2 = new swoole_lock(1);
var_dump($lock_1->lock_read());
// result: bool(false)
var_dump($lock_2->lock());
// result: bool(false)
SWOOLE_MUTEX:
$lock = new swoole_lock(3);
var_dump($lock->lock());
// result: bool(true)
// It's funny that this lock was not working when I asked the question and now it's working!
SWOOLE_SEM:
$lock = new swoole_lock(4);
var_dump($lock->lock());
// Result: Assertion failed: (key != 0), function swSem_create, file /Users/***USER***/Desktop/pecl/swoole-src/src/lock/Semaphore.c, line 27. Abort trap: 6
SWOOLE_SEM:
$lock = new swoole_lock(5);
var_dump($lock->lock());
// result: bool(true)
Я не проверял режим SWOOLE_FILELOCK, так как он пытается заблокировать файл на диске, что не подходит для этого проекта.
Кроме того, кажется, что все эти 5 констант не определены, поэтому я использовал их соответствующие целочисленные значения в приведенных выше примерах.
Я использую последнюю версию PHP 7.2.4 & Swoole 2.1.1 на macOS Сьерра.
Вот phpinfo ():
swoole
swoole support => enabled
Version => 2.1.1
Author => tianfeng.han[email: [email protected]]
coroutine => enabled
kqueue => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
pcre => enabled
zlib => enabled
mysqlnd => enabled
Команда phpinfo (php -i) configure (php скомпилирован из исходного кода):
Configure Command => './configure' '--prefix=/usr/local/php' '--with-bz2' '--with-zlib' '--enable-zip' '--disable-cgi' '--enable-soap' '--with-openssl=/usr/local/Cellar/openssl/1.0.2o_1' '--with-libedit=/usr/local/Cellar/libedit/20170329-3.1' '--with-curl' '--enable-ftp' '--enable-mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-sockets' '--enable-pcntl' '--with-pspell' '--with-gd' '--enable-exif' '--with-jpeg-dir=/usr/local/Cellar/jpeg/9c' '--with-png-dir=/usr/local/Cellar/libpng/1.6.34' '--with-vpx-dir=/usr/local/Cellar/libvpx/1.6.1' '--with-freetype-dir=/usr/local/Cellar/freetype/2.9' '--with-zlib-dir=/usr/local/Cellar/zlib/1.2.11' '--with-xsl' '--enable-bcmath' '--enable-mbstring' '--enable-calendar' '--enable-simplexml' '--enable-json' '--enable-hash' '--enable-session' '--enable-xml' '--enable-wddx' '--enable-opcache' '--with-pcre-regex' '--with-config-file-path=/Users/***USER***/localhost/Server/php-configs' '--with-config-file-scan-dir=/Users/***USER***/localhost/Server/php-configs/extensions' '--enable-cli' '--enable-maintainer-zts' '--with-tsrm-pthreads' '--enable-debug' '--enable-fpm' '--with-fpm-user=www-data' '--with-fpm-group=www-data' '--with-imap-ssl' '--with-pear' '--with-xmlrpc' '--with-ds' '--with-igbinary' '--with-imagick' '--with-memcached' '--with-mustache' '--with-swoole'
Команда swoole configure (swoole скомпилирован из источника):
./configure --enable-debug --enable-openssl=/usr/local/Cellar/openssl/1.0.2o_1/include --enable-async-redis --enable-mysqlnd
Задача ещё не решена.
Других решений пока нет …