
Π Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° PHP Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π΄Π²Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Tarantool ΡΡΡΠ²ΡΡ β ΡΠΎΠ²Π° Π΅ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ PECL ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ , Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° C, ΠΈ , Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° PHP. ΠΠ· ΡΡΠΌ Π°Π²ΡΠΎΡΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π±ΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π΄Π²Π΅ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ 3-5% ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° (ΠΏΡΠΈ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅!).
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅?
Π©Π΅ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈ, ΠΏΡΡΠ½Π°ΡΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ, ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ-ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ. π Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π·Π°ΡΡΠ³Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ ΠΆΠ΅Π»Π°Π½ΠΎΡΠΎ:
- β Π²ΠΈΡΠΎΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅Π½ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ ΡΡΠ΅ΠΉΠΌΡΡΡΠΊ Π·Π° PHP. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π³ΠΈΠ³Π°Π½ΡΠΈ ΠΊΠ°ΡΠΎ Alibaba ΠΈ Baidu. Π‘ Π²Π΅ΡΡΠΈΡ 4.1.0 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ SwooleRuntime::enableCoroutine(), ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Ρ Π΅Π΄Π½Π° Π»ΠΈΠ½ΠΈΡ ΠΊΠΎΠ΄ Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° PHP Π² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ.
- Async β Π΄ΠΎ Π½Π΅ΠΎΡΠ΄Π°Π²Π½Π° Π΄ΠΎΡΡΠ° ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ Π·Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΡΠ°Π±ΠΎΡΠ° Π² PHP. ΠΠ°ΡΠΎ Π΄ΠΎ Π½Π΅ΠΎΡΠ΄Π°Π²Π½Π°? ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ Π·Π° ΠΌΠ΅Π½ ΠΏΡΠΈΡΠΈΠ½ΠΈ, Π°Π²ΡΠΎΡΡΡ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π½Π΅ΡΡΠ½ΠΎ. Π©Π΅ ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΠΎΡ ΡΠΎΡΠΊΠΎΠ²Π΅ΡΠ΅. ΠΠ°ΠΊΡΠΎ Swoole, ΡΠΎΠ²Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Ρ Π»Π΅ΠΊΠ° ΡΡΠΊΠ° Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ½Π΅ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° TCP ΠΈ TLS ΠΏΠΎΡΠΎΠΊΠΈΡΠ΅ Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ. Π’ΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΡΠ΅Π· ΠΎΠΏΡΠΈΡΡΠ° βasync.tcp = 1Β«.
- β Π΄ΠΎΡΡΠ° Π½ΠΎΠ²ΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡ Joe Watkins, Π°Π²ΡΠΎΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠ°ΡΠΎ phpdbg, apcu, pthreads, pcov, uopz. Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ API Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½Π° ΡΠ°Π±ΠΎΡΠ° Π² PHP ΠΈ ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠ° ΠΊΠ°ΡΠΎ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° pthreads. ΠΠ½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π΅, ΡΠ΅ ΡΡ ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Ρ ZTS (Zend Thread Safe) Π²Π΅ΡΡΠΈΡ Π½Π° PHP.
ΠΠ°ΠΊ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅?
Π©Π΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ Π½Π° Tarantool Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ ΠΆΡΡΠ½Π°Π» Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ (wal_mode = none) ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ ΠΌΡΠ΅ΠΆΠΎΠ² Π±ΡΡΠ΅Ρ (readahead = 1 * 1024 * 1024). ΠΡΡΠ²Π°ΡΠ° ΠΎΠΏΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ Π΄ΠΈΡΠΊΠ°, Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ°Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ Π±ΡΡΠ΅ΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ.
ΠΠ° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΡΡ Ρ Π΄Π°Π½Π½ΠΈ (Π²ΠΌΡΠΊΠ²Π°Π½Π΅, ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅, ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Ρ.Π½.) ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠ° Π½Π° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ° ΡΠ΅ ΡΠ΅ (ΠΏΡΠ΅)ΡΡΠ·Π΄Π°Π΄Π΅ memtx-ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π² ΠΊΠΎΠ΅ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΡΠ²ΠΈΡΠ½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΎΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΡΠ΅Π»ΠΈ ΡΠΈΡΠ»Π° (sequence).
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Π΅_"}ΠΠΎΡΡΡΠΏΡΡ Π΄ΠΎ ΠΊΠΎΡΡΠ΅ΠΆΠΈΡΠ΅ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΡΡΠ°.
Π‘Π°ΠΌΠΈΡΡ Π±Π΅Π½ΡΠΌΠ°ΡΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π΅Π΄ΠΈΠ½Π΅Π½ Π·Π°ΠΏΡΠΎΡ Π΄ΠΎ ΡΡΡΠ²ΡΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° 10,000 ΠΏΡΡΠΈ (ΡΠ΅Π²ΠΎΠ»ΡΡΠΈΠΈ), ΠΊΠΎΠΈΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π² ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ°ΡΡΡ, Π΄ΠΎΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ Π²ΡΠ² Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ 5 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ Π² Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ°ΡΠ° Π³ΡΠ΅ΡΠΊΠ° ΠΎΡ 3 %*. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π²Π·ΠΈΠΌΠ° ΡΡΠ΅Π΄Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. ΠΠ΅ΠΆΠ΄Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ ΠΈΠΌΠ° ΠΏΠ°ΡΠ·Π° ΠΎΡ 1 ΡΠ΅ΠΊΡΠ½Π΄Π°, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°. Π‘ΡΠ±ΠΈΡΠ°ΡΡΡ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ Lua ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π° ΠΏΡΠ΅Π΄ΠΈ Π²ΡΡΠΊΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ»Π΅Π΄ Π½Π΅ΠΉΠ½ΠΎΡΠΎ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅. PHP ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π·Π° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°, Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ ΡΡΠ±ΠΈΡΠ°Ρ Π½Π° Π±ΠΎΠΊΠ»ΡΠΊ.
* ΠΡΠΎΡΡ Π½Π° ΡΠ΅Π²ΠΎΠ»ΡΡΠΈΠΈ, ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠ°Π³ΠΎΠ²Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠ°.
Π’Π΅ΡΡΠΎΠ²Π° ΡΡΠ΅Π΄Π°
ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π±ΡΡ
Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ Π½Π° MacBookPro (2015), ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° β Fedora 30 (Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ 5.3.8-200.fc30.x86_64). Tarantool ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π² Docker Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ "--network host".
ΠΠ΅ΡΡΠΈΠΈ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅:
Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, build 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
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3
* ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΡ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Ρ Π²Π΅ΡΡΠΈΡ Π½Π° PHP > 7.2. ΠΠ° Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° PHP 7.3, ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ .
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ
Π‘ΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ
ΠΡΠΎΡΠΎΠΊΠΎΠ»ΡΡ Π½Π° Tarantool ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° PECL ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π΅ Π΄ΡΠ»Π±ΠΎΠΊΠΎ ΡΠΊΡΠΈΡΠ° Π² Π½Π΅Π΄ΡΠ°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ Π²Π»ΠΈΡΠ½ΠΈΠ΅ΡΠΎ Π²ΡΡΡ Ρ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ ΠΎΡ userland-ΠΊΠΎΠ΄ . ΠΠΎΠ½Π΅ΠΊΡΠΎΡ Π½Π° ΡΠΈΡΡ PHP, ΠΎΡ Π΄ΡΡΠ³Π°, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΠΊΠΎΠ΄Π΅Ρ ΠΈΠ»ΠΈ Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΡΠ΅ Π΄Π²Π° ΠΊΠΎΠ΄Π΅ΡΠ° ΠΎΡ ΠΊΡΡΠΈΡΡΠ°, Π΅Π΄ΠΈΠ½ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° (ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ MessagePack PECL), Π° Π΄ΡΡΠ³ΠΈΡΡ β Π½Π° (Π½Π° ΡΠΈΡΡ PHP).
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈΡΠ΅, ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π΅ΡΠΈΡΠ΅ Π½Π° MessagePack Π·Π° PHP-ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° ΠΈ Π² ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ:

ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ PHP Π²Π΅ΡΡΠΈΡΡΠ° (Pure) ΠΎΡΡΡΡΠΏΠ²Π° Π½Π° PECL ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡ, Π² ΡΠ΅Π°Π»Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π²ΡΠ΅ ΠΏΠ°ΠΊ Π±ΠΈΡ
ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ°Π» Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈΠΌΠ΅Π½Π½ΠΎ , ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ MessagePack ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠΎΡΠΌΠ°ΡΠ° Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠ°ΠΌΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΡΠΌΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ, Π±Π΅Π· ΠΊΠΎΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Decimal β Π½ΠΎΠ² ΡΠΈΠΏ Π΄Π°Π½Π½ΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Π² Tarantool 2.3) ΠΈ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π΄ΡΡΠ³ΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΡΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ° Ρ PHP 7.4). Π Π² ΠΎΠ±ΡΠΈ Π»ΠΈΠ½ΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π·Π°Π±ΡΠ°Π²Π΅Π½.
Π ΡΠ°ΠΊΠ°, ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈΡΠ΅ Π² ΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ:

ΠΠ°ΠΊΡΠΎ ΡΠ΅ Π²ΠΈΠΆΠ΄Π° ΠΎΡ Π³ΡΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ PECL (Tarantool) ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π½Π° PHP (Client). ΠΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΈΠ·Π½Π΅Π½Π°Π΄Π²Π°ΡΠΎ, ΠΈΠΌΠ°ΠΉΠΊΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ, ΠΎΡΠ²Π΅Π½ ΡΠ΅ Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π½Π° ΠΏΠΎ-Π±Π°Π²Π΅Π½ Π΅Π·ΠΈΠΊ, Π²ΡΡΡΠ½ΠΎΡΡ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°: ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π½ΠΎΠ² ΠΎΠ±Π΅ΠΊΡ Request ΠΈ Response (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Select β ΠΎΡΠ΅ ΠΈ Criteria, Π° Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Update/Upsert β Operations), ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Connection, Packer ΠΈ Handler ΡΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΎΠ²Π΅ΡΡ
Π΅Π΄. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π΅, ΡΠ΅ Π·Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠ»Π°ΡΠ°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ PHP ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΡΡ ΠΏΠΎΠΊΠ°Π·Π²Π° Π΄ΠΎΠ±ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ, ΠΌΠ°ΠΊΠ°Ρ ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° Π΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°, Π½ΠΎ ΡΡ Π½Π΅ Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΈ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ, ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΡΠ΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° preloading Π² PHP 7.4, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° JIT Π² PHP 8.
ΠΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ΅Π΄. Π Tarantool 2.0 Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° SQL. ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Select, Insert, Update ΠΈ Delete, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ SQL ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΈ Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Ρ noSQL (Π±ΠΈΠ½Π°ΡΠ½ΠΈ) Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠΈ:

Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ SQL Π½Π΅ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ (Π½Π°ΠΏΠΎΠΌΠ½ΡΠΌ, ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π½Π΅ Π±ΠΈΡ
ΡΠ΅ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π» ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° SQL Π²ΡΠ΅ ΠΎΡΠ΅ Π΅ Π² Π°ΠΊΡΠΈΠ²Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° (ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠΊΠΎΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ) ΠΈ, ΡΡΠ΄Ρ ΠΏΠΎ ΡΠΏΠΈΡΡΠΊΠ° , SQL Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΡΡ ΠΎΡΠ°ΠΊΠ²Π° ΡΠ΅Π΄ΠΈΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Async ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅. ΠΠ° ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ API Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΊΠΎΡΡΡΠΈΠ½ΠΈ (coroutines), ΠΈ Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. ΠΠΏΠΈΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅, ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅, ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΡΡΠΈΠ½ΠΈ Π·Π° Π½Π°ΡΠ°ΡΠ° ΡΡΠ΅Π΄Π° Π΅ 25:

βΠ Π°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅β 10,000 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ 25 ΠΊΠΎΡΡΡΠΈΠ½ΠΈ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ:

ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 3 ΠΏΡΡΠΈ Π·Π° !
Π’ΡΠΆΠ½ΠΎ, Π½ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΡΡ PECL Π½Π΅ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ext-async.
Π ΠΊΠ°ΠΊΠ²ΠΎ Ρ SQL?

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΡΠ΅, Π² Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΈ SQL ΡΡΠ°Π½Π° Π² ΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°.
Swoole
ΠΡΠ½ΠΎΠ²ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΡΡΡΠΈΠ½ΠΈ, ΡΠ΅Π³Π° Π·Π° Swoole:

Π©Π΅ ΡΠ΅ ΡΠΏΡΠ΅ΠΌ Π½Π° 25. ΠΠΎΠ²ΡΠ°ΡΡΠΌΠ΅ ΡΡΡΠΈΡ ΡΡΠΈΠΊ, ΠΊΠ°ΠΊΡΠΎ Ρ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Async β ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ 10,000 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ 25 ΠΊΠΎΡΡΡΠΈΠ½ΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΡΠ΅ΡΡ, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠΌΠ΅ ΡΡΠ»Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° 2 ΠΏΡΠΎΡΠ΅ΡΠ° (ΡΠΎΠ΅ΡΡ, Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° 5,000 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² 25 ΠΊΠΎΡΡΡΠΈΠ½ΠΈ). ΠΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° SwooleProcess.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ:

Swole ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π½ΠΈΡΡΠΊ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Async ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅Ρ, Π½ΠΎ Ρ 2 ΠΏΡΠΎΡΠ΅ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°ΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΡΠ΅Π½Π½ΠΎ (ΡΠΈΡΠ»ΠΎΡΠΎ 2 Π½Π΅ Π΅ ΠΈΠ·Π±ΡΠ°Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ; Π½Π° ΠΌΠΎΡΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ 2 ΠΏΡΠΎΡΠ΅ΡΠ° ΠΏΠΎΠΊΠ°Π·Π°Ρ
Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ).
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π² ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Async ΡΡΡΠΎ ΠΈΠΌΠ° API Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΠΎΡΠ΅ΡΠΈ, Π½ΠΎ ΡΠ°ΠΌ Π½Π΅ Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ Π½ΡΠΊΠ°ΠΊΠ²Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ²Π΅ Π² Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ (Π½Π΅ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΎ, ΡΠ΅ Π°Π· Π½ΡΠΊΡΠ΄Π΅ ΡΠ±ΡΡΠΊΠ°Ρ ).
SQL ΡΡΠ΅ΡΡ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»:

ΠΠ°ΠΊΡΠΎ ΠΈ Ρ Async, ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΠΈ SQL ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ΅ Π½Π΅ΡΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π² Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ.
Parallel
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Parallel Π½Π΅ Π΅ Π·Π° ΠΊΠΎΡΡΡΠΈΠ½ΠΈ, Π° Π·Π° ΠΏΠΎΡΠΎΡΠΈ, ΠΈΠ·ΠΌΠ΅ΡΠ²Π°ΠΌΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΈ ΠΏΠΎΡΠΎΡΠΈ:

Π’ΠΎ Π΅ ΡΠ°Π²Π½ΠΎ Π½Π° 16 Π½Π° ΠΌΠΎΡΡΠ° ΠΌΠ°ΡΠΈΠ½Π°. Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈΡΠ΅ Π½Π° 16 ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΈ ΠΏΠΎΡΠΎΠΊΠ°:

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΡΠ΅, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ Π΄ΠΎΡΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Ρ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ (Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Swoole, ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΎ Π½Π° 2 ΠΏΡΠΎΡΠ΅ΡΠ°). ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΠ΅ Π·Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° PECL Π½Π° ΠΌΡΡΡΠΎΡΠΎ Π½Π° Update ΠΈ Upsert ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΅ ΠΏΡΠ°Π·Π½ΠΎ. Π’ΠΎΠ²Π° Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ·Π»ΡΠ·ΠΎΡ
Π° Ρ Π³ΡΠ΅ΡΠΊΠ° β Π½Π΅ Π·Π½Π°ΠΌ, ΠΏΠΎ Π²ΠΈΠ½Π° Π½Π° ext-parallel, ext-tarantool ΠΈΠ»ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅.
Π‘Π΅Π³Π° ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° SQL:

ΠΠ°Π±Π΅Π»ΡΠ·Π°Ρ
ΡΠ΅ Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Ρ Π³ΡΠ°ΡΠΈΠΊΠ° Π·Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈΡΠ΅, ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ?
ΠΡΠΈΡΠΊΠΎ Π·Π°Π΅Π΄Π½ΠΎ
ΠΠ°ΠΊΡΠ°Ρ ΡΠ΅ ΠΎΠ±Π΅Π΄ΠΈΠ½ΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π² Π΅Π΄ΠΈΠ½ Π³ΡΠ°ΡΠΈΠΊ, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ. Π©Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΡΠΌ Π³ΡΠ°ΡΠΈΠΊΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ Π½ΠΎΠ² ΡΠ΅ΡΡ, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠΌΠ΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π»ΠΈ β ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΡΡΡΠΈΠ½ΠΈΡΠ΅ Async ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Parallel*. ΠΠ΄Π΅ΡΡΠ° Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π²Π΅ΡΠ΅ ΠΎΡ Π°Π²ΡΠΎΡΠΈΡΠ΅, Π½ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°ΠΌΠΈ.
* ΠΠ΅ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΡΡΡΠΈΠ½ΠΈΡΠ΅ Swoole Ρ Parallel, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ΅Π·ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ.
Π ΡΠ°ΠΊΠ°, ΡΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ:

ΠΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΡΠ° Π΄ΠΎΡΡΠ° Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ²Π°ΡΠΈ ΠΈ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° ΡΡΠΌ ΡΠ²Π΅ΡΠ΅Π½, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠ΅Π΄Π΅Π»ΡΡ! Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π°Π»ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π² ΡΠ΅Π°Π»Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ ΠΈΠ·ΡΡΠ»ΠΎ Π²Π°ΡΠ΅, ΡΠ°ΠΌΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ°, ΡΠ΅ Π·Π° ΠΌΠ΅Π½ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΡΠ΅Π½Ρ ΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° "ΠΈΠ·ΡΡΠΈΡΠΊΠ°ΠΌΠ΅" ΠΎΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈΡ TCP ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΡΡΠΈΠ»ΠΈΡ. ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΈΠ΄Π΅ΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π±Π΅Π½ΡΠΌΠ°ΡΠΊΠΎΠ²Π΅ΡΠ΅ β Ρ ΡΠ°Π΄ΠΎΡΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ Π²Π°ΡΠΈΡ ΠΏΡΠ» ΡΠ΅ΠΊΠ²Π΅ΡΡ. Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
