サーバーは、創造的な使用の機会も提供します。 たとえば、ポータブルWebアプリケーションをCDやUSBで配布したり、GTKやその他のグラフィックライブラリを使用せずにPHPで作成したデスクトップアプリケーションとして配布したりできます。
PHPマニュアルでは、組み込みサーバーは開発用に設計されているため、戦闘サーバーでは使用しないことをお勧めします。 サーバーを担当するINIディレクティブはありません(コンソールでの出力の色付けを除く)。ドキュメントの主なアイデアは、「Webサーバーも用意しました。そのままにしておきます」と思われます。
それにもかかわらず、組み込みサーバーは開発とテストのための貴重なツールになる可能性があると思います。 たとえば、自分のマシンでは、自分に適したカスタム構成でプレインストールされたApacheを使用していますが、新しいWebアプリケーションをいくつか試したい場合があります。 ビルトインWebサーバーを使用すると、アプリケーションを「ダウンロード」フォルダーまたは一時フォルダーから直接テストし、必要な場合にのみ通常の環境に移動できます。
しかし、初心者にとっては、多くの記述されたアプリケーションが.htaccessとmod_rewriteを使用するため、それほど単純ではありません。 しかし、私は誰か(おそらくあなたの一人かもしれませんが、どうしてですか?)がこのためのアダプターを作成することを確信しています。
この記事では、組み込みサーバーを使用するいくつかの基本的な例を説明し、それを開発およびテストに役立てる方法を示します。
組み込みサーバーを使用します
したがって、サーバーを使用するには、php 5.4以降が必要です。 PHPのバージョンを確認するには、次を実行します。
php -v
また、以下を実行することで、アセンブリでサーバーが使用可能かどうかを判断できます。
php -h
サーバーでのみ使用される「-S」および「-t」パラメーターの説明があります。
サーバーをチェックするには、現在のディレクトリにindex.phpファイルを作成します。このファイルにはphpinfo()関数の呼び出しが含まれ、サーバーを起動します。
[ec2-user@ip-10-229-67-156 ~]$ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Development Server started at Fri Feb 26 18:49:29 2012 Listening on 127.0.0.1:8080 Document root is /home/ec2-user Press Ctrl-C to quit.
そして今、あなたは組み込みのウェブサーバーによって与えられたコンテンツを見ることができます:

各クライアントリクエストはコンソールに書き込まれます。
[Sun Feb 26 18:55:30 2012] 80.180.55.37:36318 [200]: / [Sun Feb 26 18:56:23 2012] 80.180.55.37:36584 [200]: /
戻って、コマンドラインパラメータ「-S」を分析します。これは、サーバーが利用できるアドレスを示すために使用されます。 可能な値:
localhost-ローカルマシンからのみサーバーにアクセスできます。
0.0.0.0-任意のマシンインターフェイスで、
任意の外部またはグレーIP-指定されたIPのみ
「-t」パラメータは、指定された「ディレクトリルート」ディレクトリを設定します。 例:
[ec2-user@ip-10-229-67-156 ~]$ php -S <localhost or your public IP>:8090 -t /home/ec2-user/public
さらに。 特定のルーターファイルの名前を指定できます。 例:
[ec2-user@ip-10-229-67-156 ~]$ php -S >localhost or your public IP>:8080 -t /home/ec2-user/public public/index.php
このルーターの出力は、サーバーによって解析および実行されます。 簡単な例:
<?php $extensions = array("php", "jpg", "jpeg", "gif", "css"); $path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); $ext = pathinfo($path, PATHINFO_EXTENSION); if (in_array($ext, $extensions)) { // let the server handle the request as-is return false; } echo "<p>Welcome to PHP</p>";
スクリプトがFALSEを返す場合、リクエストされたURIは、リクエストされたリソースを発行するサーバーによって処理されるか、404エラーを返します。 スクリプトが他の何かを返す場合、スクリプト出力はクライアントに送信されます。
このアプローチにより制御が強化されますが、知っておくべきことがいくつかあります。 まず、PHPサーバーは最小限のHTTPヘッダーセットのみを提供します。
DConnection: closed Content-Type: text/html Host: aws-dev-01.vtardia.com X-Powered-By: PHP/5.4.0RC7
これをApacheサーバーから返されたヘッダーと比較します。
Accept-Ranges: bytes Connection: Keep-Alive Content-Length: 631 Content-Type: text/html Date: Sat, 04 Feb 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout=15, max=100 Last-Modified: Wed, 14 Sep 2011 15:54:09 GMT Server: Apache/2.2.21 (Unix) DAV/2
アプリケーションでヘッダーを使用する場合、開発環境と本番環境の違いを考慮する必要があります。
次に、組み込みサーバーには異なるSAPI(サーバーAPI)があります。 したがって、インデックスphpでルーティングを実行することにより、テストサーバーまたはバトルサーバーでスクリプトにアクセスしているかどうかを判断できます。 php_sapi_name()は、組み込みサーバーで「cli-server」を返します。
<?php if (php_sapi_name() == "cli-server") { // running under built-in server so // route static assets and return false $extensions = array("php", "jpg", "jpeg", "gif", "css"); $path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); $ext = pathinfo($path, PATHINFO_EXTENSION); if (in_array($ext, $extensions)) { return false; } }
特別なINIディレクティブが1つあります-「cli_server.color」。 このディレクティブは、コンソールに色付きの出力を返します。 cli-server.iniという空のファイルを作成し、次の行を貼り付けます。
cli_server.color = on
INIファイルに必要なディレクティブを指定することにより、サーバーに固有の環境設定を作成できます。 宣言されていないディレクティブがデフォルトになります。 これで、 cli_server.colorというディレクティブを1つだけ宣言しました 。
INIファイルで「-c」パラメーターを指定してサーバーを起動します。
[ec2-user@ip-10-229-67-156 ~]$ php -S localhost -c cli-server.ini
端末が色をサポートしている場合、コンソールで「色」の出力を確認できます。 200ステータスは緑、404-オレンジで強調表示され、スクリプトエラーは赤で強調表示されます。
パーソナルサーバーを作成する
組み込みサーバーについて知っておく必要があることはすべてわかったので、クールなことをしましょう。 独自のポータブルサーバーを作成しましょう!
アプリケーションの次の構造から始めます。

「library」フォルダにはアプリケーションコードが含まれ、「public」にはルートディレクトリが含まれ、index.phpおよびいくつかの静的ファイルが含まれます。 このガイドでは特に「サーバー」フォルダーに注意が払われるため、アプリケーションは単純な「Hello Word!」といくつかの写真とcssで構成されます。
私たちの目標は、1つのコマンドでアプリケーションディレクトリからサーバーを起動できるようにすることであり、サーバーはルーティング、HTTPヘッダー、およびエラーを処理します。
[ec2-user@ip-10-229-67-156 myapp]$ ./start.sh
スタートアップスクリプトを見てみましょう。
#! /bin/bash INIFILE="$(pwd)/server/server.ini" DOCROOT="$(pwd)/public" ROUTER="$(pwd)/server/router.php" HOST=0.0.0.0 PORT=8080 PHP=$(which php) if [ $? != 0 ] ; then echo "Unable to find PHP" exit 1 fi $PHP -S $HOST:$PORT -c $INIFILE -t $DOCROOT $ROUTER
スクリプトはアプリケーションディレクトリから実行されるため、INIFILE、DOCROOT、ROUTERはpwdを使用して定義されます。 phpへのパスはwhichコマンドを使用して決定されます。 ユーザー$ PATHでphpが見つからなかった場合、スクリプトはエラーで終了します。
この方法は非常に効果的ですが、ユーザーにコマンドラインから指定されたパラメーターを変更する機会を与えましょう。
if [ ! -z $INIFILE ]; then INIFILE="$(pwd)/server/server.ini" fi
続けて、「errors」フォルダにはHTTPエラーメッセージのファイルが含まれています。 403エラーの例を次に示します。HTMLのみを使用しましたが、スクリプトは接続されますが、 includeを使用するため、任意のphpコードを使用できます。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>403</title> </head> <body> <h1>403: Forbidden</h1> <p>Sorry, the requested resource is not accessible.</p> </body> </html>
さて、router.phpを見てみましょう。 このファイルのタスクは、すべての要求を受信および管理し、指定されたファイルが存在する場合にのみそれらをサーバーに転送することです。 テンプレートを接続すると、すべてのエラーページが表示されます。
<?php // Set timezone date_default_timezone_set("UTC"); // Directory that contains error pages define("ERRORS", dirname(__FILE__) . "/errors"); // Default index file define("DIRECTORY_INDEX", "index.php"); // Optional array of authorized client IPs for a bit of security $config["hostsAllowed"] = array(); function logAccess($status = 200) { file_put_contents("php://stdout", sprintf("[%s] %s:%s [%s]: %s\n", date("DM j H:i:s Y"), $_SERVER["REMOTE_ADDR"], $_SERVER["REMOTE_PORT"], $status, $_SERVER["REQUEST_URI"])); } // Parse allowed host list if (!empty($config['hostsAllowed'])) { if (!in_array($_SERVER['REMOTE_ADDR'], $config['hostsAllowed'])) { logAccess(403); http_response_code(403); include ERRORS . '/403.php'; exit; } } // if requesting a directory then serve the default index $path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); $ext = pathinfo($path, PATHINFO_EXTENSION); if (empty($ext)) { $path = rtrim($path, "/") . "/" . DIRECTORY_INDEX; } // If the file exists then return false and let the server handle it if (file_exists($_SERVER["DOCUMENT_ROOT"] . $path)) { return false; } // default behavior logAccess(404); http_response_code(404); include ERRORS . "/404.php";
最初の行では、エラーパターンを含むディレクトリであるDIRECTORY_INDEXなど、いくつかのグローバルパラメータを定義します。 date_default_timezone_set()パラメーターはOS設定と一致する必要があります。一致しない場合、ログのエントリとサーバーのエントリに矛盾が生じます。 セキュリティを強化するために、許可されたIPアドレスのリストも追加しました。
ルーティングスクリプトが要求を受信すると、ログサーバーはデフォルトで無視されるため、logAccess()関数が必要です。 この関数はステータスコードのみを受け入れ、出力形式はサーバー形式と完全に一致しています。
最初のタスクはセキュリティチェックです。 クライアントIPが許可されたIPの配列にない場合、エラーメッセージを表示してスクリプトを終了します。 200以外のステータスコードを指定する必要があり、header()関数はここでは機能しないため、新しい関数http_response_codeを使用します。
クライアントIPが許可されたIPの配列にある場合、次のステップは要求されたパスとファイル拡張子を取得することです。 拡張子が空の場合、ユーザーがフォルダーを要求し、最初に定義されたDIRECTORY_INDEXを使用してパスを構築することを考慮します。
最後に、要求されたファイルが存在する場合、FALSEを返し、サーバーがファイルにアクセスできるようにします。 そうでない場合は、404エラーメッセージが表示されます。
まとめ
以上です。 ご覧のとおり、phpサーバーは使いやすいです。 私たちの個人サーバーは非常にシンプルです。 コードを最適化して、より複雑で機能的なクラスに含めることができます。 ハッピーコーディング!
追伸:私はPMへの移籍に関する批判とコメントを喜んで受け入れます。