Где Laravel медленный?
- Инициализация фреймворка требует загрузки более 208 файлов.
- Каждый файл должен быть проанализирован и скомпилирован
- Результат компиляции будет уничтожен после каждого запроса
- По умолчанию
session
Драйверы также файловые - Laravel сам по себе представляет собой полноценный компонентный фреймворк.
Ларадок устанавливает Swoole
Местная средаLaradock
Например, вам нужноlaradock
в каталоге.env
Следующие две строки настроены наtrue
...
WORKSPACE_INSTALL_SWOOLE=true
...
PHP_FPM_INSTALL_SWOOLE=true
...
Затем запустите перестроить контейнер Docker.
$ docker-compose build php-fpm workspace
После завершения сборки перезапустите два контейнера и введитеworkspace
контейнер, работаетphp -m
Проверьте, успешно ли установлен Swoole, если список расширений содержитswoole
Это означает, что установка прошла успешно.
$ php -m | grep swoole
swoole
Советы: дополнительные советы
удалить зеркало
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
удалить все изображения
docker image prune -a -f
Очистить контейнер, изображение
docker system prune
Перекомпилируйте образ
$ cd ~/laradock
$ docker-compose build php-fpm workspace mysql redis
Разница между рабочей областью и php-fpm
Файл конфигурации среды .env содержит две похожие конфигурации: workspace и php-fpm, которые соответствуют двум разным контейнерам, один для FPM и один для CLI. Независимо от того, устанавливаете ли вы плагин или изменяете конфигурацию, вы должны изменять его отдельно.
Скомпилируйте и установите Swoole на CentOS
На сервере клонируйте исходный код
$ git clone https://gitee.com/swoole/swoole
Войтиswoole
каталог, скомпилировать и установить
$ cd swoole
$ phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
$ ./configure
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output fi
...
configure: creating ./config.status
config.status: creating config.h
config.status: executing libtool commands
$ make && make install
...
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/lib64/php/modules/
Installing header files: /usr/include/php/
configure: error: in `/root/swoole': configure: error: C++ preprocessor "/lib/cpp" fails sanity check
столкнулся с вышеуказанными проблемами
$ yum install -y glibc-headers
$ yum install -y gcc-c++
Проверьте, установлен ли онswoole
расширять
$ php -m|grep swoole
Если он не загружается успешно, изменитеphp.ini
и добавить расширения. использоватьphp --ini
Проверитьphp.ini
расположение файла, чтобы узнать, как добавляется расширение, например, в моемCentOS 7
Установите расширение следующим образом:
$ cd /etc/php.d
$ vi swoole.ini
; Enable zip extension module
extension=swoole.so
перезагружатьphp-fpm
$ systemctl restart php-fpm
Проверьте еще раз, если установка успешна
$ php -m | grep swoole
swoole
Сравнительный Larave-S и расширен Laraveltw
- Оба идут ноздря в ноздрю с точки зрения активности/звезды/вилки Github.
- laravel-s: множество функций, быстрая групповая коммуникация QQ, активные обновления
- Swooletw: Тайваньское обслуживание сообщества, поддержка Socket.IO
- laravel-s напрямую возвращает 500 и выдает ошибку при обработке исключений, что не подходит для сценариев возврата JSON
- laravetw различает HTTP и WebSocket через Route, что больше соответствует спецификациям Laravel.
Таким образом, расширение LaravelTW рекомендуется.
Установить LaravelS
composer
Установите последнюю версию
composer require "hhxsv5/laravel-s:~3.5.0" -vvv
опубликовать конфигурацию
php artisan laravels publish
Включить службу HTTP
[root@iz8vbh3xuahhi5gqllg1u1z current]# php bin/laravels start
_ _ _____
| | | |/ ____|
| | __ _ _ __ __ ___ _____| | (___
| | / _` | '__/ _` \ \ / / _ \ |\___ \
| |___| (_| | | | (_| |\ V / __/ |____) |
|______\__,_|_| \__,_| \_/ \___|_|_____/
Speed up your Laravel/Lumen
>>> Components
+-------------------------+--------------+
| Component | Version |
+-------------------------+--------------+
| PHP | 7.2.22 |
| Swoole | 4.4.13-alpha |
| LaravelS | 3.5.14 |
| Laravel Framework [dev] | 6.4.1 |
+-------------------------+--------------+
>>> Protocols
+-----------+--------+-------------------+----------------+
| Protocol | Status | Handler | Listen At |
+-----------+--------+-------------------+----------------+
| Main HTTP | On | Laravel Framework | 127.0.0.1:5200 |
+-----------+--------+-------------------+----------------+
>>> Feedback: https://github.com/hhxsv5/laravel-s
[2019-11-13 09:14:52] [TRACE] Swoole is running, press Ctrl+C to quit.
Используйте Supervisor для управления процессами
[program:develop-laravel-swoole-api]
command=/usr/bin/php /var/www/develop/zqz/api/current/bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/www/develop/zqz/api/current/storage/logs/supervisord-stdout.log
user=apache
Конфигурация Nginx
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream swoole {
# 通过 IP:Port 连接
server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
# 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能
#server unix:/xxxpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
#server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
#server 192.168.1.2:5200 backup;
keepalive 16;
}
server {
listen 80;
server_name api-dev.zqz.com;
root /var/www/develop/zqz/api/current/public;
access_log /var/log/nginx/api-dev.zqz.com.access.log main;
gzip on;
gzip_comp_level 9;
gzip_buffers 4 32k;
gzip_min_length 1k;
gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;
gzip_vary on;
autoindex off;
index index.html index.htm;
# Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。
location / {
try_files $uri @laravels;
}
# Http和WebSocket共存,Nginx通过location区分
# Javascript: var ws = new WebSocket("ws://laravels.com/ws");
location =/ws {
proxy_http_version 1.1;
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout:如果60秒内被代理的服务器没有响应数据给Nginx,那么Nginx会关闭当前连接;同时,Swoole的心跳设置也会影响连接的关闭
# proxy_read_timeout 60s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://swoole;
}
location @laravels {
proxy_http_version 1.1;
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout 120s;
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://swoole;
}
}
Установите laraveltw/laravel-swoole
composer
Установите последнюю версию
composer require swooletw/laravel-swoole -vvv
опубликовать конфигурацию
php artisan vendor:publish --tag=laravel-swoole
запустить HTTP-сервис
[root@iz8vbh3xuahhi5gqllg1u1z current]# php artisan swoole:http infos
+-----------------+---------------------------------------------------------------------------------+
| Name | Value |
+-----------------+---------------------------------------------------------------------------------+
| PHP Version | 7.2.22 |
| Swoole Version | 4.4.13-alpha |
| Laravel Version | 6.4.1 |
| Listen IP | 127.0.0.1 |
| Listen Port | 1215 |
| Server Status | Offline |
| Reactor Num | 8 |
| Worker Num | 8 |
| Task Worker Num | 0 |
| Websocket Mode | Off |
| Master PID | None |
| Manager PID | None |
| Log Path | /var/www/develop/zqz/api/releases/05c0ab09/storage/logs/swoole_http.log |
+-----------------+---------------------------------------------------------------------------------+
Используйте Supervisor для управления процессами
[program:develop-laravel-swoole-api]
command=/usr/bin/php /var/www/develop/zqz/api/current/artisan swoole:http start
numprocs=1
autostart=true
autorestart=true
startretries=3
user=apache
Конфигурация Nginx
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name api-dev.zqz.com;
root /var/www/develop/zqz/api/current/public;
access_log /var/log/nginx/api-dev.zqz.com.access.log main;
gzip on;
gzip_comp_level 9;
gzip_buffers 4 32k;
gzip_min_length 1k;
gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;
gzip_vary on;
autoindex off;
index index.html index.htm;
location = /index.php {
# Ensure that there is no such file named "not_exists"
# in your "public" directory.
try_files /not_exists @swoole;
}
# any php files must not be accessed
#location ~* \.php$ {
# return 404;
#}
location / {
try_files $uri $uri/ @swoole;
}
location @swoole {
set $suffix "";
if ($uri = /index.php) {
set $suffix ?$query_string;
}
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# IF https
# proxy_set_header HTTPS "on";
proxy_pass http://127.0.0.1:1215$suffix;
}
}
Сборник вопросов
$ vi config/swoole_http.php
...
'providers' => [
Illuminate\Pagination\PaginationServiceProvider::class,
//Solve the error:`Auth guard driver [api] is not defined.`
Laravel\Passport\PassportServiceProvider::class,
],
...
тест wrk-HTTP
wrk— это современный инструмент для тестирования HTTP, способный генерировать большие нагрузки при работе на одном многоядерном процессоре. Он сочетает в себе многопоточный дизайн с расширяемой системой уведомлений о событиях, такой как epoll и kqueue.
параметры командной строки
-c, --connections: total number of HTTP connections to keep open with
each thread handling N = connections/threads
-d, --duration: duration of the test, e.g. 2s, 2m, 2h
-t, --threads: total number of threads to use
-s, --script: LuaJIT script, see SCRIPTING
-H, --header: HTTP header to add to request, e.g. "User-Agent: wrk"
--latency: print detailed latency statistics
--timeout: record a timeout if a response is not received within
this amount of time.
wrk
стресс тест
- CentOS 7.X
- 8 CPU 16 G
# 使用10个线程创建100个连接请求
$ wrk -t10 -c100 http://api-dev.zqz.com
использоватьNGINX
+ PHP-FPM
Running 10s test @ http://api-dev.zqz.com
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 364.10ms 347.89ms 2.00s 86.97%
Req/Sec 10.64 8.31 59.00 67.01%
746 requests in 10.10s, 1.30MB read
Socket errors: connect 0, read 0, write 0, timeout 86
Non-2xx or 3xx responses: 746
Requests/sec: 73.86
Transfer/sec: 132.15KB
использоватьNGINX
+ Swoole(laraveltw)
Running 10s test @ http://api-dev.zqz.com
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 234.30ms 275.83ms 1.37s 81.79%
Req/Sec 39.66 29.85 200.00 78.56%
3816 requests in 10.10s, 1.18MB read
Socket errors: connect 0, read 0, write 0, timeout 77
Non-2xx or 3xx responses: 3816
Requests/sec: 377.69
Transfer/sec: 119.50KB
Speed Up Laravel on Top of Swoole
Ускорьте свое приложение laravel с помощью laravel-swoole в среде laradock