แฌแแแแกแแขแงแแแแแ
แฉแแแ แแแแกแแแขแ, แ แแแแแกแแช แแแฃแจแแแ แ แแแแ แช แฐแแแ, แจแแฅแแแแแแ แแแแกแแแแก, แ แแ แแแกแแแแซแแแแก แกแแแแขแแ แแกแ แแแแแแ แแแแ แแแแก แแ แแแ แกแแแแแฃแ แกแแแขแแแก. แแก แแแแ แแแแแขแแ แแกแแแแ แฉแแแ แแ แแแ แแแแ แแแแก แแแแแแฃแ แแแแก แแแกแแฌแงแแกแจแแแ; แแ แแแแแแขแจแ แแ แแแฎแแแแฃแแ แแแงแแแ แแแแ แแ แแคแแกแแแแแแแแแก แแแแแแ, แ แแแแแแแช แฌแแ แแ แกแแแฃแแแ แแแแแ, แแแแแแแ แฐแแแแแแกแ แแ แแ แแแฅแขแแแแ. แแแแ แแฆแแแฉแแแแก แฉแแแแ แแฆแแแแ แจแแแแ แฉแแแแแแ: แแแแฅแแแก แงแแแแ แแแแแ แชแแฃแ แแ แแ แช แแฃ แแกแ แแแแแ แชแแฃแ แกแแแขแแ, แแแแ แซแแแแ แซแแ แจแ แงแฃแ แแแแก แแแขแแ แแแแก แแแฃแแแแแก แแแกแแซแแแแแ.
แแแแแก แแแแฎแแ แชแแแแแแ
แแแ แแแแ แแแ แกแแ แแงแ แแฎแแแแ html แแแแ แแ แฉแแแก แแแ แกแแแแแฃแ แแแแกแแแขแแ, แกแแแแช แฎแแแแแฌแแ แแแแ แแแแ แแแฃแแแแก ul แกแแแจแ. แแแ แแแแฃแแ แแแ แแแแแก แแแแแแแแแแแจแ 20 แแแแ แแแก แแแ แแคแแก แจแแแแแ แแแแแฌแงแ แคแแฅแ แ, แ แแ แแก แแ แแงแ แซแแแแแ แแคแแฅแขแฃแ แ แแ แแแแแแฌแงแแแขแ แแ แแชแแกแแก แแแขแแแแขแแแแชแแ. stackoverflow-แแ แจแแแแแฉแแแ, แ แแ แแแแ แ แแแแแแแแ แแแฃแแแแแแก แกแแแขแแแแ แแแแแก แแ แแคแแแแแจแ, แแแแขแแ แแแแฌแแ แ แแแ แกแแ แ php-แจแ, แ แแแแแแช แฃแแ แแแแ แแแแแแแ แแ แแคแแแแแจแ, แแแฌแงแแแฃแแ แแแ แแแแแแแ (SO-แแ แแแกแแแแ แแแแ แแฆแแแแ แแกแแแแ: `/users/1` ), แแแแแฆแ แแแฃแแแแ แกแแกแฃแ แแแแ แขแแแแแแ แแ แแแแแแขแ SQLite-แจแ.
แแแแก แจแแแซแแแแ แแฌแแแแก แแแแ แ แแแ แกแแ: แแแแแแแกแแแแ URL-แแก แแแแแฅแชแแ SQLite แชแฎแ แแแจแ, แ แแแแแแแช แฉแแแแแชแแแ แกแขแแขแแแฃแ แ แกแแ HTML-แจแ. แแแ แขแแแ แซแแแแ แแแแแแแแ แแ แกแแแจแ. แแแแขแแ แ แแ แแงแ แแฎแแแแ URL-แแแ, แจแแแแแ แซแแแแ แฃแแ แแแแ แแแแแ แแงแ แแแคแฃแซแแแแฃแแ.
แแ แแขแแแแ แแแแแขแแแ แแ แแแฅแขแ แแ แแแแ แฎแแแก แจแแแแแ แแแแฃแแ แฃแแแ แแแก. แแ แแขแแแแ แฉแแแ แกแแแฃแจแแ แแแแแชแแแแแแ แฃแแแ แกแแ แฌแแแแ แแแขแ แแงแ แแ แแแ แซแแแแแ, แ แแ แฃแคแ แ แกแแ แแแแฃแแ แ แแแแก แแแแแแแแ แจแแแแซแแ. แแแ แแ แแแแกแ, แแแแ แแงแ แกแฃแ แแแแ, แแแแฃแคแแแ แจแแแแ แแแแ แแฎแแ แขแแฅแแแแแแแแแก.
แแแแแแแแ แแแ แแแ แกแแ
แแ แแแแแแ
แแฎแแแ แกแแแขแแแ แแแแขแแแ แแแแกแแแแก แแ แซแแแแแแ, แ แแแแแแช แกแแแฅแ แแแฃแแแ แแแแแแแก แจแแแแแแก:
- แแขแแแ แแแแ แจแแแแแ แกแ URL-แแ
- แแงแแแแแก แแ แแจแแก, แ แแแแแแช แแแฃแแแแแแก แฎแแแแแกแแฌแแแแแ แแงแ แแฃ แแ แ HTTPS
- แแแแ แฉแฃแแแแก แกแแแขแแก แแ แกแก
- แฌแงแแ แแก HTML แแ แกแแแแฃแ แแแ แแแแฎแแแ โแแแแแฅแกแแ แแแแกโ แแกแขแแ แแแจแ
- แแแแแแแแแแก แจแแแแแ แกแก, แแแแแแฌแแ แก แกแแแแฃแ แกแ แแ แแฆแฌแแ แแก
- แแแแฎแแแก แแแแแชแแแแแก แชแแแแแฃแ แแแแแฅแชแแแจแ
แแก แกแแแแแ แแกแ แแงแ แกแแแขแแแแก แฃแแ แแแแ แจแแกแแแแฎแแ แแ แกแแแจแ แแแแแกแแขแแแแ:
แแแแ แแ แงแแแแแคแ แแก แแแขแแแแขแฃแ แ แแแแแฅแกแแ แแแแก, แแแขแแแแ แแแแชแแแกแ แแ แ แแแขแแแแแก, แงแแแแแคแ แแก แแแแแฎแแแแแก แแแแ แแแ แแแ แแ แฏแแแแแแ แแ แแแ แแแแแแแจแ. แแฃแแแแช แฃแแ แแแแ แแแ แแแแแแแก แแแแแขแแแ แแแแ แแแแแก แแแกแแแแขแแแแแ, แกแแญแแ แแ แแแแแก แแฃแแแแ แแแ แแ แแแแแแแแ, แ แแแ แแแแแแแ แแฅแแแก แแชแแแแแฃแแ แแแขแแแชแแฃแ แ DDoS.
แแแแแแแ, แ แ แแฅแแ แฃแแแ, แงแแแแแคแ แแก แแแแแแแแ แจแแกแแซแแแแแแแ แกแแแฅแ แแแฃแแแ แแ แแแ แแแแแแแ แจแแแแซแแแแ แฃแแ แแแแ แจแแแแแฎแแ URL แแกแ, แ แแ แแแแแ แแแแ แแแแแแ แจแแแกแ แฃแแแก แงแแแแ แแแแแแแแ แกแแแแแ URL-แแแแกแแแแก. แแแแ แแ แแแแแช, แแฅแแช แกแแขแงแแ โแ แแแโ แแแแก แแฉแแแก. แแ แแฃ แ แแแ แแแแฎแแ แชแแแแแแฃแแแ, แแแจแแ แงแแแแ แแแแแแแแ แจแแแซแแแแ แแแแงแแก แแ แจแแกแ แฃแแแแก แแแแแแฃแ แแกแแแฅแ แแแฃแแแ.
แแแแแฌแงแแแขแแแแแ
แแแแแฎแแ แชแแแแแ แ แแแแแ แแ แจแแฅแแแแแ แแแแแแแแแแ แแ แแแแขแแ แแแฃแแ แกแแกแขแแแ แงแแแแ แแแแชแแแแก แแแกแแแฃแจแแแแแแแ. แแ แแ แแแแ แฎแแแแ แแแแแ แแชแแแ Redis Streams.
Redis แแแแแแแแแก แแแแแงแแแแแ PHP-แจแ
แแแแขแแ แ แแ แแแแแแแแ แฉแแแ แฉแแ แฉแ แแ แแ แแก แกแแแ แแแแแแขแแแแ แแ แ-แแ แแ Symfony, Laravel, Yii, แแกแฃแ แก แแแแแแ แแแแแฃแแแแแแแแ แแแแแแแแแแ. แแแแ แแ, แ แแแแ แช แแแแ แแแ (แแแ แแแแ แจแแแแฌแแแแแกแแก), แชแแแแแฃแแ แกแแ แแแแฃแแ แแแแแแแแแแแแแก แแแแแ แจแแฃแซแแแแแแแ. แ แแแแแแแ แแแแแแจแแ แแแฃแแ แงแแแแแคแแ แ แแ แแ แแก แฎแฃแแ แฌแแแก แฌแแแแแแแแ 3 แฉแแแแแแก แแ แแแฅแขแ, แแ แแแแแฃแแ แฉแแ แฉแแแ.
แแแแ แ แแกแแแแแ Symfony-แแ, แ แแแแ แช แแแแแแแแฃแแแฃแ แ แกแแกแแ แแแแแ แแแแแแแแแขแแแแก แแแแฌแแแแแแแก แจแแกแแฎแแ แแ แฃแแแ แแแงแแแแ แแแแแแ แ แแแแแแแก. แแกแแแ แจแแกแแซแแแแแแแ Laravel-แแก แแแแแแ แแ แแแแแแก แแแแแงแแแแแ, แแแแแแแแแ, แแแแ ORM, แแแแแ แคแ แแแแแ แแก แแ แกแแแแแแก แแแ แแจแ.
แกแแแคแแแแ/แแแกแแแฏแแ แ
แแแ แแแแ แแแแแแแแขแ แแแจแแแแ แแแแแแฃแ แ แแแฉแแแแ แแ แฃแแญแแแแแ แแแแแงแแแ. แแแแ แแ แฃแคแ แ แ แแฃแแ แแฆแแแฉแแแ Symfony-แแก แแแ แแ แแแแแงแแแแแแก แแแแแแแแแแแก แแฃแแแ. แ แแแแ แจแแแแแ แแแแ แแแแกแแแแแแ แฃแแแแแ แกแแแฃแ แ, แฃแแแ แ แกแแฎแแแแแแ, แแแขแแแฃแกแ แจแแขแงแแแแแแแแแแก แแแแแกแแชแแแแ แแ แแฃแแแแช Redis-แแ?
แแคแแชแแแแฃแ แกแแแขแแ แแแแฃแแแแขแแชแแ แกแแแแแแ แแแขแแแฃแ แ แแงแ, แแแแ แแ แแแแชแแแแแแแชแแ แแฎแแแแ Symfony-แกแแแแก แแงแ แแฆแฌแแ แแแ แแแแ แกแแงแแแ แแแ YML แแ แกแฎแแ แฏแแแแกแแฃแ แ แแแแแแแแแก แแแแแงแแแแแแ แแ แแกแแแคแแแแกแขแแแแกแแแแก. แแ แแแแแขแแ แแกแแแแ แแแแแ แแแกแขแแแแชแแแก แแ แแชแแกแ, แแแแกแแแฃแแ แแแแ แกแแแฎแแแฌแแ แแ แแแแแแแแแก แแ แแก. แแแแ แแ แแ แแแแก แแแแแแแแ แแแฃแแแแแแแแ แแแแ แฎแแแก แแแแแแแแแแแจแ แแแแแฌแแ.
แแแแก แแแ แแแแแ, แแฃ แ แแแแ แฃแแแ แจแแฅแแแแ แกแแกแขแแแ Symfony-แแก แฌแงแแ แแแแแก แแแแแงแแแแแแ, แแกแแแ แแ แแ แแก แงแแแแแแ แขแ แแแแแแฃแ แ แแแแชแแแ แแญแแแ แ แแแแแ:
แแ แงแแแแแคแแ แจแ แฉแแฆแ แแแแแแแก แแ แฎแแแแแแ แ แแฆแแชแแก แแแแแแแแแก แจแแแแแ แแแแแแ แแ แแแกแแแแแแแ, แ แแ แ แแฆแแช แงแแแแ แฏแแแแก แแแแแแแแแ แแ แแแแแแฌแงแแแขแ แกแฎแแ แ แแ แแแชแแแ.
แแแแแแแแฃแแ/แ แแแ
แแฆแแแฉแแแ, แ แแ แแก แแแแแแแแแแ แแญแแแ แแ แแงแ แแแแแฃแแ Laravel-แแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแกแแแ แแ แกแฎแแ แแแแแแแแแแฃแแแแแแแแ, แแแแขแแ แแแกแแ แแแแ แแ แ แแ แแแแฎแแ แฏแ: แแแแแแแกแขแแแแ แ, แแแแแแแแ แแ, แแแแฎแ แแแแแแแแแแฃแแแแแแ แแ แฌแแแจแแแ.
yiisoft/yii2-แ แแแ
แแแ แแแ, แแฅ แแแจแแแแ แแแแแ แแฃแแแ แกแแฎแแแแแแ, แแกแแ แแแแชแ แ แแแแจแแ แ Yii2-แแแ. แแ แแแแแฌแแ แแ แแแแแแแแแแแก แแแแแงแแแแแ แแ แแก แแ แแงแ แชแฃแแ, แแแแ แแ แแ แแแคแแฅแ แแ แแแแแ, แ แแ แแก แแแแแแแแ แแแแแแแแแแฃแแแ Yii2-แแ.
แกแฎแแ
แงแแแแแคแแ แ, แ แแช แแฆแแแแแฉแแแ GitHub-แแ, แแงแ แแ แแกแแแแ, แแแซแแแแแแฃแแ แแ แแแขแแแแแฃแแ แแ แแแฅแขแแแ แแแ แกแแแแแแแแแก, แฉแแแแแแแแกแ แแ แแแแ แ แแแแแแแแแก แแแแแแแฃแแแแแแแก แแแ แแจแ.
แแแแ แฃแแแแ symfony/messenger-แแ, แขแแฅแแแแฃแ แแแขแแแแแแ
แแ แฃแแแ แแแแแแ แแก แแแแแแแแแแ แแ, แแแ แแแแฃแแ แแ แแแก แแแขแแ แแแแก แจแแแแแ, แจแแแซแแแ. แแฆแแแฉแแแ, แ แแ แงแแแแแคแแ แ แกแแแแแแ แแแแแแฃแ แ แแ แแแ แขแแแ แแงแ. แแแขแแแฃแกแแก แแแแแกแแงแแแแแแแ แแแขแแ แ แฅแแ แฎแแแ แแแแแแแแ, แ แแแแแ... แแ แฃแแแ แแฅแแแแแ แ แแแแแแแแ แกแแแฃแ แแแ แแ แกแฎแแแแแกแฎแแ แขแแ แแแแ.
แกแฃแ แ แแแแแแแแ แแแแแฏแ:
- แฉแแแ แแฅแแแแ แจแแขแงแแแแแแแแแแก แแแแแฃแจแแแแแแแแก, แ แแแแแแแช แฃแแ แแแแ แแแแแซแแฎแแแแแ แฃแแแ แแงแแก
- แฉแแแ แแแฎแแแแ แแแ HandlerDescriptor-แจแ (แแแแกแ แแแแแแแแแแแแแ)
- แฉแแแ แแแฎแแแแ แแ โแแฆแแฌแแ แแแกโ HandlersLocator-แแก แแแแแแแแจแ
- HandlersLocator-แแก แแแแแขแแแ MessageBus แแแแแแแแแ
- แฉแแแ แแแแแแชแแแ `SenderInterface`-แแก แแแแแแแฅแขแก SendersLocator-แก, แฉแแแก แจแแแแฎแแแแแจแ `RedisTransport` แแแแกแแแแก แแแแแแแแแแก, แ แแแแแแแช แแแแคแแแฃแ แแ แแแฃแแแ แแจแแแ แแ.
- SendersLocator-แแก แแแแแขแแแ 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);
},
แแฅ แฎแแแแแ, แ แแ SendersLocator-แจแ แฉแแแ แแแแฃแแแแแ แกแฎแแแแแกแฎแแ โแขแ แแแกแแแ แขแโ แแ แ แแแแกแฎแแแแแแฃแแ แจแแขแงแแแแแแแแกแแแแก, แ แแแแแแแแแ แแแแแแฃแแก แแฅแแก แกแแแฃแแแ แ แแแแจแแ แ แจแแกแแแแแแก แแแแแแแแแแ.
แแ แแแแแแแแ แชแแแแ แแแแ แแ แแแฅแขแ, แ แแแแแจแแช แแแแแแกแขแ แแ แแแฃแแแ แกแแแ แแแแแแแก แแแแแแแชแแ, แ แแแแแแแช แแ แแแแแแแแแ แฃแ แแแแ แแแแแ แจแแแแแแ แแแขแแแฃแกแแก แแแแแงแแแแแแ:
แแแแ แแ แแ แแแฉแแแแแแ, แ แแแแ แจแแแซแแแแ แแงแแก แแแแฎแแแ แแแแแก แกแขแ แฃแฅแขแฃแ แ:
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();
แแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแแแแงแแแแแ แแแแแแแชแแแจแ
แแแขแแแฃแกแแก แแแแแ แแแแก แจแแแแแ, แแ แแแแแแงแแแ แชแแแแแฃแแ แแขแแแแแ แซแแแแ แกแแแฅแ แแแฃแแ แแ แซแแแแแแกแแแ แแ แแแแแแแแแ แชแแแแแฃแแ แแแแแฃแจแแแแแแแแ, แ แแแแแแแแแ แแแแแแฃแแ แแแแแแแก แแแแแก แกแแฅแแแก.
แแแแแชแแแแ แแแแแจแ แแฎแแแ แกแแแขแแก แแแแแขแแแแก แแแแกแแแแแ แแกแ แแแแแแงแฃแ แแแแแ:
แแ แแแแก แจแแแแแ แแแจแแแแ, แฉแแแแแแก แแแแ แแ แฃแคแ แ แแแแแแ แแแฎแแ แแฎแแแ แคแฃแแฅแชแแแแแก แแแแแขแแแ, แแแแแแแแแ, Rss-แแก แแแแฆแแแ แแ แแแแแแแ. แแแแขแแ แ แแ แแก แแ แแชแแกแ แแกแแแ แแแแแฎแแแก แแ แแแแแแแฃแ แจแแแแแ แกแก, แจแแแแแ RSS แแแฃแแแก แแแแแงแแแแ แแแแแฃแจแแแแแแแ, แ แแแแ แแชแแ WebsiteIndexHistoryPersistor, แแแแแแฌแแ แก แจแแขแงแแแแแแแแก โContent/HtmlContentโ, แแแฃแจแแแแแก แแแก แแ แแแแแกแชแแแก แกแแกแฃแ แแแ แจแแขแงแแแแแแแแก แแแกแ แแแแกแแแแแแก แแแกแฌแแ แแ.
แกแแแแแแแ, แฉแแแ แแแแแฆแแ แ แแแแแแแแ แแแแแแ, แ แแแแแแแแแ แแแแแแฃแแ แแแแ แฉแฃแแแแก แแแแจแแ แก แแฎแแแแ แกแแญแแ แ แ แแกแฃแ แกแแแแแ. แแแแแแแแแ แแแแแแ crawlers แจแแแชแแแก แงแแแแ แแแแแฃแจแแแแแแแก, แ แแแแแแช แแแแแฎแแแก แแแขแแ แแแขแจแ แจแแกแแแแก แจแแแแแ แกแแกแแแแก แแ แแแแแแก แแแแ แซแแแแแก แคแแแแก แแแแจแแ แก แแแแแชแแแแ แแแแแกแแแ.
แแฎแแ, แแแแแชแแแแ แแแแแแแ แแ แฉแแแแก แแแชแแแแ, แกแแญแแ แ ID-แแแ แแฃแแแแแ แฉแแกแแแก แจแแแแแ แฃแแ แแแแ แแแขแแแฃแกแแ แแแแแแชแแแ แงแแแแ แแแแแขแแ แแกแแแฃแ แแแแแฃแจแแแแแแแก.
แฌแงแแ แ: www.habr.com