Isibikezelo
Iwebhusayithi yami, engiyiqhuba njengento yokuzilibazisa, yakhelwe ukusingatha amakhasi asekhaya athakazelisayo nezingosi zomuntu siqu. Lesi sihloko saqala ukungithakazelisa ekuqaleni kohambo lwami lokuhlela; ngaleso sikhathi ngahlabeka umxhwele ngokuthola ochwepheshe abakhulu ababhala ngabo, izinto abazithandayo namaphrojekthi. Umkhuba wokuzitholela wona usekhona nanamuhla: cishe kuzo zonke izizinda zezohwebo nezingezona ezohwebo kakhulu, ngiyaqhubeka nokubheka unyaweni ngifuna izixhumanisi zababhali.
Ukuqaliswa komqondo
Inguqulo yokuqala kwakuyikhasi le-html kuwebhusayithi yami yomuntu siqu, lapho ngifaka khona izixhumanisi namasignesha ohlwini lwe-ul. Ngemva kokuthayipha amakhasi angu-20 isikhathi eside, ngaqala ukucabanga ukuthi lokhu akuphumelelanga kakhulu futhi nganquma ukuzama ukwenza inqubo ngokuzenzakalelayo. Ekugelezeni kwe-stackover, ngiqaphele ukuthi abantu abaningi bakhombisa amasayithi kumaphrofayili abo, ngakho-ke ngibhale umhlaseli ku-php, ovele wadlula kumaphrofayili, aqala ngeyokuqala (amakheli ku-SO kuze kube namuhla anjena: `/users/1` ), ikhiphe izixhumanisi kumaka oyifunayo futhi yawengeza ku-SQLite.
Lokhu kungabizwa ngokuthi inguqulo yesibili: iqoqo lamashumi ezinkulungwane zama-URL kuthebula le-SQLite, elithathe indawo yohlu olumile ku-HTML. Ngenze ukusesha okulula kulolu hlu. Ngoba kwakukhona ama-URL kuphela, bese ukusesha kwakusekelwe kuwo.
Kuleli qophelo ngiwuyekile lo msebenzi ngabuyela kuwo ngemuva kwesikhathi eside. Kulesi sigaba, ulwazi lwami lomsebenzi lwase lungaphezu kweminyaka emithathu futhi ngaba nomuzwa wokuthi ngingenza into engathi sΓna. Ngaphezu kwalokho, kwakunesifiso esikhulu sokuthola ulwazi ngobuchwepheshe obusha.
Inguqulo yesimanje
Inkinga
Amasayithi amasha engezwa ngomyalo wekhonsoli owenza ngokuhambisanayo okulandelayo:
- Ilanda okuqukethwe nge-URL
- Isetha ifulegi elibonisa ukuthi i-HTTPS iyatholakala yini
- Ilondoloza ingqikithi yewebhusayithi
- I-HTML yomthombo kanye nezihloko kulondolozwe emlandweni "wokukhomba".
- Ihlaziya okuqukethwe, kukhishwe Isihloko Nencazelo
- Ilondoloza idatha eqoqweni elihlukile
Lokhu bekwanele ukugcina amasayithi futhi uwabonise ohlwini:
Kodwa umqondo wokufaka inkomba ngokuzenzakalelayo, ukuhlukanisa nokubeka yonke into ngezigaba, ukugcina yonke into isesikhathini, ayizange ingene kahle kule paradigm. Ngisho nokwengeza indlela yewebhu yokwengeza amakhasi adinga impinda yekhodi nokuvinjwa ukuze kugwenywe i-DDoS engaba khona.
Ngokuvamile, konke kungenziwa ngokuhambisanayo, futhi endleleni yewebhu ungamane ulondoloze i-URL ukuze i-daemon esabekayo yenze yonke imisebenzi yama-URL asohlwini. Kodwa noma kunjalo, nalapha igama elithi "umugqa" liziphakamisa ngokwalo. Futhi uma ulayini usetshenziswa, khona-ke yonke imisebenzi ingahlukaniswa futhi yenziwe okungenani ngokulinganayo.
Isixazululo
Sebenzisa imigqa futhi wenze uhlelo oluqhutshwa umcimbi lokucubungula yonke imisebenzi. Futhi kade ngifuna ukuzama i-Redis Streams isikhathi eside.
Ukusebenzisa ukusakaza kwe-Redis ku-PHP
Ngoba Njengoba uhlaka lwami lungelona olunye lwemidondoshiya emithathu iSymfony, Laravel, Yii, ngingathanda ukuthola umtapo wolwazi ozimele. Kodwa, njengoba kwavela (ekuhlolweni kokuqala), akunakwenzeka ukuthola imitapo yolwazi yomuntu ngamunye. Yonke into ehlobene nolayini iphrojekthi evela koku-3 eyenziwa eminyakeni emihlanu edlule, noma iboshelwe ohlakeni.
Ngizwe okuningi nge-Symfony njengomhlinzeki wezinto eziwusizo ngazinye, futhi sengivele ngizisebenzisa ezinye zazo. Futhi ezinye izinto ezivela kuLaravel nazo zingasetshenziswa, ngokwesibonelo i-ORM yazo, ngaphandle kokuba khona kohlaka ngokwalo.
symfony/messenger
Ikhandidethi lokuqala labonakala lilungile ngokushesha futhi ngaphandle kokungabaza ngalifaka. Kepha kube nzima kakhulu ku-google izibonelo zokusetshenziswa ngaphandle kwe-Symfony. Ungahlangana kanjani esixukwini samakilasi anamagama ajwayelekile, angasho lutho, ibhasi lokudlulisa imiyalezo, ngisho nakuRedis?
Amadokhumenti kusayithi elisemthethweni ayenemininingwane eminingi, kodwa ukuqaliswa kwachazwa kuphela ku-Symfony kusetshenziswa i-YML yabo eyintandokazi nezinye izindlela zomlingo zabangahlanganisi nama-symphonist. Ngangingenaso isithakazelo enqubweni yokufaka ngokwayo, ikakhulukazi ngesikhathi samaholide oNyaka Omusha. Kodwa kwadingeka ngikwenze lokhu isikhathi eside ngingalindele.
Ukuzama ukuthola ukuthi ungaluqinisa kanjani uhlelo usebenzisa imithombo ye-Symfony futhi akuwona umsebenzi omncane kakhulu womnqamulajuqu oqinile:
Ngemva kokuhlolisisa konke lokhu futhi ngizama ukwenza okuthile ngezandla zami, ngafinyelela esiphethweni sokuthi ngangenza uhlobo oluthile lwezinduku futhi nganquma ukuzama enye into.
okukhanyayo/umugqa
Kuvele ukuthi lo mtapo wezincwadi uboshelwe ngokuqinile nengqalasizinda yeLaravel kanye nenqwaba yezinye izinto ezincikile, ngakho angizange ngichithe isikhathi esiningi kuyo: Ngiyifake, ngiyibuke, ngabona ukuncika futhi ngiyisuse.
yiisoft/yii2-umugqa
Hhayi-ke, lapha kwathathwa ngokushesha egameni, futhi, ukuxhumana okuqinile ku-Yii2. Kwadingeka ngisebenzise lomtapo wolwazi futhi kwakungekubi, kodwa angizange ngicabange ngeqiniso lokuthi kuncike ngokuphelele ku-Yii2.
Abanye
Konke okunye engikuthole ku-GitHub bekungathembeki, kuphelelwe yisikhathi futhi kulahliwe amaphrojekthi angenazinkanyezi, amafoloko kanye nenani elikhulu lokuzibophezela.
Buyela ku-symfony/messenger, imininingwane yobuchwepheshe
Kwadingeka ngithole lo mtapo wolwazi, futhi ngemva kokuchitha isikhathi esengeziwe, ngakwazi. Kwavela ukuthi konke kwakumfushane futhi kulula. Ukuze ngiqinise ibhasi, ngenza imboni encane, ngoba... Bekufanele ngibe namathayi amaningana kanye nezibambi ezihlukene.
Izinyathelo ezimbalwa nje:
- Sakha izibambi zemiyalezo okufanele zishayeleke kalula
- Siwagoqa nge-HandlerDescriptor (ikilasi elisuka kulabhulali)
- Sigoqa lezi "Descriptors" kusibonelo se-HandlersLocator
- Ukwengeza i-HandlersLocator kusibonelo se-MessageBus
- Sidlulisa isethi ethi `SenderInterface` ku-SendersLocator, esimweni sami samakilasi `RedisTransport`, acushwa ngendlela esobala.
- Ukwengeza i-SendersLocator kusibonelo se-MessageBus
I-MessageBus inendlela ethi `->dispatch()` ebheka izibambi ezifanele ku-HandlersLocator bese idlulisela umlayezo kubo, isebenzisa `SenderInterface` ehambisanayo ukuthumela ngebhasi (Redis streams).
Ekucushweni kwesiqukathi (kulokhu php-di), yonke le nqwaba ingalungiswa kanje:
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);
},
Lapha ungabona ukuthi ku-SendersLocator sinikeze "izithuthi" ezihlukene zemilayezo emibili ehlukene, ngamunye onoxhumano lwawo emifudlaneni ehambisanayo.
Ngenze iphrojekthi yedemo ehlukile ebonisa ukusetshenziswa kwama-daemon amathathu axhumana wodwa kusetshenziswa ibhasi elilandelayo:
Kodwa ngizokukhombisa ukuthi umthengi angahlelwa kanjani:
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();
Ukusebenzisa le ngqalasizinda ohlelweni lokusebenza
Ngemva kokusebenzisa ibhasi endaweni yami engemuva, ngahlukanisa izigaba ngazinye kumyalo omdala wokuvumelanisa futhi ngenza izibambi ezihlukene, ngamunye owenza okwakhe.
Ipayipi lokwengeza isayithi elisha kusizindalwazi libukeke kanje:
Futhi ngokushesha ngemva kwalokho, kwaba lula kakhulu kimi ukungeza ukusebenza okusha, isibonelo, ukukhipha nokwehlukanisa ama-Rs. Ngoba le nqubo futhi idinga okuqukethwe kwasekuqaleni, bese isibambi sesixhumi sesixhumanisi se-RSS, njenge-WebsiteIndexHistoryPersistor, sibhalisela umlayezo othi βOkuqukethwe/HtmlContentβ, siwucubungule futhi sidlulise umlayezo owufunayo ngokuqhubekayo.
Ekugcineni, sagcina sesinamademoni amaningana, ngalinye eligcina ukuxhumana kuphela ezinsizeni ezidingekayo. Ngokwesibonelo idimoni crawlers iqukethe zonke izibambi ezidinga ukuya ku-inthanethi ukuze uthole okuqukethwe, kanye ne-daemon phikelela inokuxhumana kusizindalwazi.
Manje, esikhundleni sokukhetha ku-database, ama-id adingekayo ngemva kokufakwa yi-persister avele adluliselwe ngebhasi kubo bonke ababambi abanentshisekelo.
Source: www.habr.com