Pull to refresh
22
0
Борис Тавадов @Borro

PHP developer

Send message

Как я понял, гарантия в 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


Скрин теста

image

Тогда ещё не забыть почистить 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:


$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 не плохой и не хороший, он просто другой с другой парадигмой. А вам желаю не терять огонь, с которым вы берётесь за работу, и больше углубляться в инструменты, которые помогут вам в будущем стать хорошим разработчиком. Читайте больше, ведь написание кода — это меньшая часть времени. Большая часть — это его отладка, изучение новых знаний, освоение новых инструментов и подходов.

Можно и мне elborro гаф yandex.ru

Ограничение доступа к файлам и с помощью этого же модуля подсчет запросов к файлу http://nginx.org/ru/docs/http/ngx_http_auth_request_module.html

Только заметил, что она уже UNMANTAINED

Я для хипчата использовал либу https://github.com/gorkalaucirica/HipchatAPIv2Client. Очень удобная.

Ничего особо не изменилось


php 4140.13 r/sec

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


go 4765.73 r/sec

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


php 4274.27 r/sec 4.5% ошибок

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


go 4850.27 r/sec

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

Самый адекватный без ошибок получилось с конкурентностью 1000:


Go 3786.41 [#/sec]

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)


php 3418.30 [#/sec]

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'ом.

С сокетами получилось больше, но и ошибок больше:


4046.81 #/sec но и ошибок 2797 из 10000

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)


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"


В php-fpm выставил listen.backlog = 10000

Ради интереса сделал тесты:
go 1.8.3 на виртуальном стенде в 4 ядра и 1 ГБ памяти лучший результат:


ab -n 10000 -c 5000 'http://127.0.0.1:4000/test?n=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) лучший результат:


ab -n 10000 -c 5000 'http://127.0.0.1/test.php?n=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 проигрывает, но не так тотально как описывает автор.


Были ошибки запросов:


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 — не помогло

Для PHP это phar для остальных, не знаю, но 100% есть.

Раз вам всё равно, смените на старый пароль

На SphinxMeetup shodan говорил, что в начале осени откроет ветку, даже если там не всё будет готово.

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity