Геймеровская гарнитура тоже неплохо справляется с задачей передать голос. А вообще важно не только передать голос, но и наушники должны быть такими, чтобы удобно было в них сидеть — через пару часов уши не отваливались и голова не болела.
Скажите, какой движок научился оптимизировать forEach?
Вот тест, который говорит, что forEach в 10 раз медленнее for и в 5 раз медленнее for…of. Выигрывает он только у for…in, и то быстрее всего в 2 раза. https://jsperf.com/for-vs-forin-vs-forof-vs-foreach
NPM много крови может попить, когда будет тянуть бинарные пакеты, а ещё может и начать собирать их у вас на виртуалочке.
LTS
Вы правильно написали, что и то и то поддерживается по 3 года и, если заметите, то LTS релизов ровно столько же, сколько у PHP, не LTS версии не используют в более-менее нормальных продашенах, они лишь для того чтобы посмотреть на функционал, пощупать его перед тем как выпустят нормальную LTS.
"По моим ощущениям" — один из ужасных аргументов на хабре. Далее вы описываете всё время загрузки страницы, вместо сравнения шаблонизаторов.
Вот как выглядит компиляция шаблонов в Twig:
$loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new \Twig\Environment($loader, [
'cache' => '/path/to/compilation_cache',
]);
Не сложнее чем ваше.
Про подключение JS я так и не понял, но это в вашем проекте всё просто и надо всего 2 файла загрузить сначала. Такую же функцию грабера всех JS файлов и функцию сортировки можно на любом ЯП сделать. Но вообще в фреймворках были средства, которые позволяют правильно подключать JS/CSS файлы.
Деплой
Про деплой — вы всё распаковываете в соседнюю директорию с вашим проектом, меняете конфиг в nginx и делаете его reload. Это один из способов, вообще есть и более правильные, но это тема отдельных статей, и вроде бы, когда-то давно на хабре проскакивали такие.
Оперативная память
С PHP-FPM всё так же просто. Вы ведите сколько памяти занимает 1 PHP-FPM (после нескольких заходов на разные страницы сайта), делите память, которую вам не жалко, на то, сколько занимает 1 процесс и получаете max_children, выше которого процессы размножаться не будут. Кстати, memory_limit и max_execution_time в PHP вам помогут не положить сервер, если вы накосячите в коде с временем выполнения и памятью.
Швейцарский нож
Я пишу разные консольные утилиты на PHP, писал грабберы, которые тоже в несколько потоков могут грабить сайты, асинхронно работать. Хотите Headless Chrome, его тоже можно запустить и управлять через PHP, слава богу API едино и слабо меняется от одного ЯП к другому. Вот вам и nesk/puphpeteer
Асинхронность
Тут, действительно, на JS изначально пишут асинхронно, поэтому у него больше пакетов. Но на PHP, так же есть возможность писать асинхронно. Вот хорошая подборка: https://github.com/elazar/asynchronous-php
Пожелания
Хотите что-то сравнить, разберитесь в каждом инструменте, либо найдите хорошего оппонента, который сможет на ваши выпады найти аргументы. Node.JS не плохой и не хороший, он просто другой с другой парадигмой. А вам желаю не терять огонь, с которым вы берётесь за работу, и больше углубляться в инструменты, которые помогут вам в будущем стать хорошим разработчиком. Читайте больше, ведь написание кода — это меньшая часть времени. Большая часть — это его отладка, изучение новых знаний, освоение новых инструментов и подходов.
Concurrency Level: 1000
Time taken for tests: 2.641 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1810000 bytes
HTML transferred: 640000 bytes
Requests per second: 3786.41 [#/sec] (mean)
Time per request: 264.102 [ms] (mean)
Time per request: 0.264 [ms] (mean, across all concurrent requests)
Transfer rate: 669.28 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 5 10.7 1 53
Processing: 1 247 133.2 230 868
Waiting: 1 243 132.0 226 856
Total: 1 252 131.5 233 869
Percentage of the requests served within a certain time (ms)
50% 233
66% 289
75% 328
80% 353
90% 422
95% 504
98% 590
99% 644
100% 869 (longest request)
php 3418.30 [#/sec]
Server Software: nginx/1.13.0
Server Hostname: 127.0.0.1
Server Port: 80
Concurrency Level: 1000
Time taken for tests: 2.925 seconds
Complete requests: 10000
Failed requests: 14
(Connect: 0, Receive: 0, Length: 14, Exceptions: 0)
Write errors: 0
Non-2xx responses: 14
Total transferred: 2261806 bytes
HTML transferred: 641806 bytes
Requests per second: 3418.30 [#/sec] (mean)
Time per request: 292.543 [ms] (mean)
Time per request: 0.293 [ms] (mean, across all concurrent requests)
Transfer rate: 755.03 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 44 35.5 36 147
Processing: 38 238 89.1 236 577
Waiting: 1 210 84.6 207 526
Total: 43 282 84.4 276 583
Percentage of the requests served within a certain time (ms)
50% 276
66% 315
75% 336
80% 347
90% 380
95% 420
98% 456
99% 574
100% 583 (longest request)
Это из-за ошибок. Когда происходит ошибка, то выдаётся всё очень быстро и тоже идёт в зачёт. Вообще ab не самая классная тулза. Вечером попробую siege'ом.
Concurrency Level: 5000
Time taken for tests: 2.471 seconds
Complete requests: 10000
Failed requests: 2797
(Connect: 0, Receive: 0, Length: 2797, Exceptions: 0)
Write errors: 0
Non-2xx responses: 2797
Total transferred: 2620813 bytes
HTML transferred: 1000813 bytes
Requests per second: 4046.81 [#/sec] (mean)
Time per request: 1235.542 [ms] (mean)
Time per request: 0.247 [ms] (mean, across all concurrent requests)
Transfer rate: 1035.73 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 439 445.8 226 1306
Processing: 81 394 212.7 389 990
Waiting: 1 349 202.5 365 969
Total: 110 833 491.5 626 1975
Percentage of the requests served within a certain time (ms)
50% 626
66% 865
75% 1323
80% 1356
90% 1759
95% 1862
98% 1872
99% 1875
100% 1975 (longest request)
nginx/error.log
2017/05/29 08:53:25 [alert] 10283#10283: *107893 socket() failed (24: Too many open files) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /test.php?n=1 HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fcgi.sock:", host: "127.0.0.1"
Concurrency Level: 5000
Time taken for tests: 2.776 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1810000 bytes
HTML transferred: 640000 bytes
Requests per second: 3602.04 [#/sec] (mean)
Time per request: 1388.102 [ms] (mean)
Time per request: 0.278 [ms] (mean, across all concurrent requests)
Transfer rate: 636.69 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 300 390.9 132 1012
Processing: 1 365 352.5 195 1623
Waiting: 1 360 347.8 192 1622
Total: 1 664 436.5 700 1927
Percentage of the requests served within a certain time (ms)
50% 700
66% 1024
75% 1074
80% 1095
90% 1192
95% 1273
98% 1354
99% 1437
100% 1927 (longest request)
Concurrency Level: 5000
Time taken for tests: 4.448 seconds
Complete requests: 10000
Failed requests: 1893
(Connect: 0, Receive: 0, Length: 1893, Exceptions: 0)
Write errors: 0
Non-2xx responses: 1893
Total transferred: 2504197 bytes
HTML transferred: 884197 bytes
Requests per second: 2248.37 [#/sec] (mean)
Time per request: 2223.832 [ms] (mean)
Time per request: 0.445 [ms] (mean, across all concurrent requests)
Transfer rate: 549.84 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 199 309.1 137 1069
Processing: 4 459 667.1 122 3127
Waiting: 1 447 669.9 103 3125
Total: 5 658 767.5 327 4093
Percentage of the requests served within a certain time (ms)
50% 327
66% 1024
75% 1138
80% 1313
90% 1527
95% 2125
98% 3236
99% 3251
100% 4093 (longest request)
Итог 3602.04 #/sec (go) против 2248.37 #/sec (php). Да, php проигрывает, но не так тотально как описывает автор.
Были ошибки запросов:
nginx/error.log
2017/05/28 23:42:10 [alert] 24969#24969: *758703 socket() failed (24: Too many open files) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /test.php?n=1 HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1"
2017/05/28 23:42:10 [crit] 24968#24968: accept4() failed (24: Too many open files)
Ставил ulimt -n 200000, в конфиге php-fpm rlimit_files = 65535, в nginx.conf worker_connections 10000 и worker_rlimit_nofile 200000 — не помогло
Как я понял, гарантия в sms-подтверждении (чтобы получить бюллетень, нужно ввести код из пришедшего sms).
Это на https://observer.mos.ru/all/servers/3/txs?methodId=5 он так назван. Можете проверить.
Геймеровская гарнитура тоже неплохо справляется с задачей передать голос. А вообще важно не только передать голос, но и наушники должны быть такими, чтобы удобно было в них сидеть — через пару часов уши не отваливались и голова не болела.
Скажите, какой движок научился оптимизировать forEach?
Вот тест, который говорит, что forEach в 10 раз медленнее for и в 5 раз медленнее for…of. Выигрывает он только у for…in, и то быстрее всего в 2 раза.
https://jsperf.com/for-vs-forin-vs-forof-vs-foreach
Тогда ещё не забыть почистить opcache. Про него хорошая статья была https://habr.com/ru/company/mailru/blog/310054/
NPM и Composer.
NPM много крови может попить, когда будет тянуть бинарные пакеты, а ещё может и начать собирать их у вас на виртуалочке.
LTS
Вы правильно написали, что и то и то поддерживается по 3 года и, если заметите, то LTS релизов ровно столько же, сколько у PHP, не LTS версии не используют в более-менее нормальных продашенах, они лишь для того чтобы посмотреть на функционал, пощупать его перед тем как выпустят нормальную LTS.
Шаблонизатор
Нравится вам лаконичный стиль, поискали бы на https://packagist.org/ нужный вам шаблонизатор. Вот 2, которые 1 в 1 как ваш Jade:
"По моим ощущениям" — один из ужасных аргументов на хабре. Далее вы описываете всё время загрузки страницы, вместо сравнения шаблонизаторов.
Вот как выглядит компиляция шаблонов в Twig:
Не сложнее чем ваше.
Про подключение JS я так и не понял, но это в вашем проекте всё просто и надо всего 2 файла загрузить сначала. Такую же функцию грабера всех JS файлов и функцию сортировки можно на любом ЯП сделать. Но вообще в фреймворках были средства, которые позволяют правильно подключать JS/CSS файлы.
Деплой
Про деплой — вы всё распаковываете в соседнюю директорию с вашим проектом, меняете конфиг в nginx и делаете его reload. Это один из способов, вообще есть и более правильные, но это тема отдельных статей, и вроде бы, когда-то давно на хабре проскакивали такие.
Оперативная память
С PHP-FPM всё так же просто. Вы ведите сколько памяти занимает 1 PHP-FPM (после нескольких заходов на разные страницы сайта), делите память, которую вам не жалко, на то, сколько занимает 1 процесс и получаете max_children, выше которого процессы размножаться не будут. Кстати, memory_limit и max_execution_time в PHP вам помогут не положить сервер, если вы накосячите в коде с временем выполнения и памятью.
Швейцарский нож
Я пишу разные консольные утилиты на PHP, писал грабберы, которые тоже в несколько потоков могут грабить сайты, асинхронно работать. Хотите Headless Chrome, его тоже можно запустить и управлять через PHP, слава богу API едино и слабо меняется от одного ЯП к другому. Вот вам и nesk/puphpeteer
Асинхронность
Тут, действительно, на JS изначально пишут асинхронно, поэтому у него больше пакетов. Но на PHP, так же есть возможность писать асинхронно. Вот хорошая подборка: https://github.com/elazar/asynchronous-php
Пожелания
Хотите что-то сравнить, разберитесь в каждом инструменте, либо найдите хорошего оппонента, который сможет на ваши выпады найти аргументы. Node.JS не плохой и не хороший, он просто другой с другой парадигмой. А вам желаю не терять огонь, с которым вы берётесь за работу, и больше углубляться в инструменты, которые помогут вам в будущем стать хорошим разработчиком. Читайте больше, ведь написание кода — это меньшая часть времени. Большая часть — это его отладка, изучение новых знаний, освоение новых инструментов и подходов.
Можно и мне elborro гаф yandex.ru
Ограничение доступа к файлам и с помощью этого же модуля подсчет запросов к файлу http://nginx.org/ru/docs/http/ngx_http_auth_request_module.html
Только заметил, что она уже UNMANTAINED
Я для хипчата использовал либу https://github.com/gorkalaucirica/HipchatAPIv2Client. Очень удобная.
https://auto.ru/catalog/cars/404/ По F5 разные ролики
Ничего особо не изменилось
Running 30s test @ http://127.0.0.1/test.php?n=1
12 threads and 400 connections
Thread Stats Avg Stdev Max ± Stdev
Latency 100.20ms 63.06ms 542.07ms 76.27%
Req/Sec 348.20 110.88 0.85k 72.45%
124513 requests in 30.07s, 32.06MB read
Requests/sec: 4140.13
Transfer/sec: 1.07MB
Running 30s test @ http://127.0.0.1:4000/test?n=1
12 threads and 400 connections
Thread Stats Avg Stdev Max ± Stdev
Latency 89.85ms 65.55ms 669.74ms 77.39%
Req/Sec 399.38 81.51 800.00 69.61%
143512 requests in 30.11s, 24.77MB read
Requests/sec: 4765.73
Transfer/sec: 842.38KB
С 4000 коннектов ошибки у php
Running 30s test @ http://127.0.0.1/test.php?n=1
12 threads and 4000 connections
Thread Stats Avg Stdev Max ± Stdev
Latency 489.23ms 137.15ms 2.00s 94.40%
Req/Sec 362.90 249.27 3.52k 69.79%
128605 requests in 30.09s, 33.59MB read
Socket errors: connect 0, read 404, write 0, timeout 4065
Non-2xx or 3xx responses: 5850
Requests/sec: 4274.27
Transfer/sec: 1.12MB
Running 30s test @ http://127.0.0.1:4000/test?n=1
12 threads and 4000 connections
Thread Stats Avg Stdev Max ± Stdev
Latency 677.23ms 567.81ms 2.00s 60.05%
Req/Sec 418.88 183.85 2.30k 75.17%
146148 requests in 30.13s, 25.23MB read
Socket errors: connect 0, read 0, write 0, timeout 11398
Requests/sec: 4850.27
Transfer/sec: 857.32KB
Что такое wrk?
Самый адекватный без ошибок получилось с конкурентностью 1000:
Server Software:
Server Hostname: 127.0.0.1
Server Port: 4000
Document Path: /test?n=1
Document Length: 64 bytes
Concurrency Level: 1000
Time taken for tests: 2.641 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1810000 bytes
HTML transferred: 640000 bytes
Requests per second: 3786.41 [#/sec] (mean)
Time per request: 264.102 [ms] (mean)
Time per request: 0.264 [ms] (mean, across all concurrent requests)
Transfer rate: 669.28 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 5 10.7 1 53
Processing: 1 247 133.2 230 868
Waiting: 1 243 132.0 226 856
Total: 1 252 131.5 233 869
Percentage of the requests served within a certain time (ms)
50% 233
66% 289
75% 328
80% 353
90% 422
95% 504
98% 590
99% 644
100% 869 (longest request)
Server Software: nginx/1.13.0
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test.php?n=1
Document Length: 64 bytes
Concurrency Level: 1000
Time taken for tests: 2.925 seconds
Complete requests: 10000
Failed requests: 14
(Connect: 0, Receive: 0, Length: 14, Exceptions: 0)
Write errors: 0
Non-2xx responses: 14
Total transferred: 2261806 bytes
HTML transferred: 641806 bytes
Requests per second: 3418.30 [#/sec] (mean)
Time per request: 292.543 [ms] (mean)
Time per request: 0.293 [ms] (mean, across all concurrent requests)
Transfer rate: 755.03 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 44 35.5 36 147
Processing: 38 238 89.1 236 577
Waiting: 1 210 84.6 207 526
Total: 43 282 84.4 276 583
Percentage of the requests served within a certain time (ms)
50% 276
66% 315
75% 336
80% 347
90% 380
95% 420
98% 456
99% 574
100% 583 (longest request)
После 1000 у php начинаются проблемы с потерей.
Это из-за ошибок. Когда происходит ошибка, то выдаётся всё очень быстро и тоже идёт в зачёт. Вообще ab не самая классная тулза. Вечером попробую siege'ом.
С сокетами получилось больше, но и ошибок больше:
Server Software: nginx/1.13.0
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test.php?n=1
Document Length: 64 bytes
Concurrency Level: 5000
Time taken for tests: 2.471 seconds
Complete requests: 10000
Failed requests: 2797
(Connect: 0, Receive: 0, Length: 2797, Exceptions: 0)
Write errors: 0
Non-2xx responses: 2797
Total transferred: 2620813 bytes
HTML transferred: 1000813 bytes
Requests per second: 4046.81 [#/sec] (mean)
Time per request: 1235.542 [ms] (mean)
Time per request: 0.247 [ms] (mean, across all concurrent requests)
Transfer rate: 1035.73 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 439 445.8 226 1306
Processing: 81 394 212.7 389 990
Waiting: 1 349 202.5 365 969
Total: 110 833 491.5 626 1975
Percentage of the requests served within a certain time (ms)
50% 626
66% 865
75% 1323
80% 1356
90% 1759
95% 1862
98% 1872
99% 1875
100% 1975 (longest request)
2017/05/29 08:53:25 [alert] 10283#10283: *107893 socket() failed (24: Too many open files) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /test.php?n=1 HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fcgi.sock:", host: "127.0.0.1"
В php-fpm выставил
listen.backlog = 10000
Ради интереса сделал тесты:
go 1.8.3 на виртуальном стенде в 4 ядра и 1 ГБ памяти лучший результат:
Server Software:
Server Hostname: 127.0.0.1
Server Port: 4000
Document Path: /test?n=1
Document Length: 64 bytes
Concurrency Level: 5000
Time taken for tests: 2.776 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1810000 bytes
HTML transferred: 640000 bytes
Requests per second: 3602.04 [#/sec] (mean)
Time per request: 1388.102 [ms] (mean)
Time per request: 0.278 [ms] (mean, across all concurrent requests)
Transfer rate: 636.69 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 300 390.9 132 1012
Processing: 1 365 352.5 195 1623
Waiting: 1 360 347.8 192 1622
Total: 1 664 436.5 700 1927
Percentage of the requests served within a certain time (ms)
50% 700
66% 1024
75% 1074
80% 1095
90% 1192
95% 1273
98% 1354
99% 1437
100% 1927 (longest request)
php 7.1.5 nginx + php-fpm (pm.max_children = 200, opcache.enable=1) лучший результат:
Server Software: nginx/1.13.0
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /test.php?n=1
Document Length: 64 bytes
Concurrency Level: 5000
Time taken for tests: 4.448 seconds
Complete requests: 10000
Failed requests: 1893
(Connect: 0, Receive: 0, Length: 1893, Exceptions: 0)
Write errors: 0
Non-2xx responses: 1893
Total transferred: 2504197 bytes
HTML transferred: 884197 bytes
Requests per second: 2248.37 [#/sec] (mean)
Time per request: 2223.832 [ms] (mean)
Time per request: 0.445 [ms] (mean, across all concurrent requests)
Transfer rate: 549.84 [Kbytes/sec] received
Connection Times (ms)
min mean[±sd] median max
Connect: 0 199 309.1 137 1069
Processing: 4 459 667.1 122 3127
Waiting: 1 447 669.9 103 3125
Total: 5 658 767.5 327 4093
Percentage of the requests served within a certain time (ms)
50% 327
66% 1024
75% 1138
80% 1313
90% 1527
95% 2125
98% 3236
99% 3251
100% 4093 (longest request)
Итог 3602.04 #/sec (go) против 2248.37 #/sec (php). Да, php проигрывает, но не так тотально как описывает автор.
Были ошибки запросов:
2017/05/28 23:42:10 [alert] 24969#24969: *758703 socket() failed (24: Too many open files) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /test.php?n=1 HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1"
2017/05/28 23:42:10 [crit] 24968#24968: accept4() failed (24: Too many open files)
Ставил
ulimt -n 200000
, в конфиге php-fpmrlimit_files = 65535
, в nginx.confworker_connections 10000
иworker_rlimit_nofile 200000
— не помоглоДля PHP это phar для остальных, не знаю, но 100% есть.
Раз вам всё равно, смените на старый пароль
На SphinxMeetup shodan говорил, что в начале осени откроет ветку, даже если там не всё будет готово.