ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel

ื‘ืžืขืจื›ืช ื”ืืงื•ืœื•ื’ื™ืช ืฉืœ PHP ื™ืฉื ื ื›ื™ื•ื ืฉื ื™ ืžื—ื‘ืจื™ื ืœืขื‘ื•ื“ื” ืขื ืฉืจืช Tarantool - ื–ื•ื”ื™ ื”ืจื—ื‘ื” ื”ืจืฉืžื™ืช ืฉืœ PECL tarantool/tarantool-php, ื›ืชื•ื‘ ื‘-C, ื• tarantool-php/client, ื›ืชื•ื‘ ื‘-PHP. ืื ื™ ื”ืžื—ื‘ืจ ืฉืœ ื”ืื—ืจื•ืŸ.

ื‘ืžืืžืจ ื–ื”, ื‘ืจืฆื•ื ื™ ืœื—ืœื•ืง ืืช ื”ืชื•ืฆืื•ืช ืฉืœ ื‘ื“ื™ืงื•ืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืฉืชื™ ื”ืกืคืจื™ื•ืช ื•ืœื”ืจืื•ืช ื›ื™ืฆื“, ืขื ืฉื™ื ื•ื™ื™ื ืžื™ื ื™ืžืœื™ื™ื ื‘ืงื•ื“, ื ื™ืชืŸ ืœื”ืฉื™ื’ ืฉื™ืคื•ืจ ืฉืœ 3-5 ื‘ื™ืฆื•ืขื™ื (ื‘ืžื‘ื—ื ื™ื ืกื™ื ืชื˜ื™ื™ื!).

ืžื” ื ื‘ื“ื•ืง?

ื ื‘ื“ื•ืง ืืช ืืœื• ืฉื”ื•ื–ื›ืจื• ืœืขื™ืœ ืกื™ื ื›ืจื•ื ื™ ืžื—ื‘ืจื™ื ืคื•ืขืœื™ื ื‘ืื•ืคืŸ ืืกื™ื ื›ืจื•ื ื™, ื‘ืžืงื‘ื™ืœ ื•ื-ืกื™ื ื›ืจื•ื ื™-ืžืงื‘ื™ืœ. ๐Ÿ™‚ ืื ื—ื ื• ื’ื ืœื ืจื•ืฆื™ื ืœื’ืขืช ื‘ืงื•ื“ ืฉืœ ื”ืžื—ื‘ืจื™ื ืขืฆืžื. ื™ืฉ ื›ืจื’ืข ืžืกืคืจ ื”ืจื—ื‘ื•ืช ื–ืžื™ื ื•ืช ื›ื“ื™ ืœื”ืฉื™ื’ ืืช ืžื” ืฉืืชื” ืจื•ืฆื”:

  • ืกื•ื•ืœ โ€• ืžืกื’ืจืช ืืกื™ื ื›ืจื•ื ื™ืช ื‘ืขืœืช ื‘ื™ืฆื•ืขื™ื ื’ื‘ื•ื”ื™ื ืขื‘ื•ืจ PHP. ื‘ืฉื™ืžื•ืฉ ืขืœ ื™ื“ื™ ืขื ืงื™ื•ืช ืื™ื ื˜ืจื ื˜ ื›ืžื• ืขืœื™ื‘ืื‘ื ื•ื‘ืื™ื“ื•. ืžืื– ื’ืจืกื” 4.1.0 ื”ื•ืคื™ืขื” ืฉื™ื˜ืช ืงืกื SwooleRuntime::enableCoroutine(), ื”ืžืืคืฉืจ ืœืš "ืœื”ืžื™ืจ ืกืคืจื™ื•ืช ืจืฉืช PHP ืกื™ื ื›ืจื•ื ื™ื•ืช ืœืกืคืจื™ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช ืขื ืฉื•ืจืช ืงื•ื“ ืื—ืช."
  • Async ื”ื™ื™ืชื” ืขื“ ืœืื—ืจื•ื ื” ื”ืจื—ื‘ื” ืžื‘ื˜ื™ื—ื” ืžืื•ื“ ืœืขื‘ื•ื“ื” ืืกื™ื ื›ืจื•ื ื™ืช ื‘-PHP. ืœืžื” ืขื“ ืœืื—ืจื•ื ื”? ืœืฆืขืจื™, ืžืกื™ื‘ื” ืฉืื™ื ื” ื™ื“ื•ืขื” ืœื™, ื”ืžื—ื‘ืจ ืžื—ืง ืืช ื”ืžืื’ืจ ื•ื’ื•ืจืœื• ื”ืขืชื™ื“ื™ ืฉืœ ื”ืคืจื•ื™ืงื˜ ืื™ื ื• ื‘ืจื•ืจ. ืื ื™ ืืฆื˜ืจืš ืœื”ืฉืชืžืฉ ื‘ื• ะพะดะฝะธะผ ืžืžื–ืœื’ื•ืช. ื‘ื“ื•ืžื” ืœ-Swoole, ื”ืจื—ื‘ื” ื–ื• ืžืืคืฉืจืช ืœืš ืœื”ืคืขื™ืœ ื‘ืงืœื•ืช ืืช ื”ืžื›ื ืกื™ื™ื ื‘ืœื—ื™ืฆืช ื›ืฃ ื”ื™ื“ ื›ื“ื™ ืœืืคืฉืจ ืืกื™ื ื›ืจื•ืŸ ืขืœ ื™ื“ื™ ื”ื—ืœืคืช ื”ื™ื™ืฉื•ื ื”ืกื˜ื ื“ืจื˜ื™ ืฉืœ ื–ืจืžื™ TCP ื•-TLS ื‘ื’ืจืกืื•ืช ื”ื-ืกื™ื ื›ืจื•ื ื™ื•ืช ืฉืœื”ื. ื–ื” ื ืขืฉื” ื‘ืืžืฆืขื•ืช ื”ืืคืฉืจื•ืช "async.tcp = 1".
  • ืžืงื‘ื™ืœ - ื”ืจื—ื‘ื” ื—ื“ืฉื” ืœืžื“ื™ ืฉืœ ื’'ื• ื•ื•ื˜ืงื™ื ืก ื”ื™ื“ื•ืข, ืžื—ื‘ืจื ืฉืœ ืกืคืจื™ื•ืช ื›ืžื• phpdbg, apcu, pthreads, pcov, uopz. ื”ืชื•ืกืฃ ืžืกืคืง API ืœืจื™ื‘ื•ื™ ื”ืœื™ื›ื™ ืฉืจืฉื•ืจ ื‘-PHP ื•ืžืžื•ืงื ื›ืชื—ืœื™ืฃ ืœ-pthreads. ืžื’ื‘ืœื” ืžืฉืžืขื•ืชื™ืช ืฉืœ ื”ืกืคืจื™ื™ื” ื”ื™ื ืฉื”ื™ื ืขื•ื‘ื“ืช ืจืง ืขื ื’ืจืกืช ZTS (Zend Thread Safe) ืฉืœ PHP.

ืื™ืš ื ื‘ื“ื•ืง?

ื‘ื•ืื• ื ืฉื™ืง ืžื•ืคืข ืฉืœ Tarantool ืขื ืจื™ืฉื•ื ื›ืชื™ื‘ื” ืงื“ื™ืžื” ืžื•ืฉื‘ืช (wal_mode = ืื™ืŸ) ื•ืžืื’ืจ ืจืฉืช ืžื•ื’ื“ืœ (readahead = 1 * 1024 * 1024). ื”ืืคืฉืจื•ืช ื”ืจืืฉื•ื ื” ืชื‘ื˜ืœ ืืช ื”ืขื‘ื•ื“ื” ืขื ื”ื“ื™ืกืง, ื”ืฉื ื™ื™ื” ืชืืคืฉืจ ืœืงืจื•ื ื‘ืงืฉื•ืช ื ื•ืกืคื•ืช ืžืžืื’ืจ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ื‘ื›ืš ืœืžื–ืขืจ ืืช ืžืกืคืจ ืงืจื™ืื•ืช ื”ืžืขืจื›ืช.

ืขื‘ื•ืจ ื‘ื ืฆ'ืžืจืงื™ื ืฉืขื•ื‘ื“ื™ื ืขื ื ืชื•ื ื™ื (ื”ื•ืกืคื”, ืžื—ื™ืงื”, ืงืจื™ืื” ื•ื›ื•'), ืœืคื ื™ ื”ืชื—ืœืช ื”-benchmark, ื™ื•ื•ืฆืจ (ืžื—ื“ืฉ) ืจื•ื•ื— memtx, ืฉื‘ื• ืขืจื›ื™ ื”ืื™ื ื“ืงืก ื”ืขื™ืงืจื™ื™ื ื ื•ืฆืจื™ื ืขืœ ื™ื“ื™ ืžื—ื•ืœืœ ืฉืœ ืขืจื›ื™ ืžืกืคืจื™ื ืฉืœืžื™ื ืžืกื•ื“ืจื™ื (ืจืฆืฃ).
ื”ืžืจื—ื‘ DDL ื ืจืื” ื›ืš:

space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})

ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ืœืคื ื™ ื”ืคืขืœืช ื”ื‘ื ืฆ'ืžืจืง, ื”ื—ืœืœ ืžืชืžืœื ื‘-10,000 ื˜ื•ืคืœื™ื ืฉืœ ื”ื˜ื•ืคืก

{id, "tuplะต_<id>"}

ื ื™ืชืŸ ืœื’ืฉืช ืœื˜ื•ืคืœื™ื ื‘ืืžืฆืขื•ืช ืขืจืš ืžืคืชื— ืืงืจืื™.

ื”ืžื“ื“ ืขืฆืžื• ื”ื•ื ื‘ืงืฉื” ื‘ื•ื“ื“ืช ืœืฉืจืช, ืืฉืจ ืžื‘ื•ืฆืขืช 10,000 ืคืขืžื™ื (ืกื™ื‘ื•ื‘ื™ื), ืืฉืจ, ื‘ืชื•ืจื, ืžื‘ื•ืฆืขื•ืช ื‘ืื™ื˜ืจืฆื™ื•ืช. ื”ืื™ื˜ืจืฆื™ื•ืช ื—ื•ื–ืจื•ืช ืขืœ ืขืฆืžืŸ ืขื“ ืฉื›ืœ ืกื˜ื™ื•ืช ื”ื–ืžืŸ ื‘ื™ืŸ 5 ืื™ื˜ืจืฆื™ื•ืช ื ืžืฆืื•ืช ื‘ืฉื’ื™ืื” ืžืงื•ื‘ืœืช ืฉืœ 3%*. ืœืื—ืจ ืžื›ืŸ, ื”ืชื•ืฆืื” ื”ืžืžื•ืฆืขืช ื ืœืงื—ืช. ื™ืฉ ื”ืคืกืงื” ืฉืœ ืฉื ื™ื™ื” ืื—ืช ื‘ื™ืŸ ืื™ื˜ืจืฆื™ื•ืช ื›ื“ื™ ืœืžื ื•ืข ืžื”ืžืขื‘ื“ ืœื”ื—ื ื™ืง. ืืกืคืŸ ื”ืืฉืคื” ืฉืœ ืœื•ืื” ืžื•ืฉื‘ืช ืœืคื ื™ ื›ืœ ืื™ื˜ืจืฆื™ื” ื•ื ืืœืฅ ืœื”ืชื—ื™ืœ ืœืื—ืจ ืกื™ื•ืžื•. ืชื”ืœื™ืš ื”-PHP ืžื•ืคืขืœ ืจืง ืขื ื”ื”ืจื—ื‘ื•ืช ื”ื ื—ื•ืฆื•ืช ืœืžื‘ื—ืŸ ื”ืฉื•ื•ืืช ื‘ื™ืฆื•ืขื™ื, ื›ืืฉืจ ืื—ืกื•ืŸ ืคืœื˜ ืžื•ืคืขืœ ื•ืื•ืกืฃ ื”ืืฉืคื” ืžื•ืฉื‘ืช.

* ื ื™ืชืŸ ืœืฉื ื•ืช ืืช ืžืกืคืจ ื”ืกื™ื‘ื•ื‘ื™ื, ื”ืื™ื˜ืจืฆื™ื•ืช ื•ืกืฃ ื”ืฉื’ื™ืื” ื‘ื”ื’ื“ืจื•ืช ื”ืžื‘ื—ืŸ.

ืกื‘ื™ื‘ืช ื‘ื“ื™ืงื”

ื”ืชื•ืฆืื•ืช ืฉืคื•ืจืกืžื• ืœื”ืœืŸ ื ืขืฉื• ื‘-MacBookPro (2015), ืžืขืจื›ืช ื”ืคืขืœื” - Fedora 30 (ื’ืจืกืช ืœื™ื‘ื” 5.3.8-200.fc30.x86_64). Tarantool ื”ื•ืฉืง ื‘-docker ืขื ื”ืคืจืžื˜ืจ "--network host".

ื’ืจืกืื•ืช ื—ื‘ื™ืœื”:

Tarantool: 2.3.0-115-g5ba5ed37e
ื“ื•ืงืจ: 19.03.3, ื‘ื ื™ื™ืช a872fc2f86
PHP: 7.3.11 (cli) (ื ื‘ื ื”: 22 ื‘ืื•ืงื˜ื•ื‘ืจ 2019 08:11:04)
tarantool/client: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ ืชื™ืงื•ืŸ ืขื‘ื•ืจ 7.3)*
ext-msgpack: 2.0.3
ืืกื™ื ื›ืจื•ืŸ ื—ื™ืฆื•ื ื™: 0.3.0-8c1da46
ืืงืกื˜-wool: 4.4.12
ืžืงื‘ื™ืœ ื—ื™ืฆื•ื ื™: 1.1.3

* ืœืžืจื‘ื” ื”ืฆืขืจ, ื”ืžื—ื‘ืจ ื”ืจืฉืžื™ ืœื ืขื•ื‘ื“ ืขื ื’ื™ืจืกืช PHP > 7.2. ื›ื“ื™ ืœืงืžืคืœ ื•ืœื”ืคืขื™ืœ ืืช ื”ืชื•ืกืฃ ื‘-PHP 7.3, ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ืฉืชืžืฉ ืชื™ืงื•ืŸ.

ืžืžืฆืื™ื

ืžืฆื‘ ืกื™ื ื›ืจื•ื ื™

ืคืจื•ื˜ื•ืงื•ืœ Tarantool ืžืฉืชืžืฉ ื‘ืคื•ืจืžื˜ ื‘ื™ื ืืจื™ ื—ื‘ื™ืœืช ื”ื•ื“ืขื•ืช ืœืขืฉื•ืช ืกื“ืจื” ืฉืœ ื”ื•ื“ืขื•ืช. ื‘ืžื—ื‘ืจ ื”-PECL, ื”ืกื™ื“ืจื” ืžื•ืกืชืจืช ืขืžื•ืง ื‘ืžืขืžืงื™ ื”ืกืคืจื™ื™ื” ื•ืžืฉืคื™ืขื” ืขืœ ืชื”ืœื™ืš ื”ืงื™ื“ื•ื“ ืžืงื•ื“ Userland ืœื ื ืจืื” ืืคืฉืจื™. ืžื—ื‘ืจ PHP ื˜ื”ื•ืจ, ืœื”ื™ืคืš, ืžืกืคืง ืืช ื”ื™ื›ื•ืœืช ืœื”ืชืื™ื ืื™ืฉื™ืช ืืช ืชื”ืœื™ืš ื”ืงื™ื“ื•ื“ ืขืœ ื™ื“ื™ ื”ืจื—ื‘ืช ื”ืžืงื•ื“ื“ ื”ืกื˜ื ื“ืจื˜ื™ ืื• ืขืœ ื™ื“ื™ ืฉื™ืžื•ืฉ ื‘ื™ื™ืฉื•ื ืžืฉืœืš. ื™ืฉื ื ืฉื ื™ ืžืงื•ื“ื“ื™ื ื–ืžื™ื ื™ื ืžื”ืงื•ืคืกื”, ืื—ื“ ืžื‘ื•ืกืก ืขืœ msgpack/msgpack-php (ื”ืจื—ื‘ื” ื”ืจืฉืžื™ืช ืฉืœ MessagePack PECL), ื”ืฉื ื™ ืคื•ืขืœ rybakit/msgpack (ื‘-PHP ื˜ื”ื•ืจ).

ืœืคื ื™ ื”ืฉื•ื•ืืช ืžื—ื‘ืจื™ื, ื ืžื“ื•ื“ ืืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืžืงื•ื“ื“ื™ MessagePack ืขื‘ื•ืจ ืžื—ื‘ืจ PHP ื•ื‘ื‘ื“ื™ืงื•ืช ื ื•ืกืคื•ืช ื ืฉืชืžืฉ ื‘ื–ื” ืฉืžืจืื” ืืช ื”ืชื•ืฆืื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ืœืžืจื•ืช ืฉื’ืจืกืช ื”-PHP (Pure) ื ื—ื•ืชื” ืžื”ืจื—ื‘ืช PECL ื‘ืžื”ื™ืจื•ืช, ื‘ืคืจื•ื™ืงื˜ื™ื ืืžื™ืชื™ื™ื ืขื“ื™ื™ืŸ ื”ื™ื™ืชื™ ืžืžืœื™ืฅ ืœื”ืฉืชืžืฉ ื‘ื” rybakit/msgpack, ื›ื™ ื‘ื”ืจื—ื‘ื” ื”ืจืฉืžื™ืช ืฉืœ MessagePack ืžืคืจื˜ ื”ืคื•ืจืžื˜ ืžื™ื•ืฉื ื‘ืื•ืคืŸ ื—ืœืงื™ ื‘ืœื‘ื“ (ืœื“ื•ื’ืžื”, ืื™ืŸ ืชืžื™ื›ื” ื‘ืกื•ื’ื™ ื ืชื•ื ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช, ืฉื‘ืœืขื“ื™ื• ืœื ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘-Decimal - ืกื•ื’ ื ืชื•ื ื™ื ื—ื“ืฉ ืฉื”ื•ืฆื’ ื‘-Tarantool 2.3) ื•ื™ืฉ ืœื• ืžืกืคืจ ืื—ืจื™ื ะฟั€ะพะฑะปะตะผ (ื›ื•ืœืœ ื‘ืขื™ื•ืช ืชืื™ืžื•ืช ืขื PHP 7.4). ื•ื‘ื›ืŸ, ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ืคืจื•ื™ืงื˜ ื ืจืื” ื ื˜ื•ืฉ.

ืื– ื‘ื•ืื• ื ืžื“ื•ื“ ืืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืžื—ื‘ืจื™ื ื‘ืžืฆื‘ ืกื™ื ื›ืจื•ื ื™:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ืžื”ื’ืจืฃ, ืžื—ื‘ืจ PECL (Tarantool) ืžืฆื™ื’ ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ ื‘ื”ืฉื•ื•ืื” ืœืžื—ื‘ืจ PHP (Client). ืื‘ืœ ื–ื” ืœื ืžืคืชื™ืข, ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉื”ืื—ืจื•ืŸ, ื‘ื ื•ืกืฃ ืœื”ื™ื•ืชื• ืžื™ื•ืฉื ื‘ืฉืคื” ืื™ื˜ื™ืช ื™ื•ืชืจ, ืœืžืขืฉื” ืขื•ืฉื” ื™ื•ืชืจ ืขื‘ื•ื“ื”: ืื•ื‘ื™ื™ืงื˜ ื—ื“ืฉ ื ื•ืฆืจ ืขื ื›ืœ ืงืจื™ืื” ื‘ืงืฉ ะธ ืชึฐื’ื•ึผื‘ึธื” (ื‘ืžืงืจื” ืฉืœ Select - ื’ื ืงืจื™ื˜ืจื™ื•ื ื™ื, ื•ื‘ืžืงืจื” ืฉืœ Update/Upsert - ืชืคืขื•ืœ), ื™ืฉื•ื™ื•ืช ื ืคืจื“ื•ืช ื”ืงืฉืจ, ืื•ืจื– ะธ ื”ื ื“ืœืจ ื”ื ื’ื ืžื•ืกื™ืคื™ื ืชืงื•ืจื”. ื‘ืจื•ืจ ืฉืœื’ืžื™ืฉื•ืช ื™ืฉ ืžื—ื™ืจ. ืขื ื–ืืช, ื‘ืื•ืคืŸ ื›ืœืœื™, ืžืชื•ืจื’ืžืŸ PHP ืžืฆื™ื’ ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื, ืœืžืจื•ืช ืฉื™ืฉ ื”ื‘ื“ืœ, ื”ื•ื ื—ืกืจ ืžืฉืžืขื•ืช ื•ืื•ืœื™ ื™ื”ื™ื” ืืคื™ืœื• ืคื—ื•ืช ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ื˜ืขื™ื ื” ืžื•ืงื“ืžืช ื‘-PHP 7.4, ืฉืœื ืœื“ื‘ืจ ืขืœ JIT ื‘-PHP 8.

ื‘ื•ื ื ืžืฉื™ืš ื”ืœืื”. Tarantool 2.0 ื”ื•ืกื™ืคื” ืชืžื™ื›ื” ืขื‘ื•ืจ SQL. ื‘ื•ืื• ื ื ืกื” ืœื‘ืฆืข ืคืขื•ืœื•ืช Select, Insert, Update and Delete ื‘ืืžืฆืขื•ืช ืคืจื•ื˜ื•ืงื•ืœ SQL ื•ืœื”ืฉื•ื•ืช ืืช ื”ืชื•ืฆืื•ืช ืขื ื”ืžืงื‘ื™ืœื•ืช noSQL (ื‘ื™ื ืืจื™ื•ืช):

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ืชื•ืฆืื•ืช ื”-SQL ืœื ืžืื•ื“ ืžืจืฉื™ืžื•ืช (ืชืŸ ืœื™ ืœื”ื–ื›ื™ืจ ืœืš ืฉืื ื—ื ื• ืขื“ื™ื™ืŸ ื‘ื•ื“ืงื™ื ืžืฆื‘ ืกื™ื ื›ืจื•ื ื™). ืขื ื–ืืช, ืœื ื”ื™ื™ืชื™ ืžืชืขืฆื‘ืŸ ืžื–ื” ืžื‘ืขื•ื“ ืžื•ืขื“; ืชืžื™ื›ืช SQL ืขื“ื™ื™ืŸ ื‘ืคื™ืชื•ื— ืคืขื™ืœ (ืœืื—ืจื•ื ื”, ืœืžืฉืœ, ื ื•ืกืคื” ืชืžื™ื›ื” ื”ืฆื”ืจื•ืช ืžื•ื›ื ื•ืช) ื•ื›ืŸ, ืื ืœืฉืคื•ื˜ ืœืคื™ ื”ืจืฉื™ืžื” ื‘ืขื™ื•ืช, ืžื ื•ืข ื”-SQL ื™ืขื‘ื•ืจ ืžืกืคืจ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ื‘ืขืชื™ื“.

ืืกื™ื ืง

ื•ื‘ื›ืŸ, ืขื›ืฉื™ื• ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ืชื•ืกืฃ Async ื™ื›ื•ืœ ืœืขื–ื•ืจ ืœื ื• ืœืฉืคืจ ืืช ื”ืชื•ืฆืื•ืช ืœืžืขืœื”. ื›ื“ื™ ืœื›ืชื•ื‘ ืชื•ื›ื ื™ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช, ื”ืชื•ืกืฃ ืžืกืคืง API ื”ืžื‘ื•ืกืก ืขืœ ืงื•ืจื•ื˜ื™ื ื™ื, ื‘ื• ื ืฉืชืžืฉ. ืื ื• ืžื’ืœื™ื ื‘ืื•ืคืŸ ืืžืคื™ืจื™ ืฉื”ืžืกืคืจ ื”ืื•ืคื˜ื™ืžืœื™ ืฉืœ ืงื•ืจื•ื˜ื™ื ื™ื ืขื‘ื•ืจ ื”ืกื‘ื™ื‘ื” ืฉืœื ื• ื”ื•ื 25:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
"ืคื–ืจ" 10,000 ืคืขื•ืœื•ืช ืขืœ ืคื ื™ 25 ืงื•ืจื•ืชื™ื ื™ื ื•ืจืื” ืžื” ืงื•ืจื”:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ืžืกืคืจ ื”ืคืขื•ืœื•ืช ืœืฉื ื™ื™ื” ื’ื“ืœ ื‘ื™ื•ืชืจ ืžืคื™ 3 ืขื‘ื•ืจ tarantool-php/client!

ืœืžืจื‘ื” ื”ืฆืขืจ, ืžื—ื‘ืจ PECL ืœื ื”ืชื—ื™ืœ ืขื ืืกื™ื ื›ืจื•ืŸ ื—ื™ืฆื•ื ื™.

ืžื” ืขื SQL?

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ื‘ืžืฆื‘ ืืกื™ื ื›ืจื•ื ื™ ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ื”ืคืจื•ื˜ื•ืงื•ืœ ื”ื‘ื™ื ืืจื™ ืœ-SQL ื”ืคืš ืœื˜ื•ื•ื— ื”ืฉื’ื™ืื”.

ืกื•ื•ืœ

ืฉื•ื‘ ืื ื• ืžื’ืœื™ื ืืช ื”ืžืกืคืจ ื”ืื•ืคื˜ื™ืžืœื™ ืฉืœ ืงื•ืจื•ื˜ื™ื ื™ื, ื”ืคืขื ืขื‘ื•ืจ Swoole:
ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื‘ื•ืื• ื ืขืฆื•ืจ ื‘-25. ื‘ื•ืื• ื ื—ื–ื•ืจ ืขืœ ืื•ืชื• ื˜ืจื™ืง ื›ืžื• ืขื ื”ืจื—ื‘ื” Async - ื ื—ืœืง 10,000 ืคืขื•ืœื•ืช ื‘ื™ืŸ 25 ืงื•ืจื•ื˜ื™ื ื™ื. ื‘ื ื•ืกืฃ, ื ื•ืกื™ืฃ ื‘ื“ื™ืงื” ื ื•ืกืคืช ื‘ื” ื ื—ืœืง ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ืœ-2 ืฉื ื™ ืชื”ืœื™ื›ื™ื (ื›ืœื•ืžืจ, ื›ืœ ืชื”ืœื™ืš ื™ื‘ืฆืข 5,000 ืคืขื•ืœื•ืช ื‘-25 ืงื•ืจื•ื˜ื™ื ื™ื). ืชื”ืœื™ื›ื™ื ื™ื™ื•ื•ืฆืจื• ื‘ืืžืฆืขื•ืช SwooleProcess.

ืชื•ืฆืื•ืช:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
Swole ืžืฆื™ื’ื” ืชื•ืฆืื” ืžืขื˜ ื ืžื•ื›ื” ื™ื•ืชืจ ื‘ื”ืฉื•ื•ืื” ืœ-Async ื›ืฉื”ื™ื ืžื•ืคืขืœืช ื‘ืชื”ืœื™ืš ืื—ื“, ืื‘ืœ ืขื 2 ืชื”ืœื™ื›ื™ื ื”ืชืžื•ื ื” ืžืฉืชื ื” ื‘ืฆื•ืจื” ื“ืจืžื˜ื™ืช (ื”ืžืกืคืจ 2 ืœื ื ื‘ื—ืจ ื‘ืžืงืจื”; ื‘ืžื›ื•ื ื” ืฉืœื™, ื”ื™ื• ืืœื” 2 ืชื”ืœื™ื›ื™ื ืฉื”ืจืื• ืืช ื”ืชื•ืฆืื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ).

ืื’ื‘, ื‘ืชื•ืกืฃ Async ื™ืฉ ื’ื API ืœืขื‘ื•ื“ื” ืขื ืชื”ืœื™ื›ื™ื, ืื‘ืœ ืฉื ืœื ื”ื‘ื—ื ืชื™ ื‘ืฉื•ื ื”ื‘ื“ืœ ืžื”ืคืขืœืช benchmarks ื‘ืชื”ืœื™ื›ื™ื ืื—ื“ ืื• ื™ื•ืชืจ (ื™ื™ืชื›ืŸ ืฉืคื™ืฉืœืชื™ ืื™ืคืฉื”ื•).

SQL ืœืขื•ืžืช ืคืจื•ื˜ื•ืงื•ืœ ื‘ื™ื ืืจื™:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื›ืžื• ื‘-Async, ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ืคืขื•ืœื•ืช ื‘ื™ื ืืจื™ื•ืช ืœ-SQL ืžืชื‘ื˜ืœ ื‘ืžืฆื‘ ืืกื™ื ื›ืจื•ื ื™.

ืžืงื‘ื™ืœ

ืžื›ื™ื•ื•ืŸ ืฉื”ื”ืจื—ื‘ื” ื”ืžืงื‘ื™ืœื” ืื™ื ื” ืขื•ืกืงืช ื‘ืงื•ืจื•ื˜ื™ื ื•ืช, ืืœื ื‘ืฉืจืฉื•ืจื™ื, ื‘ื•ืื• ื ืžื“ื•ื“ ืืช ื”ืžืกืคืจ ื”ืื•ืคื˜ื™ืžืœื™ ืฉืœ ื—ื•ื˜ื™ื ืžืงื‘ื™ืœื™ื:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื–ื” ืฉื•ื•ื” ืœ-16 ื‘ืžื—ืฉื‘ ืฉืœื™. ื‘ื•ื ื ืจื™ืฅ ื ืงื•ื“ื•ืช ืžื™ื“ื” ืฉืœ ืžื—ื‘ืจื™ื ืขืœ 16 ืคืชื™ืœื™ื ืžืงื‘ื™ืœื™ื:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ื”ืชื•ืฆืื” ืืคื™ืœื• ื˜ื•ื‘ื” ื™ื•ืชืจ ืžืืฉืจ ืขื ื”ืจื—ื‘ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช (ืœื ืกื•ืคืจ ืืช Swoole ืฉืคื•ืขืœ ืขืœ 2 ืชื”ืœื™ื›ื™ื). ืฉื™ื ืœื‘ ืฉืขื‘ื•ืจ ืžื—ื‘ืจ PECL, ืคืขื•ืœื•ืช ื”ืขื“ื›ื•ืŸ ื•ื”ื”ืขืœืื” ืจื™ืงื•ืช. ื–ื” ื ื•ื‘ืข ืžื”ืขื•ื‘ื“ื” ืฉืคืขื•ืœื•ืช ืืœื” ื ื›ืฉืœื• ืขื ืฉื’ื™ืื” - ืื ื™ ืœื ื™ื•ื“ืข ืื ื–ื• ื”ื™ื™ืชื” ืืฉืžืชื• ืฉืœ ext-parallel, ext-tarantool, ืื• ืฉื ื™ื”ื.

ื›ืขืช ื ืฉื•ื•ื” ืืช ื‘ื™ืฆื•ืขื™ SQL:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel
ืฉืžืชื ืœื‘ ืœื“ืžื™ื•ืŸ ืขื ื”ื’ืจืฃ ืขื‘ื•ืจ ืžื—ื‘ืจื™ื ื”ืคื•ืขืœื™ื ื‘ืื•ืคืŸ ืกื™ื ื›ืจื•ื ื™?

ื™ึทื—ึทื“

ื•ืœื‘ืกื•ืฃ, ื‘ื•ืื• ื ืกื›ื ืืช ื›ืœ ื”ืชื•ืฆืื•ืช ื‘ื’ืจืฃ ืื—ื“ ื›ื“ื™ ืœืจืื•ืช ืืช ื”ืชืžื•ื ื” ื”ื›ื•ืœืœืช ืฉืœ ื”ื”ืจื—ื‘ื•ืช ืฉื ื‘ื“ืงื•. ื‘ื•ืื• ื ื•ืกื™ืฃ ืจืง ื‘ื“ื™ืงื” ืื—ืช ื—ื“ืฉื” ืœืชืจืฉื™ื, ืฉืขื“ื™ื™ืŸ ืœื ืขืฉื™ื ื• - ื‘ื•ืื• ื ืจื™ืฅ ืงื•ืจื•ื˜ื™ื ื•ืช Async ื‘ืžืงื‘ื™ืœ ื‘ืืžืฆืขื•ืช Parallel*. ื”ืจืขื™ื•ืŸ ืœืฉืœื‘ ืืช ื”ื”ืจื—ื‘ื•ืช ืœืขื™ืœ ื›ื‘ืจ ืžื“ื•ื‘ืจ ืžื—ื‘ืจื™ื, ืืš ืœื ื”ื•ืฉื’ื” ื”ืกื›ืžื”, ืชืฆื˜ืจืš ืœืขืฉื•ืช ื–ืืช ื‘ืขืฆืžืš.

* ืœื ื ื™ืชืŸ ื”ื™ื” ืœื”ืฉื™ืง Swoole coroutines ืขื Parallel; ื ืจืื” ืฉื”ืจื—ื‘ื•ืช ืืœื• ืื™ื ืŸ ืชื•ืืžื•ืช.

ืื– ื”ืชื•ืฆืื•ืช ื”ืกื•ืคื™ื•ืช:

ื”ืืฆืช ืžื—ื‘ืจื™ PHP ืขื‘ื•ืจ Tarantool ื‘ืืžืฆืขื•ืช Async, Swoole ื•-Parallel

ื‘ืžืงื•ื ืžืกืงื ื”

ืœื“ืขืชื™ ื”ืชื•ืฆืื•ืช ื”ืชื‘ืจืจื• ื›ืจืื•ื™ื•ืช ืœืžื“ื™, ื•ืžืฉื•ื ืžื” ืื ื™ ื‘ื˜ื•ื— ืฉื–ื” ืœื ื”ื’ื‘ื•ืœ! ืื ืืชื” ืฆืจื™ืš ืœื”ื—ืœื™ื˜ ืืช ื–ื” ื‘ืคืจื•ื™ืงื˜ ืืžื™ืชื™ ืจืง ื‘ืฉื‘ื™ืœ ืขืฆืžืš, ืื ื™ ืจืง ืื’ื™ื“ ืฉื‘ืฉื‘ื™ืœื™ ื–ื” ื”ื™ื” ื ื™ืกื•ื™ ืžืขื ื™ื™ืŸ ืฉืžืืคืฉืจ ืœืš ืœื”ืขืจื™ืš ื›ืžื” ืืชื” ื™ื›ื•ืœ "ืœืกื—ื•ื˜" ืžืžื—ื‘ืจ TCP ืกื™ื ื›ืจื•ื ื™ ื‘ืžื™ื ื™ืžื•ื ืžืืžืฅ. ืื ื™ืฉ ืœืš ืจืขื™ื•ื ื•ืช ืœืฉื™ืคื•ืจ ืืžื•ืช ืžื™ื“ื”, ืืฉืžื— ืœืฉืงื•ืœ ืืช ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ืฉืœืš. ื›ืœ ื”ืงื•ื“ ืขื ื”ื•ืจืื•ืช ื”ืคืขืœื” ื•ืชื•ืฆืื•ืช ืžืชืคืจืกื ื‘ื ืคืจื“ ืžืื’ืจื™ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”