>백엔드 개발 >PHP 튜토리얼 >Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개

Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개

不言
不言앞으로
2018-12-29 09:52:253844검색

이 글은 라라벨 애플리케이션을 가속화하기 위한 스울 실행 모드에 대한 자세한 소개를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. Swoole

Swoole은 PHP를 재정의했다고 주장합니다. 이는 노드와 마찬가지로 PHP를 비동기 방식으로 실행할 수 있는 PHP 확장이며 소켓을 사용할 수도 있어 일련의 비동기 메서드를 제공합니다. PHP용 IO, 이벤트 기반 병렬 데이터 구조 함수.
Swoole4는 완전한 코루틴 프로그래밍 모델을 지원하며 완전 동기 코드를 사용하여 비동기 프로그램을 구현할 수 있습니다. PHP 코드에 추가 키워드를 추가할 필요가 없습니다. 하단 레이어는 비동기 IO를 구현하기 위해 자동으로 코루틴 스케줄링을 수행합니다.
nodejs가 구현할 수 있는 거의 모든 스울이 구현 가능하며 성능도 nodejs보다 높습니다. 결국 nodejs는 싱글 쓰레드로 CPU 성능을 충분히 활용하지 못하는 반면, 스울은 멀티 쓰레드로 CPU를 충분히 활용할 수 있습니다. 성능.
Swoole의 효율성과 기존 웹 개발의 차이점은 무엇인가요? 기존 LAMP/LNMP 동기식 개발 모델 외에 Swoole의 비동기식 개발 모델은 무엇이고 효율성을 유지하는 방법은 무엇인가요?

2. 전통적인 웹 개발 모델
PHP 웹 개발은 LAMP/LNMP 아키텍처, 즉 Linux, Nginx, Mysql 및 PHP를 채택합니다. 여기서는 nginx를 예로 들어보겠습니다.

Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개

요청이 들어오면 웹 서버는 해당 요청을 PHP-FPM으로 전송합니다. PHP-FPM은 프로세스 풀 아키텍처를 갖춘 FastCGI 서비스입니다. 내장된 PHP 인터프리터. FPM은 PHP 파일을 해석하고 실행하여 응답을 생성하는 역할을 담당하며, 응답은 궁극적으로 웹 서버에 반환되어 프런트 엔드에 표시됩니다. Mysql 및 Nosql 액세스, 타사 애플리케이션 호출 등을 포함한 많은 비즈니스 로직이 PHP 파일로 구현됩니다.
이러한 구조에서는 php-fpm과 nginx 간의 협력이 충분히 잘 실행되어 왔지만 php-fpm 자체는 동기식 차단 프로세스 모델이기 때문에 모든 리소스(프레임워크 초기화에 의해 생성된 일련의 객체 포함)는 종료 후에 해제됩니다. 요청이 완료되어 PHP 프로세스 "유휴"(create destroy create)가 발생하여 많은 양의 CPU 리소스를 소비하므로 단일 시스템의 처리 용량이 제한됩니다.

각 요청 처리 프로세스는 PHP 파일 구문 분석, 환경 설정 등 불필요하게 시간이 많이 소요되는 작업을 의미합니다. PHP 프로세스는 처리 후 파괴됩니다. PHP 프로그램에서는 성능 최적화를 위해 연결 풀링 및 기타 기술을 사용할 수 없습니다.

3. Swoole 운영 모드
Swoole은 기존 아키텍처의 문제를 고려하여 PHP 확장을 기반으로 위의 문제를 해결합니다. 우리는 이미 Swoole의 프로세스 모델을 이해했습니다.

기존 아키텍처와 비교했을 때 Swoole 프로세스 모델의 가장 큰 특징은 네트워크 요청을 처리하는 멀티 스레드 Reactor 모드로, 많은 수의 연결을 쉽게 처리할 수 있다는 것입니다.

또한 다음과 같은 장점이 있습니다.

완전한 비동기식 및 비차단, 낮은 리소스 소비 및 높은 프로그램 실행 효율성

프로그램은 각 요청에 대해 반복적인 로드를 방지하면서 PHP 파일을 한 번만 구문 분석하고 로드합니다. 프로세스가 상주하므로 요청 간 연결 풀링 및 정보 전송이 가능합니다

4.

Swoole에서 Laravel을 실행해야 하는 이유는 무엇입니까?

Laravel 프레임워크는 시작 시 많은 파일을 로드해야 하며, 유명한 생태학적 특성도 결합되어 있습니다. 환경 좋습니다. 개발 과정에서 우리는 휠이 많이 만들어져 Laravel 스타트업의 디스크 IO가 매우 높다는 것을 알게 될 것입니다(즉, 많은 파일을 로드해야 합니다) The laravel life 주기는 매번 시작되어야 합니다. 요청할 때마다 실행하세요. 단일 요청으로 생성된 환경은 요청 실행이 완료되는 즉시 폐기되기 때문입니다.
즉, 기존 PHP 수명주기에서는 스크립트 실행을 위한 리소스를 생성하고 파괴하는 데 많은 시간이 낭비됩니다. Laravel과 같은 프레임워크를 상상해 보십시오. 각 요청에 얼마나 많은 파일을 로드해야 합니까? 이는 또한 많은 I/O 작업을 낭비합니다.

그렇다면 Swoole을 사용하여 애플리케이션 수준의 서버를 구축하고 모든 스크립트 파일을 한 번 로드한 후 메모리에 저장할 수 있다면 어떨까요? 이것이 바로 우리가 Swoole에서 Laravel을 실행해 보아야 하는 이유입니다. Swoole은 강력한 성능을 제공하는 반면 Laravel은 우아한 코드 구조 사용을 제공할 수 있습니다. 이 둘은 정말 완벽한 조합입니다!

5.

Swoole을 사용하여 Laravel의 성능을 향상시키세요

기존 휠 중에서는 다음 두 휠이 여전히 좋다고 생각합니다. 직접 선택하셔도 됩니다

    swooletw/ laravel-swoole
  • garveen/laravoole
  • 테스트할 첫 번째 것을 선택했습니다
작곡기를 사용하여 설치하세요.

composer require swooletw/laravel-swoole

laravel을 사용하는 경우 config/app의 공급자 배열에
SwooleTW\Http\LaravelServiceProvider::class,

if를 추가하세요. .php lumen을 사용하는 경우 bootstrap/app.php에 다음 코드를 추가하세요

$app->register(SwooleTW\Http\LumenServiceProvider::class);

구성 파일을 config 디렉터리로 내보냅니다

php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"

그런 다음 config/swoole_http.php로 이동하여 정보를 구성할 수 있습니다

'server' => [
        'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),//监听任意ip
        'port' => env('SWOOLE_HTTP_PORT', '1215'),
        'options' => [
            'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
            'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),//1-程序将转入后台作为守护进程运行
        ],
],

swoole_http.php 구성 공급자 배열 제공,

'providers' => [
    // App\Providers\AuthServiceProvider::class,
]

swoole을 http로 사용한 후 이러한 공급자는 메모리에 저장되므로 여기서 구성되는 것은 각 요청에 대해 다시 등록하고 다시 시작하려는 공급자입니다.

이제 다음 명령을 실행하여 Swoole HTTP 서비스를 시작할 수 있습니다.

$ php artisan swoole:http start

然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started: <http:></http:>

现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。
注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart

六、性能测试
使用Apache的ab测试工具

ab -n 1000 -c 10 http://127.0.0.1:1215/

参数说明:-n 1000个请求 -c 10个并发数

Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개

Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개

图一是使用swoole作为应用服务器,图二是apache服务器
测试环境在虚拟机中,电脑配置也较差,性能没有完全发挥出来,可以看到apache只完成197次请求就扛不住压力了,swoole HTTP服务 完成了压测,性功完全碾压apache服务器。

七、使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。
那么,我们就增加需要配置nginx.conf里的server:

server {
    listen 80;
    server_name your.domain.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header Host $host;
        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;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

配置可参考swoole方文档官 Nginx/Apache配置
至此,大功告成,你可以像平常一样访问你的网站了。

八、使用swoole和传统php开发的缺点
本文主要介绍了使用swoole作为laravel的应服务器,最后说下使用swoole和传统php开发的缺点。
1、更难上手。这要求开发人员对于多进程的运行模式有更清晰的认识
2、更容易内存泄露。在处理全局变量,静态变量的时候一定要小心,这种不会被GC清理的变量会存在整个生命周期中,如果没有正确的处理,很容易消耗完所有的内存。在php-fpm下,php代码执行完内存就会被完全释放。


위 내용은 Laravel 애플리케이션을 가속화하기 위한 Swoole 실행 모드의 세부 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:줄리아는 뭐야?다음 기사:줄리아는 뭐야?