【Swoole】-Centos 7でPeclを使用してPHP 7をインストールするSwoole拡張

8029 ワード

SwooleはPHP用にCとC++で記述され、イベント、高性能、非同期、コモン・パラレル・ネットワーク通信エンジンに基づいている.Swoole拡張はPHP Extension標準拡張に従って構築されており、実装の方式はPHP拡張の実装とほぼ同様である.本節ではPHP公式に提供されているpeclコマンドを使用してインストールします.
  • 公式サイト
  • https://www.swoole.com/

  • ドキュメント
  • https://wiki.swoole.com

  • ソースコード
  • https://github.com/swoole/swoole-src


  • 一、初対面のSwoole
    概要
    以前は多少このSwooleフレームワークを聞いたことがありますが、私が以前知っていたThinkPHP、CI、Laravelというフレームワークとは非常に異なり、イベント処理に基づいて非同期協程を内蔵し、PHPを再定義し、PHPのライフサイクルを拡張しています.もちろん私がここで言っているのは全面的ではありません.ただ、最近見た知識点を少しまとめて、それからだんだん勉強を理解します.
    イベントベース.ネットワークリクエストは、イベントに基づいて最下位層epoll/kqueueを十分に利用して実現される.大きなリクエストをサポートできます.
    非同期コヒーレンス.従来のPHPプログラミングは同期シリアルであり、つまり上から下へ、関数処理時に詰まった状態になる可能性もあり、実行が完了してから下へ進む必要があります.しかし、フロントエンドにAjaxのような要求方式が非同期で処理されていることは知っていますが、イベントが多くなると、非同期間のコールバックネストのプロセスを解決するには、Go言語のようなコラボレーションを使用します.Swoole 4には、完全に同期されたコードで非同期性能を実現する組み込みのコモンシップが提供され、最下位の自動スケジューリングコモンシップは、非同期がブロックされません.ここではプロセス、スレッド、コラボレーションの特徴を簡単に説明します.プロセスはシステムの中で実行しているプログラムで、各プロセスには独立したアドレス空間があり、コンテキストの切り替え、比較的に資源を消費し、すべての内容を交換しなければならない.スレッド、1つのプロセスに複数のスレッドを持つことができます.各スレッドは、その属するプロセスのスタック空間を使用し、同じプロセス内の複数のスレッドが部分的な状態を共有します.もちろん、各スレッドにも独自のスタックとレジスタがあります.メモリ分離がないため、スレッド切り替えは一般的にロックされます.コラボレーションはプログラム内部のスケジューリングメカニズムであり、単一プロセスの単一スレッド処理であり、コラボレーションコンテキストの切り替えコストは非常に少なく、変数の衝突がなく、共有リソースはロックを加える必要がなく、状態を判断するだけである.コラボレーション間はコラボレーション、シリアル、非プリエンプト、ロック不要、コンテキスト切替が速い.また、コンシステントがブロックされると、プロセスがブロックされ、現在の制御権が与えられ、プロセス全体がブロックされません.
    ネットワーク通信Swooleはネットワーク通信の能力を提供し、PHPスクリプトのライフサイクルを大幅に拡張します.以前、PHP開発では、ApacheやNginxなどのWebサーバのサポートが必要でした.これにより、ブラウザを開いてリクエストを開始することができます.従来のこの形式では、ブラウザからサーバ間のネットワーク要求は、サーバがPHPスクリプトに要求内容を与えるのを待ってからデータを処理するだけで、要求が来る前と要求処理後はPHPスクリプトとは関係ありません.Swooleの到来により、PHP-PFMを必要とせず、NginxやApacheを必要とせずにWebサービスを開始することができます.さらにPHPのライフサイクルを拡張し、サービス起動前、起動後、リンク進入、リクエスト到来、リクエスト終了、リンク切断、サービス中止からPHPスクリプトの把握が可能となる.これはSwooleがPHPに提供する強力なネットワーク通信能力でもある.強い!
    シーン
  • 高性能Webサービス
  • 移動通信、IMインスタント通信チャット(カスタマーサービスシステム)
  • ネットゲーム
  • 生放送サイト(高同時、長リンク、大トラフィック)
  • マイクロサービス
  • インターネット、車ネットワーク、モノネットワーク
  • 特長
  • イベント駆動非同期プログラミングモード
  • 非同期TCP/UDP/HTTP/WebSocket/HTTP 2プロトコルのサーバ側/クライアント
  • はIPv 4/IPv 6/UnixSocket/TCP/UDP
  • をサポートする
  • SSL/TLSトンネル暗号化
  • をサポート
  • は同時百万TCP長接続
  • をサポートする
  • ミリ秒タイマ
  • をサポート
  • 非同期/同期/コモンシップ
  • をサポート
  • はCPU親和性設定/デーモンプロセス
  • をサポートする.
    その他の特徴は、しばらくはよくわかりませんが、Swooleを使ってHTTPサービスを起動する方法を切に試してみたいと思っています.Nginxを離れて、スクリプトで直接起動できるかどうかを見てみましょう. 
    二、Swooleを取り付ける
    もちろん、公式サイトのドキュメントにはさまざまなインストール方法が用意されており、異なるシステムについて紹介されています.ここではPecl(The PHP Extension Community Library PHP拡張とアプリケーションウェアハウス)ツールを使用してインストールしています.もちろん、このPeclコマンドにPwooleをインストールする時間はGitHubより遅くなります.初心者は簡単なインストール方法を試してみて、後で自分で手動でコンパイルしてみることができます.
    パーソナル環境
  • サーバCentos 7/Ubuntu 16
  • PHP7.1

  • 環境要件
  • php-7.1以降
  • gcc-4.8以降
  • make
  • autoconf

  • インストールプロセス
    【    】
     //   PHP     php-7.1  
    $ php -v 
     //   Gcc     gcc-4.8  
    $ gcc -v
     //   make   
    $ make -v
     //      autoconf
    $ rpm -qa|grep autoconf
    
    【    】
    //   PHP  pecl    
    $ pecl install swoole
    
    【    】
    //      PHP Sockets   
    //        PHP    Sockets   ,      。
    enable sockets supports? [no] : yes
    //      OpenSSL   
    //      SSL   ,       Swoole       HTTPS   ,       。
    //    Mac       ,     。
    enable openssl support? [no] : no
    //      HTTP2   
    //    HTTP2     https://zh.wikipedia.org/wiki/HTTP/2
    enable http2 support? [no] : yes
    //        Redis   
    // Swoole            Redis      
    // https://wiki.swoole.com/wiki/page/p-redis_server.html
    enable async-redis support? [no] : yes
    //      MySQL     
    enable mysqlnd support? [no] : yes
    
    
    【    】
    //        !
    Build process completed successfully
    Installing '/usr/lib64/php/modules/swoole.so'
    Installing '/usr/include/php/ext/swoole/config.h'
    install ok: channel://pecl.php.net/swoole-4.5.0
    configuration option "php_ini" is not set to php.ini location
    You should add "extension=swoole.so" to php.ini
    
    【    PHP.ini】
     //              swoole 4.5 
    $ pecl search swoole
     //          swoole.so php.ini 
     //      php.ini         ?
     //    linux  PHP       ,        
    $ vim /etc/php.ini 
    [swoole]
    extension=swoole.so
    //     PHP
    $ systemctl restart php-fpm  
    
    【    】
      //      swoole  
    $ php -m | grep swoole

    エラー処理
    php-mを実行して拡張を検索します.エラーが発生しても時間がかかりましたがphp.iniの構成もよくわかりますが、エラーの内容は以下の通りです.
    PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/swoole.so' -/usr/lib64/php/modules/swoole.so: undefined symbol: mysqlnd_cset_escape_slashes in Unknown on line 0
    確認するとmysqlndの関数では認識できません.それは、この拡張子をインストールする必要があります.
    mysqlndを理解してください.mysqlndはZendエンジンとの高度な統合性、より高速な実行速度、より少ないメモリ消費、PHPのStream API、クライアントキャッシュメカニズムを利用しています.mysqlndはZendエンジンを透過するため、より高度な特性を提供し、Zendを有効に利用して加速します.
    拡張Mysqlndのインストール
    //     
    $ yum remove php-mysql
    //     yum    PHP7
    $ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    $ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
    //   mysqlnd  
    $ yum install php71w-mysqlnd
    //   PHP  
    $ php -m | grep mysql

    インストールしてもダメなのかmysqlnd_cset_escape_slashes in Unknown on line 0.いいえ、再起動してphp-mを使用すると、この拡張子が見つかり、phpinfo()関数の実行結果にも見つかります.後で考えてみると、このエラー、つまりSwooleはこのmysqlnd拡張に依存している.それは拡張ロードの前後順位の問題ではないでしょうか.その後、インターネットで関連ブログを検索したところ、確かに見つかりました.
    位置決めの問題
    PHPのデフォルトロードの拡張はすべて/usr/lib 64/php/modules/このディレクトリにあります.soファイルはデフォルトでロードされ、PHPカーネルにカプセル化されています.これらの拡張に関する構成は/etc/phpではない.iniでは、/etc/php.d/このディレクトリの中、このディレクトリの中のすべて.iniファイルは/etc/phpです.Iniのロードが完了してからロードされ、私たちのextension=swoole.soの構成は/etc/phpに書く.iniのファイルの末尾なので、swooleを先にロードしました.soをロードしてmysqlnd.so.
    解決策
    3歩歩く
  • は/etc/php.d/ディレクトリのmysqlnd.iniファイル削除(または名前を変更して.bakを追加);
  • は/etc/phpにある.iniのextension=swoole.so上の行にextension=mysqlndを追加します.so;
  • php-fpm
  • を再起動
    【  bug】
     //   mysqlnd.ini   
    $ cd /ect/php.d/
    $ mv mysqlnd.ini mysqlnd.ini.bak
     //   php.ini  
    $ vim /etc/php.ini   
     //           
    [extension]
    extension=mysqlnd.so
    extension=swoole.so
     //   php-fpm
    $ systemctl restart php-fpm    
    

    php-mを再実行してswooleの有無を確認し、また新しいエラーが報告されたことに気づきました.php_sockets_le_socket in Unknown on line 0.ソケットにも問題がありますが、処理方法は同じです.
    【  bug】
     //   sockets.ini   
    $ cd /ect/php.d/
    $ mv sockets.ini sockets.ini.bak
     //   php.ini  
    $ vim /etc/php.ini   
     //           
    [extension]
    extension=mysqlnd.so
    extension=sockets.so
    extension=swoole.so
     //   php-fpm
    $ systemctl restart php-fpm    

    大功を成し遂げる
    //     
    $ php -m | grep swoole
    swoole

    三、Swooleを利用してHTTPサーバーを起動する
    主に試してみたいと思っています
    コード解釈
    # cat http_test.php 
    on('request', function($request, $response) {
            //           ,         
            var_dump($request->get,$request->post);
            //          
            $response->header("Content-Type","text/html; charset=utf-8");
            $response->end("

    Hello Swoole! Num is #" . rand(1000,9999). "

    "); }); // $http->start();

    サービスの開始
    $ php http_test.php 
    

    リクエストの送信
    起動サービスを実行すると、現在の端末が占有され、端末を再起動し、リクエストを送信します.
    $ curl 127.0.0.1:9501
    

    Hello Swoole! Num is #2506


    応答された内容を発見し、開森!
     
    小結
  • は、Swooleがイベントに基づいて非同期のコヒーレンス処理をサポートするネットワーク通信エンジンであることを理解する.
  • Swooleをインストールして、拡張がmysqlnd、socketsに依存することを知っていて、ここでphp.iniはこれらの拡張の後ろに置く.
  • PHPのデフォルトの拡張は/usr/lib 64/php/modules/に保存されているので、phpにない構成もあります.ini設定も含まれています.
  • PHP表示拡張コマンドphp-m
  • Peclコマンド(The PHP Extension Community Library PHP拡張とアプリケーションウェアハウス)は、PHP拡張をダウンロードしてインストールすることができます.
  • Swooleを使用すると、HTTPサービスをコードで簡単に起動できます.