ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ ΠΏΡΠ½ΠΈΠΊΠ° | PHP, Laravel, Symfony, CodeIgniter
ΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΡ ΠΏΡΠ½ΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅. ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot Π£ΡΠΈΡΡΡΡ Ρ Π½Π°Ρ: clc.to/M561SQ ΠΠ»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ: @proglibrary_feeedback_bot Π ΠΠ: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Show moreπ Analytical overview of Telegram channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ ΠΏΡΠ½ΠΈΠΊΠ° | PHP, Laravel, Symfony, CodeIgniter
Channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ ΠΏΡΠ½ΠΈΠΊΠ° | PHP, Laravel, Symfony, CodeIgniter (@phpproglib) in the Russian language segment is an active participant. Currently, the community unites 10 462 subscribers, ranking 11 707 in the Technologies & Applications category and 60 816 in the Russia region.
π Audience metrics and dynamics
Since its creation on Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ, the project has demonstrated rapid growth, gathering an audience of 10 462 subscribers.
According to the latest data from 27 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -37 over the last 30 days and by -2 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 16.71%. Within the first 24 hours after publication, content typically collects 7.56% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 748 views. Within the first day, a publication typically gains 791 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 1.
- Thematic interests: Content is focused on key topics such as php, laravel, ΠΏΡ ΠΏΡΠ½ΠΈΠΊΠ°, artisan, api.
π Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
βΠΡΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΏΡ
ΠΏΡΠ½ΠΈΠΊΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π»Π΅.
ΠΠΎ ΡΠ΅ΠΊΠ»Π°ΠΌΠ΅: @tproger_sales_bot
Π£ΡΠΈΡΡΡΡ Ρ Π½Π°Ρ: clc.to/M561SQ
ΠΠ»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ: @proglibrary_feeedback_bot
Π ΠΠ: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68bβ
Thanks to the high frequency of updates (latest data received on 28 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
use function MongoDB\Driver\Monitoring\addSubscriber;
public function boot(): void
{
addSubscriber(new MongoCommandSubscriber());
}
ΠΠ°Π»ΡΡΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΡΠ°ΠΌ ΠΎΡΠ΄Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ (find, aggregate, insert), ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΈ ΡΠ°ΠΉΠΌΠΈΠ½Π³, Π±Π΅Π· ΠΏΡΠ°Π²ΠΎΠΊ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΏΡΠΎΡΡ Π΄ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡΠΎΠ³Π° ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ is_slow.
Π§ΡΠΎΠ±Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π»ΠΎΠ³ΠΎΠ² Π½Π΅ ΡΠ°Π·ΡΠ°ΡΡΠ°Π»Π°ΡΡ Π΄ΠΎ Π½Π΅ΠΏΡΠΈΠ»ΠΈΡΠΈΡ, Π½Π°Π²Π΅ΡΠΈΠ²Π°ΡΡ TTL-ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° created_at Ρ expireAfterSeconds: 604800 (Π½Π΅Π΄Π΅Π»Ρ). Mongo ΡΠ°ΠΌ ΠΏΠΎΠ΄ΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠ°ΡΡΡ.
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ
ΠΏΡΠ½ΠΈΠΊΠ°
#how_toΠ€Π°ΠΉΠ»Ρ ΠΈ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ: ls, cd, mkdir, rm, mv, cp. ΠΠ°Π·Π°, Π±Π΅Π· ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡ Π΄Π°ΠΆΠ΅ Π»ΠΎΠ³ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅ΡΡ. ΠΠΎΠΈΡΠΊ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅: find, grep, cat. Π’Π²ΠΎΠΈ Π»ΡΡΡΠΈΠ΅ Π΄ΡΡΠ·ΡΡ ΠΏΡΠΈ Π΄Π΅Π±Π°Π³Π΅ Π³ΠΈΠ³Π°Π±Π°ΠΉΡΠ½ΡΡ Π»ΠΎΠ³ΠΎΠ² Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΏΠ°Π²ΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ: ps, kill, top. ΠΠΊΡΡΡΠ΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡ Ρ ΠΈΡΡΡΠ³Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΡΠΊ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ» Π²ΡΡ Π½ΠΎΠ΄Ρ. ΠΡΠ°Π²Π° ΠΈ ΡΠ΅ΡΡ: chmod, ping, ifconfig.Π ΠΊΠ°ΠΊ Ρ Π²Π°Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΡΡ? β€οΈ β ΠΠΈΠ²Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ π₯ β ΠΠ½Π°Ρ Π±Π°Π·Ρ πΉ ΠΡΡΡ Β«ΠΡΠ½ΠΎΠ²Ρ IT Π΄Π»Ρ Π½Π΅ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²Β» πΉ ΠΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°ΡΠΈΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° πΉ Π‘Π°ΠΉΡ ΠΠΊΠ°Π΄Π΅ΠΌΠΈΠΈ πΉ Π‘Π°ΠΉΡ Proglib πββοΈ ΠΠ·Π±ΡΠΊΠ° Π°ΠΉΡΠΈΡΠ½ΠΈΠΊΠ° #Π»ΠΈΠΊΠ±Π΅Π·
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΠ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ML-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΡΠΈΠ½ΡΠ΅Ρ Π΅ Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΡΡΠ΅ΠΊΡΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ 100 ΠΌΠ»Π½ β½π£ ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² Π½Π° 6.000+ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΠ½ΡΠΎΠ½ ΡΡΡΠΎΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΡΡΡΠΈ Π»ΡΠ΄Π΅ΠΉ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΄Π΅.π£ Π£ΡΠΊΠΎΡΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ
ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ML-ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ ΠΈ ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΠ» Π²ΡΠ΅ΠΌΡ ΠΎΡ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄ΠΎ ΡΠ΅Π»ΠΈΠ·Π°π ΠΠ΄Π΅ ΠΠ½ΡΠΎΠ½ ΡΠ΅ΡΠΏΠ°Π΅Ρ Π·Π½Π°Π½ΠΈΡ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΡΠΊΡΠΏΠ΅ΡΡΠ°): - X (Twitter) β Π³Π»Π°Π²Π½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π±Π»ΠΎΠ³ ΠΠΎΡΠΈΡΠ° Π§Π΅ΡΠ½ΠΈ (ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Claude Code) β ΡΠ°ΠΌ Π±Π°Π·Π° ΠΏΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅. - ΠΠ΅ΡΠ²ΠΎΡΠΊΠΈΠ½Π³ Π² Π’Π: ΡΠ°ΡΡ LLM ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΠΈ AI-ΡΠ°Ρ β Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΎΡΠ²Π΅Ρ ΠΏΠΎΡΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΎΠΏΡΠΎΡ. - ΠΠΎΠ²ΠΎΡΡΠΈ AI: ΠΊΠ°Π½Π°Π»Ρ Π‘ΠΈΠΎΠ»ΠΎΡΠ½Π°Ρ ΠΈ Denis Sexy IT. ΠΠ° ΠΊΡΡΡΠ΅ Agentops ΠΠ½ΡΠΎΠ½ ΡΡΠΈΡ ΡΡΡΠΎΠΈΡΡ Β«Π½Π΅ΡΠ±ΠΈΠ²Π°Π΅ΠΌΡΠΉΒ» Π±ΡΠΊΠ΅Π½Π΄: ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ, ΡΠ°ΠΉΠΌΠ°ΡΡΠ°ΠΌΠΈ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈ Π°Π³Π΅Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ 24/7. π ΠΠ°ΠΉΡΠΊΠΈΠ΅ Π‘ΠΠΠΠΠ Π² Proglib Academy! ΠΠΎ ΠΊΠΎΠ½ΡΠ° ΠΌΠ°Ρ Π½Π° Π²ΡΠ΅ ΠΊΡΡΡΡ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ AgentOps ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΠ-Π°Π³Π΅Π½ΡΠΎΠ²) Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΡΠΊΠΈΠ΄ΠΊΠ° -40%. ΠΡΠΎ Π»ΡΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΡΠΎΠ±Ρ Π²ΠΎΠΉΡΠΈ Π² AI-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎΠ΄ ΠΏΡΠΈΡΠΌΠΎΡΡΠΎΠΌ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠ². Π£Π·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ Ρ ΠΠ½ΡΠΎΠ½Π°: π ΠΡΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²Π½Π΅Π΄ΡΡΡΡ AI-Π»ΠΎΠ³ΠΈΠΊΡ Π² Π±ΡΠΊΠ΅Π½Π΄ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΈΡΡ Π²Π°Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ? π β ΠΠ°, ΠΆΠ΄Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π»ΠΈΡ π₯ β ΠΠΎΠΉΠ΄Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΡΡ Π½Π° ΠΊΠ°Π½Π°Π»Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΠ½ΡΠΎΠ½Π° πββοΈ Proglib Academy
opcache.enable=1 opcache.preload=/var/www/app/preload.php opcache.preload_user=www-data opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.validate_timestamps=0validate_timestamps=0 β Π½Π° ΠΏΡΠΎΠ΄Π΅ ΡΠ°ΠΉΠ»Ρ Π½Π΅ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π΅ΠΏΠ»ΠΎΡΠΌΠΈ. ΠΠ΅ ΡΡΠ°ΡΠΈΠΌ syscall Π½Π° stat() ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π‘Π±ΡΠΎΡ ΠΊΡΡΠ° ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΠ°ΡΡ FPM (Deployer ΡΠ΄Π΅Π»Π°Π΅Ρ ΡΠ°ΠΌ). 2οΈβ£ ΠΠΈΡΠ΅ΠΌ preload.php ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ
// β ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅Π»ΡΠ·Ρ
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/var/www/app/vendor')
);
foreach ($files as $file) {
if ($file->getExtension() === 'php') {
opcache_compile_file($file->getRealPath());
}
}
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΡΡΠ΅ΠΉΡΡ, Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ β ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²Π°ΠΆΠ΅Π½, ΠΎΠ΄Π½Π° Π±ΠΈΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ = FPM Π½Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ.
// β
ΡΠ΅ΡΠ΅Π· Composer class map + ΠΌΡΠ³ΠΊΠΈΠΉ fallback
// preload.php
require __DIR__ . '/vendor/autoload.php';
$classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php';
$ignore = [
'/Tests/', '/test/', '/fixtures/', '/stub/',
'/migrations/', '/seeders/', '/factories/',
];
foreach ($classMap as $class => $file) {
foreach ($ignore as $pattern) {
if (str_contains($file, $pattern)) continue 2;
}
try {
if (!class_exists($class, false)
&& !interface_exists($class, false)
&& !trait_exists($class, false)
&& !enum_exists($class, false)
) {
require_once $file;
}
} catch (\Throwable) {
// ΠΊΠ»Π°ΡΡ Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΠ»ΡΡ β ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ, Π½Π΅ ΡΠΎΠ½ΡΠ΅ΠΌ FPM
}
}
class_exists($class, false) β false ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π°Π²ΡΠΎΠ»ΠΎΠ°Π΄. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π΅ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π»ΠΈ ΠΊΠ»Π°ΡΡ ΡΠΆΠ΅ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
3οΈβ£ ΠΠ»Ρ Laravel Π±Π΅ΡΡΠΌ Π³ΠΎΡΠΎΠ²ΠΎΠ΅
composer require laragear/preload php artisan preload:generateΠΠ°ΠΊΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ opcache_get_status() Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ preload-ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², Π½Π΅ ΠΈΠ· Π²ΡΠ΅Π³ΠΎ vendor.
// config/preload.php
return [
'condition' => true,
'memory_limit' => 64, // MB ΠΏΠΎΠ΄ ΠΏΡΠ΅Π»ΠΎΠ°Π΄
'include' => [],
'exclude' => [
'Illuminate\Support\Facades\*',
],
'overwrite' => true,
];
Π€Π°ΡΠ°Π΄Ρ ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ, ΠΎΠ½ΠΈ ΡΠ΅Π·ΠΎΠ»Π²ΡΡΡΡ Π»Π΅Π½ΠΈΠ²ΠΎ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΏΡΠ΅Π»ΠΎΠ°Π΄ ΠΈΠΌ ΠΌΠ΅ΡΠ°Π΅Ρ.
4οΈβ£ ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
// Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΈΠ· CLI Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· FPM
// ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠΎΡΡ ΠΈΠ»ΠΈ ΡΠΊΡΠΈΠΏΡ
$status = opcache_get_status();
$preload = $status['preload_statistics'] ?? [];
echo "Preloaded classes: " . count($preload['classes'] ?? []) . PHP_EOL;
echo "Preloaded funcs: " . count($preload['functions'] ?? []) . PHP_EOL;
echo "Memory used: " . round($preload['memory_consumption'] / 1024 / 1024, 2) . " MB" . PHP_EOL;
ΠΠ°ΠΆΠ½ΠΎ: php -r "opcache_get_status();" Π² CLI ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΠΏΡΡΡΠΎΡΡ. ΠΡΠ΅Π»ΠΎΠ°Π΄ ΠΆΠΈΠ²ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ FPM-ΠΌΠ°ΡΡΠ΅ΡΠ°.
5οΈβ£ ΠΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΠΌ Π² Π΄Π΅ΠΏΠ»ΠΎΠΉ
// deploy.php (Deployer)
task('php-fpm:reload', function () {
run('sudo systemctl reload php8.3-fpm');
});
after('deploy:symlink', 'php-fpm:reload');
reload, Π½Π΅ restart. Reload Π΄Π΅Π»Π°Π΅Ρ graceful: ΠΌΠ°ΡΡΠ΅Ρ-ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄, ΡΡΠ°ΡΡΠ΅ Π²ΠΎΡΠΊΠ΅ΡΡ Π΄ΠΎΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΡΠ΅ΠΊΠ²Π΅ΡΡΡ. Zero downtime.
6οΈβ£ ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ
β ΠΠ°ΠΌΡΡΡ: ΠΏΡΠ΅Π»ΠΎΠ°Π΄ ΠΆΡΡΡ shared memory. 2000 ΠΊΠ»Π°ΡΡΠΎΠ² β 30β50 MB. ΠΡΠ»ΠΈ memory_consumption ΠΌΠ°Π», ΡΠ°ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΌΠΎΠ»ΡΠ° Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ
β ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅: Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄ΠΈΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½ ΡΠ°Π½ΡΡΠ΅. Composer classmap ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΎ, ΡΡΡΠ½ΠΎΠΉ glob β Π½Π΅Ρ
β Enum + PHP 8.1+: backed enum'Ρ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠ°Π΄Π°ΡΡ ΠΏΡΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄Π΅. ΠΡΠ»ΠΈ Π»ΠΎΠ²ΠΈΡΠ΅ segfault ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ FPM β ΠΈΡΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ enum'Ρ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ΡΡ
β Xdebug: ΠΏΡΠ΅Π»ΠΎΠ°Π΄ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ xdebug. ΠΠ° dev-ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ opcache.preload
π ΠΡΠΎΠ³
Preloading β Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΉ Π±ΡΡΡ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠ° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°. ΠΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄ΠΈΡΠ΅ ΡΠΎ, ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΡΠ΅ reload FPM ΠΏΡΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅. Π ΡΠ²ΡΠ·ΠΊΠ΅ Ρ Deployer ΡΡΠΎ ΠΎΠ΄Π½Π° ΡΡΡΠΎΠΊΠ° Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ
ΠΏΡΠ½ΠΈΠΊΠ°opcache.enable=1 opcache.preload=/var/www/app/preload.php opcache.preload_user=www-data opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.validate_timestamps=0
validate_timestamps=0 β Π½Π° ΠΏΡΠΎΠ΄Π΅ ΡΠ°ΠΉΠ»Ρ Π½Π΅ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π΅ΠΏΠ»ΠΎΡΠΌΠΈ. ΠΠ΅ ΡΡΠ°ΡΠΈΠΌ syscall Π½Π° stat() ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π‘Π±ΡΠΎΡ ΠΊΡΡΠ° β ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΠ°ΡΡ FPM (Deployer ΡΠ΄Π΅Π»Π°Π΅Ρ ΡΠ°ΠΌ).
2οΈβ£ ΠΠΈΡΠ΅ΠΌ preload.php ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ
ΠΠ°ΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ β Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π²ΡΡ ΠΏΠΎΠ΄ΡΡΠ΄. ΠΠΎΠ»ΡΡΠΈΡΠ΅ fatal ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ FPM.
php
// β ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ Π½Π΅Π»ΡΠ·Ρ
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/var/www/app/vendor')
);
foreach ($files as $file) {
if ($file->getExtension() === 'php') {
opcache_compile_file($file->getRealPath());
}
}
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΡΡΠ΅ΠΉΡΡ, Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ β ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²Π°ΠΆΠ΅Π½. ΠΠ΄Π½Π° Π±ΠΈΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ = FPM Π½Π΅ ΡΡΠ°ΡΡΡΠ΅Ρ.
php
// β
ΡΠ΅ΡΠ΅Π· Composer class map + ΠΌΡΠ³ΠΊΠΈΠΉ fallback
// preload.php
require __DIR__ . '/vendor/autoload.php';
$classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php';
$ignore = [
'/Tests/', '/test/', '/fixtures/', '/stub/',
'/migrations/', '/seeders/', '/factories/',
];
foreach ($classMap as $class => $file) {
foreach ($ignore as $pattern) {
if (str_contains($file, $pattern)) continue 2;
}
try {
if (!class_exists($class, false)
&& !interface_exists($class, false)
&& !trait_exists($class, false)
&& !enum_exists($class, false)
) {
require_once $file;
}
} catch (\Throwable) {
// ΠΊΠ»Π°ΡΡ Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΠ»ΡΡ β ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ, Π½Π΅ ΡΠΎΠ½ΡΠ΅ΠΌ FPM
}
}
class_exists($class, false) β false ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π°Π²ΡΠΎΠ»ΠΎΠ°Π΄. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π΅ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π»ΠΈ ΠΊΠ»Π°ΡΡ ΡΠΆΠ΅ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
3οΈβ£ ΠΠ»Ρ Laravel β Π±Π΅ΡΡΠΌ Π³ΠΎΡΠΎΠ²ΠΎΠ΅
bash
composer require laragear/preload php artisan preload:generateΠΠ°ΠΊΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ opcache_get_status() Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ preload-ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠ΅ ΠΈΠ· Π²ΡΠ΅Π³ΠΎ vendor. php
// config/preload.php
return [
'condition' => true,
'memory_limit' => 64, // MB ΠΏΠΎΠ΄ ΠΏΡΠ΅Π»ΠΎΠ°Π΄
'include' => [],
'exclude' => [
'Illuminate\Support\Facades\*',
],
'overwrite' => true,
];
Π€Π°ΡΠ°Π΄Ρ ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ β ΠΎΠ½ΠΈ ΡΠ΅Π·ΠΎΠ»Π²ΡΡΡΡ Π»Π΅Π½ΠΈΠ²ΠΎ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΏΡΠ΅Π»ΠΎΠ°Π΄ ΠΈΠΌ ΠΌΠ΅ΡΠ°Π΅Ρ.
4οΈβ£ ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ Π²ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
php
// Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° ΠΈΠ· CLI Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· FPM
// ΡΠΎΠ·Π΄Π°ΡΠΌ ΡΠΎΡΡ ΠΈΠ»ΠΈ ΡΠΊΡΠΈΠΏΡ
$status = opcache_get_status();
$preload = $status['preload_statistics'] ?? [];
echo "Preloaded classes: " . count($preload['classes'] ?? []) . PHP_EOL;
echo "Preloaded funcs: " . count($preload['functions'] ?? []) . PHP_EOL;
echo "Memory used: " . round($preload['memory_consumption'] / 1024 / 1024, 2) . " MB" . PHP_EOL;
ΠΠ°ΠΆΠ½ΠΎ: php -r "opcache_get_status();" Π² CLI ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΠΏΡΡΡΠΎΡΡ. ΠΡΠ΅Π»ΠΎΠ°Π΄ ΠΆΠΈΠ²ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ FPM-ΠΌΠ°ΡΡΠ΅ΡΠ°.
5οΈβ£ ΠΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΠΌ Π² Π΄Π΅ΠΏΠ»ΠΎΠΉ
php
// deploy.php (Deployer)
task('php-fpm:reload', function () {
run('sudo systemctl reload php8.3-fpm');
});
after('deploy:symlink', 'php-fpm:reload');
reload, Π½Π΅ restart. Reload Π΄Π΅Π»Π°Π΅Ρ graceful: ΠΌΠ°ΡΡΠ΅Ρ-ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ ΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄, ΡΡΠ°ΡΡΠ΅ Π²ΠΎΡΠΊΠ΅ΡΡ Π΄ΠΎΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΡΠ΅ΠΊΠ²Π΅ΡΡΡ. Zero downtime.
6οΈβ£ ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ
β ΠΠ°ΠΌΡΡΡ: ΠΏΡΠ΅Π»ΠΎΠ°Π΄ ΠΆΡΡΡ shared memory. 2000 ΠΊΠ»Π°ΡΡΠΎΠ² β 30β50 MB. ΠΡΠ»ΠΈ memory_consumption ΠΌΠ°Π» β ΡΠ°ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΌΠΎΠ»ΡΠ° Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ β ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅: Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄ΠΈΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½ ΡΠ°Π½ΡΡΠ΅. Composer classmap ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΎ, ΡΡΡΠ½ΠΎΠΉ glob β Π½Π΅Ρ β Enum + PHP 8.1+: backed enum'Ρ Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠ°Π΄Π°ΡΡ ΠΏΡΠΈ ΠΏΡΠ΅Π»ΠΎΠ°Π΄Π΅. ΠΡΠ»ΠΈ Π»ΠΎΠ²ΠΈΡΠ΅ segfault ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ FPM β ΠΈΡΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ enum'Ρ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ΡΡ β Xdebug: ΠΏΡΠ΅Π»ΠΎΠ°Π΄ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ xdebug. ΠΠ° dev-ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ opcache.preloadenum TaskStatus: string
{
case TODO = 'todo';
case IN_PROGRESS = 'in_progress';
case DONE = 'done';
}
#[ORM\Column(length: 50, enumType: TaskStatus::class)]
private TaskStatus $status = TaskStatus::TODO;
ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ TaskStatus::cases() Π² Twig ΠΈ Π½ΠΎΠ²ΡΠΉ ΡΡΠ°ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π² Enum. ΠΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠ°Π²ΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΡΠΎΠΊ (Doctrine ΡΠ°ΠΌ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² varchar).
ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΡΠΎΡΠΈΠ°Π»Π° Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ HTML5 DnD ΠΈ Turbo Streams ΡΠ΅ΡΠ΅Π· Mercure Π΄Π»Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ.
π ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ
ΠΏΡΠ½ΠΈΠΊΠ°kubectl port-forward pod/my-pod 8080:80
β Π ΡΠ΅ΡΠ²ΠΈΡΡ: kubectl port-forward svc/my-service 5432:5432
β Π Π΄Π΅ΠΏΠ»ΠΎΠΉΠΌΠ΅Π½ΡΡ: kubectl port-forward deploy/my-app 3000:3000
β ΠΡΡΠ³ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΡ: kubectl port-forward svc/postgres 15432:5432 (localhost:15432 β postgres:5432)
β Π‘Π»ΡΡΠ°ΡΡ Π½Π° Π²ΡΠ΅Ρ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Ρ
: kubectl port-forward --address 0.0.0.0 svc/my-service 8080:80DB::listen(function (QueryExecuted $query) {
dump($query->sql); // select * from `users` where `id` = ? limit 1
dump($query->bindings); // [0 => 1]
dump($query->time); // 6.05 (ms)
});
ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎ Π΄Π΅Π±Π°Π³. ΠΠΎΠΆΠ½ΠΎ ΡΠ»Π°ΡΡ Π°Π»Π΅ΡΡ Π² Slack, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ ΡΠΎΡΠΌΠΎΠ·ΠΈΡ Π΄ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡΠΎΠ³Π°. Π Π΄Π»Ρ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π»ΠΎΠ³Π° ΡΠ΅ΡΡΠΈΠΈ Π΅ΡΡΡ ΡΠ²ΡΠ·ΠΊΠ° DB::enableQueryLog() + DB::getRawQueryLog().
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΎ Π² ΠΏΡΠΎΠ΄Π΅ (ΠΈΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ whenQueryingForLongerThan)?
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡ
ΠΏΡΠ½ΠΈΠΊΠ°