PHP swooleでhttp_serverの構成と使用方法のインスタンス分析

5554 ワード

この例では、PHP swooleにおけるhttp_について説明します.serverの構成と使用方法.皆さんの参考にしてください.具体的には以下の通りです.
swooleではswooleを提供していますhttp_serverクラス、httpリクエストを処理するのに便利です.
しかし、httpプロトコルのサポートは不完全であるため、phpファイルの処理はswooleに渡される前にnginxを追加してエージェントを行うことが一般的に推奨されています.
一、簡単なhttpサービスを作成する

set([
  'package_max_length' => 1024 * 1024 * 10,
  //           
  'upload_tmp_dir' => __DIR__ . '/uploads/',
]);
 
//  request    
//       :
//swoole_http_request  ,  http      
//swoole_http_response  ,            
$server->on('request', function (swoole_http_request $request, swoole_http_response $response) {
  //       
  var_dump($request->header);
 
  //          ,   PHP  $_SERVER
  var_dump($request->server);
 
  //   GET  ,   PHP  $_GET
  var_dump($request->get);
 
  //   POST  ,   PHP  $_POST
  var_dump($request->post);
 
  //   COOKIE  
  var_dump($request->cookie);
 
  //      ,       package_max_length  
  var_dump($request->files);
 
  //    POST    ,   fopen('php://input');
  var_dump($request->rawContent());
 
  //    http    
  var_dump($request->getData());
 
  //        
  $response->end('hello');
});
 
//    
$server->start();


二、静的ファイルの処理
swooleには2つの構成パラメータが内蔵されており、簡単な構成で実現できます.
しかし、機能は簡単で、外部ネットワークの使用を提案せず、必要なものは自分で実現することができます.

set([
  //         
  'document_root' => __DIR__ . '/statics/',
  //            ,              ,swoole                 
  'enable_static_handler' => true,
]);
 
$server->on('request', function ($request, $response) {
 
});
 
$server->start();


三、ファイルアップロードの処理

set([
  //           
  'package_max_length' => 1024 * 1024 * 50,
  //           
  'upload_tmp_dir' => __DIR__ . '/tmp/',
  'upload_dir' => __DIR__ . '/uploads/',
  'document_root' => __DIR__ . '/statics/',
  'enable_static_handler' => true,
]);
 
$server->on('request', function ($request, $response) use ($server) {
  if ($request->server['path_info'] == '/upload') {
    $tmp = $request->files['upload']['tmp_name'];
    $upload = $server->setting['upload_dir'] . $request->files['upload']['name'];
    if (file_exists($tmp) &&
      move_uploaded_file($tmp, $upload)) {
      $response->header('Content-Type', 'text/html; charset=UTF-8');
      $response->end('    ');
    } else {
      $response->end('    ');
    }
  }
});
 
//    
$server->start();


staticsディレクトリの下にuploadを作成します.htmlファイル:




  
      


四、処理ルートファイルの自動ロード

set([
  //       
  'project_path' => __DIR__ . '/src/',
]);
 
$server->on('WorkerStart', function ($server, $worker_id) {
  //        
  spl_autoload_register(function ($class) use($server) {
    $class = $server->setting['project_path'] . str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';
 
    if (file_exists($class)) {
      include_once $class;
    }
  });
});
 
$server->on('request', function ($request, $response) use ($server) {
  $pathInfo = explode('/', ltrim($request->server['path_info'], '/'));
 
  //  /   /  
  $module = $pathInfo[0] ?? 'Index';
  $controller = $pathInfo[1] ?? 'Index';
  $method = $pathInfo[2] ?? 'index';
 
  try {
    $class = "\\{$module}\\{$controller}";
    $result = (new $class)->{$method}();
    $response->end($result);
  } catch (\Throwable $e) {
    $response->end($e->getMessage());
  }
});
 
//    
$server->start();


ディレクトリsrcの下でtestディレクトリを作成し、testを作成します.phpファイル

 
 

次に127.0にアクセスする.0.1:8888/test/test/testで戻り結果が表示されます.$request->server['path_info']を通じてモジュール、コントローラ、方法を見つけて、それから私たちの自分のロード関数を登録して、ファイルを導入します.クラスオブジェクトをインスタンス化し、メソッドを呼び出して結果を返します.
spl_をautoload_registerはonStartイベントコールバック関数に格納されます.
onStartコールバックでは、echo、ログの印刷、プロセス名の変更のみが許可されます.他の操作は実行できません.
PHPの関連内容についてもっと興味のある読者は、「PHPネットワークプログラミング技術総括」、「php socket用法総括」、「php対象プログラム設計入門教程」、「PHPデータ構造とアルゴリズム教程」及び「phpプログラム設計アルゴリズム総括」を参照してください.
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.