【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-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のインストール
インストールしてもダメなのか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 を再起動
php-mを再実行してswooleの有無を確認し、また新しいエラーが報告されたことに気づきました.php_sockets_le_socket in Unknown on line 0.ソケットにも問題がありますが、処理方法は同じです.
大功を成し遂げる
三、Swooleを利用してHTTPサーバーを起動する
主に試してみたいと思っています
コード解釈
サービスの開始
リクエストの送信
起動サービスを実行すると、現在の端末が占有され、端末を再起動し、リクエストを送信します.
応答された内容を発見し、開森!
小結は、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サービスをコードで簡単に起動できます.
一、初対面の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に提供する強力なネットワーク通信能力でもある.強い!
シーン
その他の特徴は、しばらくはよくわかりませんが、Swooleを使ってHTTPサービスを起動する方法を切に試してみたいと思っています.Nginxを離れて、スクリプトで直接起動できるかどうかを見てみましょう.
二、Swooleを取り付ける
もちろん、公式サイトのドキュメントにはさまざまなインストール方法が用意されており、異なるシステムについて紹介されています.ここではPecl(The PHP Extension Community Library PHP拡張とアプリケーションウェアハウス)ツールを使用してインストールしています.もちろん、このPeclコマンドにPwooleをインストールする時間はGitHubより遅くなります.初心者は簡単なインストール方法を試してみて、後で自分で手動でコンパイルしてみることができます.
パーソナル環境
環境要件
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歩歩く
【 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
応答された内容を発見し、開森!
小結