์๋ ,
๋ ๊ฑฐ์ ๋ฒ์ ์ Predis์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ต์ Predis ์์ 7.2๋ก ์
๊ทธ๋ ์ด๋ํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ ํ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ง๋ง ๋ ์์ฃผ ๋ฐ์ํฉ๋๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋ฉ๋๋ค.
๋ค์ ์ถ์ ๊ณผ ์ถฉ๋ํ๋ blpop์ ๋ฃจํ๊ฐ ์์ต๋๋ค.
exception 'Predis\Network\ConnectionException' with message 'Error while reading line from the server' in /opt/proj/jeeran-ii/trunk/application/protected/extensions/redis/Predis/Network/ConnectionBase.php:159
Stack trace:
#0 /opt/proj/jeeran-ii/trunk/application/protected/extensions/redis/Predis/Network/StreamConnection.php(194): Predis\Network\ConnectionBase->onConnectionError('Error while rea...')
#1 /opt/proj/jeeran-ii/trunk/application/protected/extensions/redis/Predis/Network/ConnectionBase.php(142): Predis\Network\StreamConnection->read()
#2 /opt/proj/jeeran-ii/trunk/application/protected/extensions/redis/Predis/Network/ConnectionBase.php(134): Predis\Network\ConnectionBase->readResponse(Object(Predis\Commands\ListPopFirstBlocking))
#3 /opt/proj/jeeran-ii/trunk/application/protected/extensions/redis/Predis/Client.php(219): Predis\Network\ConnectionBase->executeCommand(Object(Predis\Commands\ListPopFirstBlocking))
#4 [internal function]: Predis\Client->__call('blpop', Array)
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์๋ชป๋ ๊ตฌ์ฑ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ค์ ๋จ๊ณ ์ ๋ฐ๋ผ Redis์ Predis๊ฐ ๋ชจ๋ ์ฅ๊ธฐ๊ฐ ์ ํด ์ฐ๊ฒฐ์ ๋ํด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ๊ณ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ํฐ์ผ์ ๋ํด ๋ค์ ๋ณด๊ณ ํ์ธ์.
300์ด ํ์ ์ ํด ํด๋ผ์ด์ธํธ๋ฅผ ๋ซ์ง ์๋๋ก Redis๋ฅผ ๊ตฌ์ฑํ๊ณ (redis.conf๋ฅผ ํธ์งํ๊ณ ์๊ฐ ์ด๊ณผ ํญ๋ชฉ์ 0์ผ๋ก ์ค์ ํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์) predis\Client์ ์์ฑ์์ ์ ๋ฌ๋ ์๋ฒ ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด/๋ฌธ์์ด์ read_write_timeout => 0์ ์ถ๊ฐํฉ๋๋ค. .
๋๋ ํ ์ ์์ง๋ง ๊ทธ๋ ๊ฒ ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํ๋ค.
๋๋ redis๊ฐ ์ ํด ์ฐ๊ฒฐ์ ๋ซ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ฉด์ ์ผ์ข
์ ๊ฐ๋น์ง ์์ง์ผ๋ก
ํด๋ผ์ด์ธํธ๊ฐ ์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ์ฌ์๋ํ ์ ์์ ๋งํผ ๋๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์ฐจ๋จ ํธ์ถ์ด๊ธฐ ๋๋ฌธ์ ์ ํด ์ํ๋ก ํ์๋๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ping์ ์ํํ ์ ์์ต๋๋ค.
๋น์ทํ ์๋๋ฆฌ์ค์ ์ง๋ฉดํ์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋ง์ ์์
์ ์ํํ๋๋ก ์ ์ํฉ๋๋ค.
php-mysql์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
http://php.net/manual/en/function.mysql-ping.php
์๋ฒ ์ฐ๊ฒฐ์ Ping ํ๊ฑฐ๋ ์ฐ๊ฒฐ ์ด ์๋ ๊ฒฝ์ฐ ๋ค์ ์ฐ๊ฒฐ
php-mysql์์ ์ด์ mysql ์ฐ๊ฒฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ํด๋น ์ฐ๊ฒฐ์ด ์๊ฐ ์ด๊ณผ๋๊ฑฐ๋ ๋ซํ ์ ์์ต๋๋ค.
ping์ ํ๋ฉด ๋ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค
์ฐ๊ฒฐ์ด ์ฌ์ค์ ๋๊ฑฐ๋ ๋ซํ ๋ Predis๊ฐ ์ํํด์ผ ํ๋ ์์
$_reconnecting=1์ด๋ผ๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
๊ทธ๋ฐ ๋ค์ ์ด์ ์ฐ๊ฒฐ์ ๋์ฒดํ๋ ์ ์ฐ๊ฒฐ์ ๋ง๋ ๋ค์ ping
๊ทธ๋ฐ ๋ค์ blpop์ผ๋ก ์งํํ์ญ์์ค.
$_reconnecting===1 ๋์ ์ด ๋ฌธ์ ์ ๋ค์ ์ง๋ฉดํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ์ค Redis 2.6๋ถํฐ $ redis.conf
์ timeout
๊ตฌ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก 0
๋ก ์ค์ ๋ฉ๋๋ค.
์ด์จ๋ , ์ฌ์ ํ ์ ํด ์ฐ๊ฒฐ์ ๋ํ ์๊ฐ ์ด๊ณผ ์ค์ ์ ์ ํธํ๋ ๊ฒฝ์ฐ BLPOP
redis.conf
(์: BLPOP list 200
), ๋ฐ๋ผ์ ๋ชฉ๋ก์ ์์๊ฐ ํธ์๋์ง ์์ ๊ฒฝ์ฐ 200์ด ํ์ ๋ช
๋ น์ด NULL
๋ฅผ ๋ฐํํ๋๋ก ํฉ๋๋ค. BLPOP
๊ฐ ๋ฃจํ ์์ ์๊ณ NULL
๋ฅผ ๋ฐํํ๋ฉด ์ฆ์ ๋ฃจํ๋ฅผ ๋ค์ ์์ํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ ๋ชฉ๋ก์์ ์ ํจํ ๊ฐ์ด ๋์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ช
์์ ํ ๋ฐ ์๋ ์ฌ์ฐ๊ฒฐ์ ๋ฌด์ฉ์ง๋ฌผ๋ก ๋ง๋ค๊ณ ๋ค์์ ์ผ์ด๋๋ ๋ง์ ์ ์์กดํ์ง ์๊ณ ์คํฌ๋ฆฝํธ์ ๋์์ ํจ์ฌ ๋ ๋ง์ด ์ ์ดํ ์ ์์ต๋๋ค.
์ถ์ : Predis๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ MULTI/EXEC, pubsub ๋๋ ํ์ดํ๋ผ์ธ๊ณผ ๊ฐ์ ๋ณต์กํ ์ํ์์ ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์๋ ์ฌ์ฐ๊ฒฐ์ ์ง์ํ์ง ์์ต๋๋ค.
์ฌ์ค Redis 2.6๋ถํฐ redis.conf์ ์๊ฐ ์ด๊ณผ ๊ตฌ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก 0์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๋๋ redis ์๋ฒ๊ฐ ์ต๋ ์ ํ์ ๋๋ฌํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ฐ๊ฒฐ์ ์๋ฝํ์ง ๋ชปํ๊ฒ ํ ์ ์๋ ์์ํ ์ด์์๋ redis ์๋ฒ์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ ๊ฒ์ ๋๋ ค์ํฉ๋๋ค(conf์ ์๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋น ์ต๋ ์ด๋ฆฐ ์ฐ๊ฒฐ์ ๋ํ ์ปค๋ ์ ํ์ ์์ ์ ์์)
์ฌ์ ํ ์ ํด ์ฐ๊ฒฐ์ ๋ํ ์๊ฐ ์ด๊ณผ ์ค์ ์ ์ ํธํ๋ ๊ฒฝ์ฐ redis.conf(์: BLPOP ๋ชฉ๋ก 200)์ ์ง์ ๋ ์๊ฐ ์ด๊ณผ๋ณด๋ค ์งง์ ๋ชจ๋ํฐ๋ง๋ ํค์ ๋ํ ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ BLPOP์ ์ํํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ solr๋ก ์ฆ๋ถ ์ธ๋ฑ์ฑ์ ์ํํ๋ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ redis์์ ๋ง์ง๋ง ํฌ์ธํธ๋ฅผ ์ฝ์ต๋๋ค.
์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ธ๋ฑ์ฑ์ ์ํํ ํ ์ ํฌ์ธํธ๋ฅผ redis์ ์ ์ฅํฉ๋๋ค.
์ฝ๊ธฐ์ ์ฐ๊ธฐ ์ฌ์ด์ ์๊ฐ์ด ๊ธธ๊ธฐ ๋๋ฌธ์ Predis๊ฐ ์ถฉ๋ํฉ๋๋ค.
์ถ์ : Predis๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ MULTI/EXEC, pubsub ๋๋ ํ์ดํ๋ผ์ธ๊ณผ ๊ฐ์ ๋ณต์กํ ์ํ์์ ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์๋ ์ฌ์ฐ๊ฒฐ์ ์ง์ํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ ์ํ ๋ฐฉ์์ ์ ์ํ์ญ์์ค. $_reconnecting=1 ํ๋๊ทธ๋ก ์ธํด ๋ฌดํ ๋ฃจํ์ ๋น ์ง์ง ์์ต๋๋ค.
๋ํ ์ ์ฐ๊ฒฐ์ด ์ ํจํ ํ์ ๋ฐํํ์ง ์๋ ํ ์ ์ฐ๊ฒฐ์ ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค.
์ผ๋ถ ๋ช
๋ น์ด ์๋์ ์ผ๋ก ๋ค์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋น๋
ผ๋ฆฌ์ ์ด๋ผ๋ฉด ์ผ๋ถ ๋ช
๋ น์ ์ฌ์ฐ๊ฒฐ ๊ฐ๋ฅ์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
์ผ๋ถ ๋ช
๋ น์ ํด์ ๊ฐ๋ฅ ... ๋ฑ์ผ๋ก ํ์ํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
redis ์๋ฒ์์ ์ฐ๊ฒฐ์ด ๋๊ธธ๊น๋ด ์ต๋ ์ ํ์ ๋๋ฌํ์ฌ ์ ์ฐ๊ฒฐ์ ์๋ฝํ์ง ๋ชปํ๊ฒ ํ ์ ์์ต๋๋ค(conf์ ์๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋น ์ต๋ ์ด๋ฆฐ ์ฐ๊ฒฐ์ ์ปค๋ ์ ํ์ ์์ ์ ์์).
์์ฉ ํ๋ก๊ทธ๋จ์์ ์๋ชป๋ ์์ ์ด๋ ์๊ธฐ์น ์์ ์์ ์ ์ํํ์ง ์๋ ํ ์์ํ ์ด ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ์๋ ์์น๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ pub/sub ๋๋ BRPOP/BLOP ์๋๋ฆฌ์ค์ ๋ํด ์ ์ฌ์ ์ผ๋ก ๋ง์ ์ ํด ์ฐ๊ฒฐ์ด ํ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ง์คํฐ/์ฌ๋ ์ด๋ธ ๋ณต์ ์ ์์กดํ๊ณ ๊ตฌ๋ ์์ ๋ํด ๋ค๋ฅธ ์ฌ๋ ์ด๋ธ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ solr๋ก ์ฆ๋ถ ์ธ๋ฑ์ฑ์ ์ํํ๋ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ redis์์ ๋ง์ง๋ง ํฌ์ธํธ๋ฅผ ์ฝ์ต๋๋ค.
์๊ฐ์ด ๋ง์ด ์์๋๋ ์ธ๋ฑ์ฑ์ ์ํํ ํ ์ ํฌ์ธํธ๋ฅผ redis์ ์ ์ฅํฉ๋๋ค.
์ฝ๊ธฐ์ ์ฐ๊ธฐ ์ฌ์ด์ ์๊ฐ์ด ๊ธธ๊ธฐ ๋๋ฌธ์ Predis๊ฐ ์ถฉ๋ํฉ๋๋ค.
$client->disconnect()
๋ฅผ ์ํํ๊ณ ์๊ฐ์ด ๋ง์ด ์์๋๋ ์ธ๋ฑ์ฑ์ ์ํํ ๋ค์ $client->connect()
๋ฅผ ์ํํ ์ ์์ต๋๋ค(๋๋ Predis๊ฐ ์ฒซ ๋ฒ์งธ ๋ช
๋ น ์ ์๋ฒ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๋๋ก ํจ). ๊ทธ๋ฌ๋ ๋ค์ ํจ์ฌ ๋ ์์ธก ๊ฐ๋ฅํ ๋์์ด๋ฉฐ, ์ค์ ๋ก ํ์ํ์ง ์์ ๋ Redis์ ๋๋ฌด ๋ง์ ์ฐ๊ฒฐ์ ์ด์ด๋๋ ๊ฒ์ ๋ํ ๋๋ ค์๊ณผ๋ ์ผ๋งฅ์ํตํฉ๋๋ค.
์ผ๋ถ ๋ช ๋ น์ด ์๋์ ์ผ๋ก ๋ค์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋น๋ ผ๋ฆฌ์ ์ด๋ผ๋ฉด ์ผ๋ถ ๋ช ๋ น์ ์ฌ์ฐ๊ฒฐ ๊ฐ๋ฅ์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
์ผ๋ถ ๋ช ๋ น์ ํด์ ๊ฐ๋ฅ ... ๋ฑ์ผ๋ก ํ์ํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์ด๊ฒ์ ๋ช ๋ น ํ์ดํ๋ผ์ด๋์์ ์๋ํ์ง ์์ผ๋ฉฐ MULTI / EXEC ์ปจํ ์คํธ์์ ์์ธกํ ์ ์๋ ๋์์ผ๋ก ์ด์ด์ง๋๋ค(์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ ์ฒด ํธ๋์ญ์ ์ด ๋ถ๋ช ํ ์๋ฒ์์ ์ญ์ ๋จ). ๋ฐ๋ฉด์ ๋ช ๋ น์ ํด์ฑํ๋ ๊ฒ์ ํด๋ผ์ด์ธํธ/์ปจํ ์คํธ/๊ธฐ๋ณธ ์ฐ๊ฒฐ์ ์ํ์ ์์กดํ์ง ์๋ ๊ฒ์ ๋๋ค.
๋จผ์ ๋๋ ๋น์ ์๊ฒ ๋น ๋ฅธ ์๋ต๊ณผ ๋ฌธ์ ๋ฅผ ๋ฐ๋ฅผ ๊ฒ์ ๋๋ค.
๋์งธ, multi/exec๊ฐ ๋ค์ ์ฐ๊ฒฐ๋์ด์๋ ์ ๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
ํ์ง๋ง ๋ค๋ฅธ ๋ช ๋ น์ ์ ์์ ์ธ ๋ฐฉ์์ผ๋ก ๋ค์ ์ฐ๊ฒฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์: get/set ๋๋ blpop).
์ฐ๋ฆฌ๋ Yii์ CRedisCache๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ฐ๊ฒฐ์ ์บ์ํ๋ getter๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๊ฒ์ ์์ฑํ๊ฒ ํ ๋ฐฉ๋ฒ์ด ์๋ค.
public function getRedis()
{
if($this->_cache!==null)
return $this->_cache;
else{
// to use the old single file approach comment out the next two lines and uncomment the 3rd
require_once Yii::getPathOfAlias($this->predisPath).'/Autoloader.php';
Predis\Autoloader::register();
//require_once Yii::getPathOfAlias($this->predisPath).'.php'; // old single file approach,no autoloading
Yii::log('Opening Redis connection',CLogger::LEVEL_TRACE);
return $this->_cache=new Predis\Client($this->servers);
}
}
๋น์ ์ ์ด๊ฒ์ด ๊ทธ๋ค์ ๋ฌธ์ ๋ผ๊ณ ๋งํ ์๋ ์๊ณ , ์ฐ๊ฒฐ ํด์ /์ฐ๊ฒฐ/ํ ..etc๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ ๊ฒ์ ํ์ ๋ฌธ์ ๋ผ๊ณ ๋งํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๋๋ _๊ด์ฌ ๋ถ๋ฆฌ_์์น์ ๋ํด ์๊ฐํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ ๊ฒ์ ํ์ ๊ฒฐ์ฝ ๊น์ด ๋ค์ด๊ฐ redis ๊ตฌ์ฑ ์์๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์์์ผ ํฉ๋๋ค. ํค๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ค์ ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด Predis๋ฅผ ๋ฐฉํ์ผ๋ก ๋ง๋๋ ๋ถ๋ถ์ธ ๊ฒ ๊ฐ์์.
์ฃ์กํฉ๋๋ค. ํ์ง๋ง Predis์ ์๋ ์ฌ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค :-) ์ด๊ฒ์ ์๋ง๋ ์ค๋์ ๋ถํฐ ๊ณ ์ ๋ ๋ช ์ ๋๋ ์ฌํญ ์ค ํ๋์ผ ๊ฒ์ด๋ฉฐ ์ฌ์ ํ ๊ทํ์ ์ ์์ด ์์ธกํ ์ ์๋ ํ๋์ผ๋ก ํดํน๋ ๊ตฌํ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. . ๊ทํ์ ๊ฐ์ ํน์ ์๊ตฌ ์ฌํญ์ ๊ตฌํํ๋ ์ต์ข ๊ฐ๋ฐ์์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ์ด๊ฒ์ด Predis๊ฐ ๊ทน๋๋ก ๋ชจ๋ํ๋๋๋ก ์ค๊ณ๋ ๋ฐ๋ก ๊ทธ ์ด์ ์ ๋๋ค.
์๋๋ฆฌ์ค์์ ๊ธฐ๋ณธ ์ฐ๊ฒฐ ํด๋์ค Predis\Network\StreamConnection
๋ฅผ ํ์ฅํ์ฌ executeCommand()
๊ฐ try ... catch
๋ธ๋ก ๋ด๋ถ์ ์์ ๋ฉ์๋๋ฅผ ๋ํํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ ์ฐ๊ฒฐํ๊ณ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋์ ๋ช
๋ น์
๋๋ค. ํ์ดํธ๋ฆฌ์คํธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ด ์๋ํด์ผ ํ๋ ๋ช
๋ น์ ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค. README ์ ์ค๋ช
๋ ๋๋ก ์๋ก ์์ฑ๋ ์ฐ๊ฒฐ ํด๋์ค๋ฅผ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ด ๋์์ด ๋ ๊น์?
์ถ์ : ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ #75, ๋ช ๊ฐ์ง ํ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ธ ์ด๋ฉ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ํ์ง๋ง Predis์ ์๋ ์ฌ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค :-) ์ด๊ฒ์ ์๋ง๋ ์ค๋์ ๋ถํฐ ๊ณ ์ ๋ ๋ช ์ ๋๋ ์ฌํญ ์ค ํ๋์ผ ๊ฒ์ด๋ฉฐ ์ฌ์ ํ ๊ทํ์ ์ ์์ด ์์ธกํ ์ ์๋ ํ๋์ผ๋ก ํดํน๋ ๊ตฌํ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. .
redis์ ์์ฑ์๊ฐ ๊ทํ์ ์๊ฒฌ์ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://twitter.com/antirez/status/207117083790684161
์ด๊ฒ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์ํ์ธ์ง ์ ์ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฐ๊ฒฐ์ด ๋์ถ๋๋ ๊ฒฝ์ฐ ์์ ์ฌํญ์ IMHO ์๊ฐ ์ด๊ณผ๊ฐ ์๋๋๋ค.
https://twitter.com/antirez/status/207122021665091584
์ฌ์ฉ์๋ ํด๋น ๊ธฐ๋ณธ๊ฐ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฐ๊ฒฐ ์ ํด๊ฒฐ๋๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ 0 ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ php mysql ๋ชจ๋์ ๋ํ ์ด์ ๊ฒฝํ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
์๋ ์์ ์ mysql ์๋ฒ๋ ์น ์๋ฒ ์ค ํ๋(์ต๋ ์ฌ์ฉ์ ์ฐ๊ฒฐ ์ด๊ณผ)๋ฅผ ๋ธ๋๋ฆฌ์คํธ์ ์ฌ๋ ธ์ต๋๋ค. php ์น๋ช ์ ์ธ ์ค๋ฅ๊ฐ ์์ด์ php ์คํฌ๋ฆฝํธ๊ฐ ์คํฌ๋ฆฝํธ๊ฐ ์ฐ๊ฒฐ์ ๋ซ๋ ๋ผ์ธ์ ๋๋ฌํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋ง์ ์ฌ๋๋ค์ด ์น ์๋ฒ๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ ์ฐ๊ฒฐ์ด ์ด๋ ธ์ง๋ง ์๋ฌด๋ ์ฐ๊ฒฐ์ ์ ๋๋ก ๋ซ์ง ์์์ต๋๋ค.
$n=null;
$c=foo_connect();
$n->do_something() ; // fatal error
foo_close($c);
๋ฌผ๋ก OS๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋ ์ฐ๊ฒฐ์ ๋ซ์ง๋ง ๋ง์ ๊ฒฝ์ฐ์ php๊ฐ ์๋ ํ๋ก์ธ์ค๋ ์ค๋ ์ง์๋๋ ๋ฐ๋ชฌ์ ๋๋ค(์: ๋ฏธ๋ฆฌ ํฌํฌ๋ apache ํ๋ก์ธ์ค, php fast cgi ๋ฐ๋ชฌ, php-fpm ๋ฐ๋ชฌ, ..etc) ) ์ฆ, ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์์๊ธฐ ๋๋ฌธ์ OS๋ ํด๋น ์ฐ๊ฒฐ์ ๋ซ์ง ์์ต๋๋ค(์คํฌ๋ฆฝํธ๋ง ์ข ๋ฃ๋จ).
Salvatore Sanfilippo(redis์ ์ ์)์ ๋ฐ๋ฅด๋ฉด
https://twitter.com/antirez/status/207123059700801537
https://twitter.com/antirez/status/207123035243814912
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌ๋ ค ์์ต๋๋ค.
PHP ์น๋ช ์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ Predis๊ฐ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ์ ํ์ PHP ์์ผ์ด ์์ต๋๋ค. redis ์ฐ๊ฒฐ์ ์์ํ ์ข๋น/์คํจ์ด ๋๊ฑฐ๋ OS๊ฐ ์ ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค
์ด ๋ ๊ฐ์ง ์ ํ ์ค Predis๋ ์ด๋ค ์ ํ์ ์ฌ์ฉํฉ๋๊น?
๊ทธ๋ฌ๋ 0 ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ php mysql ๋ชจ๋์ ๋ํ ์ด์ ๊ฒฝํ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
mysql_pconnect()
๋ฅผ ์ฌ์ฉํ์ฌ MySQL์ ๋ํ ์๊ตฌ ์ฐ๊ฒฐ์ ์์ฑํ ๋ php.ini์ $ mysql.max_persistent
php.ini
๊ฐ ์ ์์ ์ธ ๊ฐ(MySQL์ ๋ํด ์ค์ ๋ ๊ฐ๋ณด๋ค ๋ฎ์)์ผ๋ก ์ค์ ๋์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋น์๊ตฌ์ MySQL ์ฐ๊ฒฐ์ ์ฌ์ฉํ๊ณ ์์๋ค๋ฉด mysql_close()
์ ๋ํ ๋ช
์์ ํธ์ถ ์ ์คํฌ๋ฆฝํธ ์คํ์ด ๋๋ ๋ ๋ฆฌ์์ค๊ฐ ํด์ ๋๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์์์ผ ํฉ๋๋ค. ๊ธ์, mysql ๋ชจ๋์ด๋ PHP ์์ฒด์ ์ผ๋ถ ๋ฒ๊ทธ๋ฅผ ์ ์ธํ๊ณ ).
์ฆ, Predis๋ persistent=1
๊ฐ ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์์ ์ง์ ๋ ๊ฒฝ์ฐ ์๊ตฌ ์ฐ๊ฒฐ์ ์ง์ํ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋น์๊ตฌ ์ฐ๊ฒฐ์ ๋ค๋ฅธ ๋น์๊ตฌ ๋ฆฌ์์ค์ ๋์ผํ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๋ซํ์ง๋ง(์คํฌ๋ฆฝํธ ์คํ์ด ๋๋๋ฉด ํด์ ๋จ) ์ฐ๊ฒฐ ํด๋์ค์ __destruct()
๋ฉ์๋๋ ์ด์จ๋ ๊ธฐ๋ณธ ์์ผ ์คํธ๋ฆผ์ ๊ฐ์ ๋ก ๋ซ์ต๋๋ค. ์ฆ, ์ฐ๊ฒฐ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ฑ ์ฐธ์กฐ๊ฐ ์๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฏ๋ก ์ฐ๊ฒฐ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์์ง๋ ๋ ์์ผ์ด ๋ซํ๋๋ค.
์ด๋ ๊ฒ ๊น์ ํ์ ์กฐ์น๋ฅผ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ด์ ์๊ฐ ์ด๊ณผ๋ฅผ 0์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
php.ini๋ฅผ ์กฐ์ ํ์ฌ mysql ์ค๋ฅ์ ๋ํด์๋ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html
Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฃ์กํฉ๋๋ค. ํ์ง๋ง Predis์ ์๋ ์ฌ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค :-) ์ด๊ฒ์ ์๋ง๋ ์ค๋์ ๋ถํฐ ๊ณ ์ ๋ ๋ช ์ ๋๋ ์ฌํญ ์ค ํ๋์ผ ๊ฒ์ด๋ฉฐ ์ฌ์ ํ ๊ทํ์ ์ ์์ด ์์ธกํ ์ ์๋ ํ๋์ผ๋ก ํดํน๋ ๊ตฌํ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. . ๊ทํ์ ๊ฐ์ ํน์ ์๊ตฌ ์ฌํญ์ ๊ตฌํํ๋ ์ต์ข ๊ฐ๋ฐ์์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ์ด๊ฒ์ด Predis๊ฐ ๊ทน๋๋ก ๋ชจ๋ํ๋๋๋ก ์ค๊ณ๋ ๋ฐ๋ก ๊ทธ ์ด์ ์ ๋๋ค.
์๋๋ฆฌ์ค์์ ๊ธฐ๋ณธ ์ฐ๊ฒฐ ํด๋์ค
Predis\Network\StreamConnection
๋ฅผ ํ์ฅํ์ฌexecuteCommand()
๊ฐtry ... catch
๋ธ๋ก ๋ด๋ถ์ ์์ ๋ฉ์๋๋ฅผ ๋ํํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ ์ฐ๊ฒฐํ๊ณ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋์ ๋ช ๋ น์ ๋๋ค. ํ์ดํธ๋ฆฌ์คํธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ด ์๋ํด์ผ ํ๋ ๋ช ๋ น์ ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค. README ์ ์ค๋ช ๋ ๋๋ก ์๋ก ์์ฑ๋ ์ฐ๊ฒฐ ํด๋์ค๋ฅผ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค์ ๋ฑ๋กํ ์ ์์ต๋๋ค.์ด ์ ๊ทผ ๋ฐฉ์์ด ๋์์ด ๋ ๊น์?
์ถ์ : ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ #75, ๋ช ๊ฐ์ง ํ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ธ ์ด๋ฉ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.