Socket.io、redis、およびphpのドッキング

サーバーからphpクライアントにデータを転送するには、次のアルゴリズムを使用できます。







  1. PHPサーバーは、データをredisパイプに公開します。
  2. ノードサーバーは、対応するredisチャネルのイベントにサブスクライブし、いつ

    データ受信のイベントが発生すると、このデータは既に

    socket.io
  3. クライアントはsocket.ioメッセージをサブスクライブし、受信時に処理します


プロジェクトのソースコードはgithubにあります







ここで、非常に小さなステップで移動します。

プロジェクトは、nginxとphp-fpmの束を使用します。セットアップを開始します

nginx







Nginxのセットアップ



プロジェクトのルートフォルダーにdocker-compose.yml



作成を始めましょう。







 # docker-compose.yml version: '3' services: nginx: image: nginx ports: - 4400:80
      
      





ブラウザーで開きます: http://localhost:4400



および標準グリーティングを参照してください

nginx

次に、フォルダの静的コンテンツを返すようにnginxを構成します

./www/public





まず、フォルダーを作成します







 mkdir -pv www/public
      
      





ファイル./www/pulbic/index.html



作成します







 <!-- www/public/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Hello World!</h1> </body> </html>
      
      





nginx構成ファイルnginx/conf/custom.conf



作成します。 始めるには

標準の/etc/nginx/conf.d/default.conf



コピーします。

docker-compose.yml



変更します







  services: nginx: image: nginx + volumes: + - ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf ports: - 4400:80
      
      





nginxコンテナーの再作成







 docker-compose up -d
      
      





また、ブラウザのアドレスhttp://localhost:4400



standardで確認します

nginxグリーティング。

変更を加える

docker-compose.yml









  image: nginx volumes: - ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf + - ./www:/www ports: - 4400:80
      
      





nginx/conf/custom.conf









  #access_log /var/log/nginx/host.access.log main; location / { - root /usr/share/nginx/html; + root /www/public; index index.html index.htm; }
      
      





http://localhost:4400



、「Hello World!」が表示されます ファイルから

www/public/index.html





ブレークスルーを呼ぶのは難しいですが、間違いなく正しい方向に進んでいます。







PHPセットアップ



コンテナー設定ファイルを保存するためのフォルダーを作成することから始めましょう。







 mkdir -pv php/conf
      
      





次に、 php/Dockerfile



作成します







 FROM php:7-fpm RUN apt-get -qq update && apt-get -qq install \ curl \ > /dev/null ENV PHPREDIS_VERSION 3.0.0 RUN mkdir -p /usr/src/php/ext/redis \ && curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \ && echo 'redis' >> /usr/src/php-available-exts \ && docker-php-ext-install redis
      
      





そしてdocker-compose.yml



変更を加えます







  - ./www:/www ports: - 4400:80 + php: + build: ./php + volumes: + - ./www:/www + environment: + - REDIS_PASSWORD=${REDIS_PASSWORD}
      
      





また、nginx設定を変更して、拡張子が

.php



php-fpm



によって処理されました。

nginx/conf/custom.conf



ファイルを次のように変更します







  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # -#location ~ \.php$ { -# root html; -# fastcgi_pass 127.0.0.1:9000; -# fastcgi_index index.php; -# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; -# include fastcgi_params; -#} +location ~ \.php$ { + root /www; + fastcgi_pass php:9000; + fastcgi_index index.php; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param SCRIPT_FILENAME /www/public/$fastcgi_script_name; + include fastcgi_params; +}
      
      





次のコードでファイルwww/public/info.php



を作成します







 <?php phpinfo();
      
      





コンテナを再起動します







 docker-compose restart
      
      





そして今、 http://localhost:4400/info.php



に関する情報

PHP設定。

もう少し実験して、ファイルwww/Test.php



を作成しましょう。







 <?php class Test { public function prn() { echo 'Success'; } }
      
      





そして、 www/public/info.php



ファイルの内容を次のものにwww/public/info.php



ます。







 <?php require_once( implode( DIRECTORY_SEPARATOR, [ dirname(__DIR__), 'Test.php' ] ) ); $test = new Test(); $test->prn();
      
      





これでアドレスhttp://localhost:4400/info.php



に「success」が表示され、これ

は、 php-fpm



スクリプトがwww



フォルダーにあり、

ブラウザでは利用できません。 つまり 私たちは正しい方向に進み続けます。







Redisセットアップ



これはおそらく最も短い部分です。

このプロジェクトのRedisは外部ネットワークからアクセスできませんが、パスワード保護

設定します。

これを行うには、 .env



ファイルを作成します







 REDIS_PASSWORD=eustatos
      
      





docker-compose.yml



変更を加えます







  build: ./php volumes: - ./www:/www + redis: + image: redis + command: ["sh", "-c", "exec redis-server --requirepass \"${REDIS_PASSWORD}\""]
      
      





redisへの接続をテストするには、ファイルwww/public/info.php



変更します







 <?php $redis = new Redis(); //    redis $redis->connect( 'redis', 6379 ); // . 'eustatos' - ,      `.env` $redis->auth($_ENV['REDIS_PASSWORD']); //     'eustatos' $redis->publish( 'eustatos', json_encode([ 'test' => 'success' ]) ); //   $redis->close();
      
      





コンテナを再起動します







 docker-compose restart
      
      





今すぐredisサーバーに接続します







 docker-compose exec redis bash
      
      





コマンドラインに移りましょう。 「eustatos」は、以前に設定したパスワードです

.env



ファイル







 # redis-cli -a eustatos
      
      





チャンネル「eustatos」に登録します(名前は任意であるため、すべてが機能しますが、

ファイルで定義したチャンネルの名前と一致する必要があります

www/public/info.php









 > subscribe eustatos
      
      





これらすべての準備が完了したら、次のブラウザに移動します

http://localhost:4400/info.php



そして、ターミナルのように、

redisに接続すると、次の行が表示されます。







 1) "message" 2) "eustatos" 3) "{\"test\":\"success\"}"
      
      





そのため、目標にさらに近づきました。







socket.ioの構成



socket.ioサーバーファイルが置かれるフォルダーを作成しましょう







 mkdir socket
      
      





docker-compose.yml



変更を加えます







  redis: image: redis command: ["sh", "-c", "exec redis-server --requirepass \"${REDIS_PASSWORD}\""] + socket: + image: node + user: "node" + volumes: + - ./socket:/home/node/app + ports: + - 5000:5000 + working_dir: /home/node/app + command: "npm start"
      
      





socket



フォルダに行きましょう







 cd socket
      
      





必要なパッケージをインストールする







 npm init -y npm i -S socket.io redis express
      
      





その後、行をsocket/package.json



ファイルに追加します







 { "name": "socket-php-example", "version": "1.0.0", "main": "index.js", "author": "eustatos <astashkinav@gmail.com>", "license": "MIT", + "scripts": { + "start": "node index.js" + }, "dependencies": { "express": "^4.16.3", "redis": "^2.8.0", "socket.io": "^2.1.0" } }
      
      





socket/index.js



作成する







 const express = require('express'); const app = express(); const http = require('http').Server(app); const port = process.env.PORT || 5000; app.get( '/', function(req, res, next) { res.send('success'); } ); http.listen( port, function() { console.log('Listen at ' + port); } );
      
      





コンテナを再起動します







 docker-compose restart
      
      





その後、「成功」がブラウザのhttp://localhost:5000



表示されます。

だから私たちは目標に少し近づいています。 残りはほとんどありません。

socket/index.js



変更しsocket/index.js









 const express = require('express'); const app = express(); const http = require('http').Server(app); const io = require('socket.io')(http); //   redis const subscriber = require('redis').createClient({ host: 'redis', port: 6379, password: 'eustatos' }); //      redis subscriber.on('message', function(channel, message) { //     redis   socket.io io.emit('eustatosRoom', message); }); //   socket.io io.on('connection', function(socket){ //    redis 'eustatos'  callback subscriber.subscribe('eustatos'); }); const port = process.env.PORT || 5000; http.listen( port, function() { console.log('Listen at ' + port); } );
      
      





これで、socket.ioコンテナーの構成が完了しました。







クライアントアプリケーションの構成



クライアントアプリケーションは、どのコンテナにもデプロイできますが、

実験の純度を高めるため、別のコンテナに展開します。

クライアントアプリケーションファイルをclient



フォルダーに配置します







 mkdir client
      
      





client/index.html



ファイルを作成します







 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> <script> const socket = io( window.location.protocol + '//' + window.location.hostname + ':5000' ); socket.on( 'eustatosRoom', function(message) { console.log(JSON.parse(message)); } ); </script> </body> </html>
      
      





docker-compose.yml



変更します







  ports: - 5000:5000 command: "npm start" + client: + image: nginx + volumes: + - ./client:/usr/share/nginx/html + ports: + - 8000:80
      
      





コンテナを再起動します







 docker-compose restart
      
      





まず、ブラウザhttp://localhost:8000



で開きます。 結果を実証するには

私たちの作品は、開発者パネルを開く必要があります。

まだ何も表示されていません。

別のタブまたはウィンドウでアドレスhttp://localhost:4400/info.php



、クライアントの開発者パネルのコンソールを見てください。 表示されるはずです:







 {test: "success"}
      
      





これは、サーバーがクライアントアプリケーションにデータを正常に転送したことを意味します。








All Articles