αα»ααααααΆ
ααα ααααααααααααα»α ααααααα»αααααΎαααΆαααΆα
ααααα
αααΌαα
α·ααα ααααΌαααΆααα
ααΆα‘αΎαααΎααααΈαααα ααααα ααααααα½αα±ααα
αΆααα’αΆαααααα αα·αααα αααααααααΆαααααα½αα αααααΆααααααααΆαα
αΆααααααΎαα
αΆααα’αΆαααααααααα»ααα
ααΎαααααΌαααααααΎαααααααααααα·ααΈαααααααα»α αα
αααααααααα»αα
αΆααα’αΆαααααααααΆαααααΆαααααααΆααααααααα’αααααααΆαααα’ααα
αΆαααααααααααα’αααΈαααα½αα―α α
αααΌαα
α·ααα αα·ααααααααααααα½αααα ααααΆααααααΆαααααααααα½ααααααααΆαααααα½ααααα»ααα
ααααΆααα αΌαααααααααααααααααα αα
ααΎααααΎααααααααααα αααααααΆαα·ααααααα αα·ααα·ααααααΆαα·αααααααααααΆαα αααα»ααα
ααααααααααΎααα
αααα»αααΆααααΆ ααΎααααΈααααααααααααααΆαααα
ααΆααα’ααααα·ααααα
ααΆαα’αα»αααααααα·α
ααααααααΌαααΊααααΆααααααΆααααα html αα ααΎααα αααααααααΆαααααα½ααααααααα»α ααααααα»αααΆαααααααααΆαααααααΆαα αααααααΆαα αααα»ααααααΈ ul α αααααΆαααΆαα’αααααα ααα½α 20 ααααααααα»ααααααααα½αααα αααα»αα αΆααααααΎααα·αααΆααΆαα·αααΌαααΆαααααα·αααααΆααα α αΎαααΆααααααα α α·αααααααΆααΆαααααΎααααααααααααα·ααααααααΎαααΆααααα αα ααΎ stackoverflow αααα»αααΆαααααααααΆααααΎαααΆααα»αααααΆα αααΎααααα αΆαααΈααα ααααααα αααα»ααααααααααααα½ααα ααΌα αααααααα»αααΆαααααα parser αα αααα»α php αααααααΆααααααααααΆαααααααααααα αΆααααααΎαααΈααααΌα (α’αΆααααααΆααα ααΎ SO αα αΌαααααααααααααααααααΊααΌα αααα `/users/1` ) ααΆαααΆααααααααααΆααααΈααααΆααααα ααααΆα α αΎαααααααααΆαα αααα»α SQLite α
αααα’αΆα ααααΌαααΆαααα α ααΆααααααΈααΈαα ααααα»ααα URLs ααΆαααααΊααα αααα»αααΆααΆα SQLite αααααΆααααα½ααααααΈαα·αα·αααααα αααα»α HTML α αααα»αααΆααααααααααΆαααααα½ααααα»ααααααΈαααα αααααΆααα ααΆααα URLs αααααΆααααααΆααααααααααΊααα’ααααΎαα½αααΆα
αα ααααΆααααΆαααα αααα»αααΆαααααααααααααααα α αΎααααααααα ααΆαα·ααααααΆααααΈααααααααΌαα αα ααααΆααααΆαααα αααα·αααααααΆαααΆααααααααα»αααΆαα αααΎαααΆαααΈααααΆαα αΎα α αΎααααα»αααΆαα’αΆααααααααΆαααα»αα’αΆα ααααΎα’αααΈαα½αααααααααααααααΆααααα ααΎαααΈαααααα ααΆαααααα ααααααΎααΆααα αΆαααααα αα αααα·ααααΆααααΈαα
ααααααααΎα
αααα αΆ
ααα αααααααααΈααααΌαααΆααααααααααααΆααααααααΆαα»αααΌααααααααΎααααΆαααααααΌα ααΆααααααα
- ααΆαααααΆαα·ααΆααα URL
- ααααααααααααααα αΆαααΆ HTTPS ααΆαα¬α’αα
- αααααΆααααΉαααΆαααααα ααααα
- ααααα HTML αα·αααααααΆααααΌαααΆααααααΆαα»ααααα»ααααααααα· "ααΆαααααΎαα·αα·αααα"
- αααααααΉαααΆα αααααααα αααααΎα αα·αααΆααα·αααααΆ
- αααααΆαα»ααα·αααααααα ααααα»αααΆα ααααα‘αα
αααααΊαααααααααΆααααΎααααΈαααααΆαα»αααα ααααα αα·ααααα αΆααα½αααΆαααα»ααααααΈαα½αα
ααα»αααααααα·αααααΆαααααΎαα·αα·αααααααααααααααααααα· α
αΆααααααΆαα αα·αα
αΆααααααΆααα’αααΈαααααααααΆα αααααΆα’αααΈαααααααααΆαα±ααααΆαααααα αα·αααααα’αα
ααΉαααααΌαααααα ααΌααααΈααααααΆαααααααααααα·ααΈααΆαααααααα αααααααΎααααΈααααααααααααααααΆαααΆαααΆαα
ααααααΌα αα·αααΆααααααααΆααααΎααααΈαααααΆα DDoS αααααΆααααααΆαα»ααα
ααΆααΌαα α’αααΈααααααααΆαα’αΆα ααααΌαααΆαααααΎααααΆααααα α αΎααα αααα»ααα·ααΈααΆααααααααααΆα α’αααα’αΆα αααααΆαα»α URL αααΆαααΆαααα ααΌα αααααααα·ααααα α·ααΆ α’αα»αααααα·α αα ααΆαααΆααα’αααααααΆαα URLs ααΈαααααΈα ααα»αααααααααΈααΆαα ααΈαααααΆααα "αα½α" ααααΆααααα½αααΆαααααα α αΎαααααα·αααΎαα½αααααΌαααΆαα’αα»αααα ααααα·α αα ααΆαααΆααα’ααα’αΆα ααααΌαααΆααααα αα αα·αα’αα»αααααααΆαα αα ααΆαααααα’ααααΆαα
ααΆααααααα α α·ααα
α’αα»αααααα½α αα·ααααααΎαααααααααααααααα»ααααααααΉαααα·ααΆααααααααΆααααααΎαααΆααα·α αα ααΆαααΆααα’ααα α αΎααααα»αα ααααΆααααα Redis Stream ααΆααΌαααα αΎαα
ααΆαααααΎααααΆααααααααΈα Redis αα αααα»α PHP
αααααΆααα αααααΆααααααααααααααααα»ααα·ααααααΆαααα»αα αα»αααααααΆααααΈ Symfony, Laravel, Yii αααα»αα ααααααααααααααΆαααα―αααΆααααα½αα ααα»αααα ααΌα αααααΆααΆαααααααααΆα (αα ααΎααΆααα·αα·αααααααΌα) ααΆαα·αα’αΆα αα αα½α αααααα»αααΆαααααααααααααΆααααααααααααααααΈαα½ααα α’αααΈβαααααβαααΆαβαααβααΆααβααβααΉαβαα½αβααΊβααΆβααααααβαα½αβααΈ 3 αααααααΉαααβααΆαβααΈβααααΆαβααααΆαβαα»α α¬βααααΌαβααΆαβααααΆααβαα βααΉαβαααααααααα
αααα»αααΆαααΊα αααΎαα’αααΈ Symfony αααα»αααΆαααΆα’ααααααααααααααααΆαααΆαα»ααΆααααααααααα»αααα α αΎααααα»αααΆαααααΎααααΆαααα½αααΆαα½αα ααα½ααα½α α αΎαα α αΎαααααα»αα½αα ααα½αααΈ Laravel ααα’αΆα ααααΌαααΆαααααΎααααα α§ααΆα ααα ORM αααααα½ααα αααααααΆαααααααΆαααααααααααααααα½αα―αα
symfony/messenger
αααααααααΈ XNUMX α αΆααααΌα ααΆααα’ααααΆαα α αΎααααααααΆαααΆααααααα αααα»αααΆαααα‘αΎαααΆα ααα»ααααβααΆβααΆαβααααΆαβααΆβααΆαβαα·ααΆαβααΆαβαααα»αβααΆαβααααΎ Google α§ααΆα αααβααβααΆαβααααΎβαααα Symfony α ααΎααααΎααΌα ααααα ααΎααααΈαααααΌααααα»αααΈαααα»αααααααΆαααααααΆααααααααΆαααααααΆαααα, α‘αΆααααα»ααααααΆααααΆααααααΌαααΆααα·αααΌααααΈαααα ααΎ Redis?
α―αααΆααα
ααΎααα αααααααααΌαααΆαααΊααΆααααααααααα’α·α ααα»ααααααΆαα
αΆααααααΎαααααΌαααΆααα·αααααΆαααααΆαα Symfony αααααααΎ YML ααααα½αααα
αΌαα
α·ααα αα·ααα·ααΈααΆαααααααααααααααααααααααααΆααα’αααααααα·ααααααΆα’αααααααααααα αααα»ααα·αα
αΆααα’αΆααααααααΎααααΎαααΆαααα‘αΎαααααααα½αα―ααα ααΆαα·ααααααα»αα±ααΆααα»αααα
αΌαααααΆαααααΈα ααα»ααααβαααα»αβααααΌαβααααΎβαααβαααβαααα»αβαααβαααβααΌαβαα·αβααΉαβααααΆαβαααα
ααΆαααααΆααΆααααα·ααΈααααΎα±ααααααααααααααΆαααααααααΎααααα Symfony αααα·ααααααΆαα·α αα ααΆαααααΌα αααα»ααααααΆαααααααααααααααΉααααΉααααα
αααααΆααααΈααααααααααΈα’αααΈαααΆααα’ααααα α αΎαααααΆααΆαααααΎα’αααΈαα½αααααααααααααα»α αααα»αααΆαααααα·ααααΆαααΆ αααα»ααααα»αααααΎααΎα
αααααα½ααααααα α αΎααααααα
α
α·αααααΆαααααα’αααΈααααααααα
ααααααΊ / αα½α
ααΆααΆαααααααααΆαααΆαααααΆααααααααααΌαααΆαααααΆαααααΆαααΉααααΉααα ααΉαα αααααΆαα ααΆαααααααα Laravel αα·αααΆαα’αΆααααααααααα ααΌα αααααααα»ααα·αααΆαα αααΆααααα αααΎαααΎααΆααα αααα»αααΆαααα‘αΎαααΆ ααΎαααΆ ααΎαααΆαα’αΆααααα αα·ααα»αααΆα ααα
yiisoft/yii2- αα½α
ααΆααΆααααααΎαααΆαα, αα ααΈαααααΆααααΌαααΆαααααααααααΆααααΈααααα, ααΆααααΈααααααα, ααΆααααααΆαααααΆαααΉαααΉααα Yii2 α αααα»αααααΌαααααΎαααααΆαααααα α αΎαααΆαα·αα’αΆααααααα ααα»αααααααα»ααα·αααΆααα·αα’αααΈααΆααα·ααααααΆααΆα’αΆαααααααΆαααααα»αααΎ Yii2 αααααα
αα ααα
α’αααΈααααααααααααααα»αααΆαααααΎααα ααΎ GitHub ααΊαα·αα’αΆα ααΏαα»αα α·αααααΆα α α½ααααα αα·ααααααααααααααΌαααΆαααααααα αααααααααΆαααααΆα αααα’αα αα·αααααΆαααα½αα ααα½αααα
αααα‘αααα symfony/messenger, ααααααΆααααα’α·ααα αα ααααα
αααα»αβααααΌαβαααααβαααβααΈβαααααΆαααβααα α αΎαβαααααΆααβααΈβα αααΆαβαααβαα½αβα ααα½αβααα αααα»αβα’αΆα βααααΎβααΆαα ααΆααΆαααααααααΆαααΆα’αααΈααααααααΆαααΊαα·αααΆαααααααα·αααΆααααα ααΎααααΈαααααΏαα‘αΆααααα»α αααα»ααααααΎααααα αααααΌα αα½α ααααα... αααα»αβααααΌαβααΆαβααβααααααβααΆβααΆαβααααβαααβααΆβα αααΎαβαα·αβααΆαα½αβααβααΆααβαααααβααααΆβα
ααααΆααααααΈαααΈααα αΆαααα»αααααα
- ααΎααααααΎααααααα·ααΈαααααααααααΆα ααααα½αααα’αΆα α α ααΆααααΆαααΆαααα
- ααΎααα»ααα½αααΆαα αααα»α HandlerDscriptor (ααααΆααααΈαααααΆααα)
- ααΎααα»α "α’ααααα·αααααΆ" ααΆααααααα αααα»αα§ααΆα ααα HandlersLocator
- ααΆααααααα HandlersLocator αα αααα»αα§ααΆα ααα MessageBus
- ααΎααααααΌααααα»ααα 'SenderInterface' αα SenderLocator αααα»αααααΈαααααααα»αααααααΆαα 'RedisTransport' αααααααΌαααΆαααααααα ααΆααααααααααΆαααααααΆαααααααα
- ααΆααααααα SenderLocator αα ααΆαα MessageBus
MessageBus ααΆααα·ααΈααΆααααα `-> dispatch()` αααααααΎαα’ααααααααααΆαααααααααααα αααα»α HandlersLocator α αΎααααααΌαααΆααα αα½ααα αααααααΎ 'SenderInterface' αααααααΌαααααΆααΎααααΈααααΎααΆαα‘αΆααααα»α (ααααααΈα Redis) α
αα αααα»αααΆαααααααα ααΆαααααααααα»αααΊααα (αααα»αααααΈααα php-di) αααα ααααΆααααΌααααα’αΆα ααααΌαααΆαααααααα ααΆααααααααααΌα αααα
CONTAINER_REDIS_TRANSPORT_SECRET => function (ContainerInterface $c) {
return new RedisTransport(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
$c->get(CONTAINER_SERIALIZER))
;
},
CONTAINER_REDIS_TRANSPORT_LOG => function (ContainerInterface $c) {
return new RedisTransport(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
$c->get(CONTAINER_SERIALIZER))
;
},
CONTAINER_REDIS_STREAM_RECEIVER_SECRET => function (ContainerInterface $c) {
return new RedisReceiver(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
$c->get(CONTAINER_SERIALIZER)
);
},
CONTAINER_REDIS_STREAM_RECEIVER_LOG => function (ContainerInterface $c) {
return new RedisReceiver(
$c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
$c->get(CONTAINER_SERIALIZER)
);
},
CONTAINER_REDIS_STREAM_BUS => function (ContainerInterface $c) {
$sendersLocator = new SendersLocator([
AppMessagesSecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET],
AppMessagesDaemonLogMessage::class => [CONTAINER_REDIS_TRANSPORT_LOG],
], $c);
$middleware[] = new SendMessageMiddleware($sendersLocator);
return new MessageBus($middleware);
},
CONTAINER_REDIS_STREAM_CONNECTION_SECRET => function (ContainerInterface $c) {
$host = 'bu-02-redis';
$port = 6379;
$dsn = "redis://$host:$port";
$options = [
'stream' => 'secret',
'group' => 'default',
'consumer' => 'default',
];
return Connection::fromDsn($dsn, $options);
},
CONTAINER_REDIS_STREAM_CONNECTION_LOG => function (ContainerInterface $c) {
$host = 'bu-02-redis';
$port = 6379;
$dsn = "redis://$host:$port";
$options = [
'stream' => 'log',
'group' => 'default',
'consumer' => 'default',
];
return Connection::fromDsn($dsn, $options);
},
αα ααΈαααα’αααα’αΆα ααΎαααΎαααΆαα αααα»α SenderLocator ααΎαααΆαααααα "ααΆαααΉααααααΌα" αααααααααΆαααααΆααααΆαααΈααααααααααΆ αααααΈαα½ααααΆαααααΆααααααααααΆααααααααΆαα ααΉαααααααΈααααααααΌαααααΆα
αααα»αααΆααααααΎαααααααααΆαααααααΆα
ααααα‘αααα½αααααααα αΆαααΈαααααα·ααΈαααααα·αααΈαααααΆααααααααΆαα
αα·ααα
αααααααααΎα‘αΆααααα»αααΆααααααα
ααα»αααααααα»αααΉααααα αΆαα’αααααΈαααααααα’αααααααΎααααΆααα’αΆα ααΆααα ααΆααααααααα
use AppMessagesDaemonLogMessage;
use SymfonyComponentMessengerHandlerHandlerDescriptor;
use SymfonyComponentMessengerHandlerHandlersLocator;
use SymfonyComponentMessengerMessageBus;
use SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
use SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
use SymfonyComponentMessengerTransportSenderSendersLocator;
require_once __DIR__ . '/../vendor/autoload.php';
/** @var PsrContainerContainerInterface $container */
$container = require_once('config/container.php');
$handlers = [
DaemonLogMessage::class => [
new HandlerDescriptor(
function (DaemonLogMessage $m) {
error_log('DaemonLogHandler: message handled: / ' . $m->getMessage());
},
['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
)
],
];
$middleware = [];
$middleware[] = new HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = new SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = new SendMessageMiddleware($sendersLocator);
$bus = new MessageBus($middleware);
$receivers = [
CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = new SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();
ααΆαααααΎααααΆααα αααααΆαα ααΆααααααααααααα αααα»ααααααα·ααΈαα½αα
αααααΆαα’αα»ααααα‘αΆααααα»ααα αααα»ααααααααΆαααααααααααααα»α αααα»αααΆααααααααααΆααααΆαααΈαα½ααα ααααΈααΆααααααααΆ synchronous α αΆαα α αΎααααααΎαα’ααααααααααΆαααΆα ααααα‘αα αααααααΆαααααααΎααΏαααααΆαααααα½αα
ααααααααααΆααααΆαααααααααα αααααααααΈαα ααΌαααααΆααα·ααααααααΎααα ααΌα αααα
α αΎαααααΆαααααααΆααααΈααα ααΆααΆααααααΆααααα½ααααααΆαααααα»ααααα»αααΆααααααααα»αααΆαααααΈ α§ααΆα ααα ααΆααααααα
αα αα·αααα Rss α αααααΆααα ααααΎαααΆααααααααΆαααΆαααΆαα·ααΆααΎα αααααΆααααα’ααααααααααΆααααααα·ααΈααΆαααααα RSS ααΌα
ααΆ WebsiteIndexHistoryPersistor ααΆαααΆα "ααΆαα·ααΆ / HtmlContent" ααααΎαααΆαααΆ αα·ααααααΌαααΆααααα
ααααΆαααΆααααααααααααΆαααααααααα
αα
ααΈαααα
αα ααΎαααΆααααα
ααααΆαα½αααΉααααα·αααΆα
αααΎα αααααΈαα½αααααααΆααΆαααααΆααααααΆααααααααααΆαα½αααααΆαα
αΆαααΆα
αααα»αααααα α§ααΆα ααααα·ααΆα
ααααααΌαααΆα ααΆαα§ααααααααααααΆαααΆααα’ααααααααααΌαα±ααα
αΌααα
ααΆααα’ααΈαααΊαα·ααααααΆααααΆαα·ααΆ αα·ααααα·α αααα ααΆαααΆααααααΆαααα
ααΌαααααΆααα·ααααααα
α₯α‘αΌαααα αααα½αα±ααααΆαααααΎαααΎαααΈααΌαααααΆααα·αααααα ααααααααΆαααααααααΌαααΆααααααΆααααΈααΆααααα
αΌααααα’αααααααΌααααΌαααΆααααααΌααααΆαααΆααααααΆααααα‘αΆααααα»ααα
ααΆααα’ααααααααααΆααααα
αΆααα’αΆααααααααΆααα’ααα
ααααα: www.habr.com