(57)【特許請求の範囲】
【請求項１】
ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成するサーバにおいて、
前記ＨＴＴＰリクエストに基づいて前記ＨＴＭＬファイルを生成するアプリケーション実行部と、
前記ＨＴＴＰリクエストを受信し、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルを含む、当該ＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとを備え、
前記アプリケーション実行部は、前記ＨＴＭＬファイルを生成する際にスクリプトを実行し、当該スクリプトの命令コードが所定のファイルに対するものであって、かつ当該ファイルの内容を変更しない場合には当該ファイルのデータを読み込まずに処理を実行して当該ＨＴＭＬファイルを構成するオブジェクトを生成し、
前記ＨＴＴＰサーバは、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルに前記ファイルのデータを読み込まずに処理を実行して生成された前記オブジェクトがあり、かつ、当該オブジェクトの元の命令コードが当該ファイルの送信を要求するものである場合に、当該ファイルを当該ＨＴＭＬファイルと共に送信する、サーバ。
【請求項２】
前記ＨＴＴＰサーバは、前記ファイルをメモリのカーネル空間に設けられた送信用のソケット・バッファに直接読み込み、送信する、請求項１に記載のサーバ。
【請求項３】
ファイルの送信を要求する前記命令コードは、記憶装置に保持されている所定のファイルの内容を表示させる命令コードであり、
前記ＨＴＴＰサーバは、ファイルの内容を表示させる前記命令コードを処理することで前記アプリケーション実行部により生成された前記オブジェクトにより指定され、前記記憶装置に保持されている前記ファイルを取得し、送信する、請求項１に記載のサーバ。
【請求項４】
前記アプリケーション実行部は、記憶装置に保持されている所定のファイルの内容を表示させる前記命令コードに関して、前記ＨＴＴＰサーバによる送信前に当該ファイルへの書き込みが行われる場合は、書き込み前の当該ファイルの複製を作成して保存し、
前記ＨＴＴＰサーバは、前記書き込みが行われる前の前記ファイルを送信する、請求項３に記載のサーバ。
【請求項５】
ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成するサーバにおいて、
前記ＨＴＴＰリクエストに基づいて前記ＨＴＭＬファイルを生成するアプリケーション実行部と、
前記ＨＴＴＰリクエストを受信し、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルを含む、当該ＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとを備え、
前記アプリケーション実行部は、前記ＨＴＭＬファイルを生成する際にスクリプトを実行し、当該スクリプトの命令コードが記憶装置に保持されている所定のファイルの内容を表示させるものである場合に、当該ファイルのデータを読み込まずに当該ファイルを特定する情報をオブジェクトに記述し、
前記ＨＴＴＰサーバは、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルに前記ファイルを特定する情報が記述された前記オブジェクトがある場合は、当該情報に基づいて前記記憶装置に保持されている当該ファイルを特定し、当該ファイルを当該ＨＴＭＬファイルと共に送信する、サーバ。
【請求項６】
前記アプリケーション実行部は、記憶装置に保持されている所定のファイルの内容を表示させる前記命令コードに関して、前記ＨＴＴＰサーバによる送信前に当該ファイルへの書き込みが行われる場合は、書き込み前の当該ファイルの複製を作成して保存し、
前記ＨＴＴＰサーバは、前記書き込みが行われる前の前記ファイルを送信する、請求項５に記載のサーバ。
【請求項７】
前記アプリケーション実行部は、ＯＳ（Operating System）に実装されたコピー・オン・ライト機能を持つハードリンクを用いて、前記ファイルへの書き込みが行われる場合の複製を作成する、請求項６に記載のサーバ。
【請求項８】
前記アプリケーション実行部は、
前記ファイルをロックし、
前記ファイルの複製へのハードリンクを作成し、
前記ファイルへの書き込みを監視し、書き込みが行われる際に、前記複製を実際に作成し、
前記複製を前記ＨＴＴＰサーバへ送った後に前記ファイルのロックを解除する、請求項６に記載のサーバ。
【請求項９】
前記アプリケーション実行部は、前記スクリプトの命令コードがファイルの内容を表示させる前記命令コード以外のファイルに対する命令コードであって、かつ当該ファイルの内容を変更する場合に、当該ファイルを読み込んで処理を実行し、オブジェクトを生成する、請求項５に記載のサーバ。
【請求項１０】
ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成するサーバにおいて、
前記ＨＴＴＰリクエストに基づいて前記ＨＴＭＬファイルを生成するアプリケーション実行部と、
前記ＨＴＴＰリクエストを受信し、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルを含む、当該ＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとを備え、
前記アプリケーション実行部は、
前記ＨＴＭＬファイルを生成する際にスクリプトを実行し、当該スクリプトの命令コードが記憶装置に保持されている所定のファイルの内容を表示させるものである場合に、当該ファイルのデータを読み込まずに当該ファイルを特定する情報をオブジェクトに記述し、
記憶装置に保持されている所定のファイルの内容を表示させる前記命令コードに関して、前記ＨＴＴＰサーバによる送信前に当該ファイルへの書き込みが行われる場合は、書き込み前の当該ファイルの複製を作成して保存し、
前記ＨＴＴＰサーバは、前記アプリケーション実行部により生成された前記ＨＴＭＬファイルに前記ファイルを特定する情報が記述された前記オブジェクトがある場合は、当該情報に基づいて前記記憶装置に保持されている当該ファイルを特定し、前記書き込みが行われる前の当該ファイルを当該アプリケーション実行部により生成された当該ＨＴＭＬファイルと共に送信する、サーバ。
【請求項１１】
ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成する方法において、
ＨＴＴＰリクエストに基づき、前記ＨＴＭＬファイルを生成するためのスクリプトを実行し、当該スクリプトの命令コードが所定のファイルに対するものであって、かつ当該ファイルの内容を変更しない場合には当該ファイルのデータを読み込まずに処理を実行してオブジェクトを生成するステップと、
前記ファイルのデータを読み込まずに処理を実行して生成された前記オブジェクトに関して、元の前記命令コードが当該ファイルの送信を要求するものである場合に、当該ファイルをメモリのカーネル空間に設けられた送信用のソケット・バッファに直接読み込むステップと、
生成された前記ＨＴＭＬファイルを、前記ソケット・バッファに読み込まれた前記ファイルと共にＨＴＴＰレスポンスとして送信するステップと、を含む、方法。
【請求項１２】
コンピュータを、
ＨＴＴＰリクエストに基づいてＨＴＭＬファイルを生成するアプリケーション実行手段と、
前記ＨＴＴＰリクエストを受信し、前記アプリケーション実行手段により生成された前記ＨＴＭＬファイルを含む、当該ＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとして機能させ、
前記アプリケーション実行手段は、前記ＨＴＭＬファイルを生成する際にスクリプトを実行し、当該スクリプトの命令コードが所定のファイルに対するものであって、かつ当該ファイルの内容を変更しない場合には当該ファイルのデータを読み込まずに処理を実行してオブジェクトを生成し、
前記ＨＴＴＰサーバは、前記アプリケーション実行手段により前記ファイルのデータを読み込まずに処理を実行して生成された前記オブジェクトに関して、元の前記命令コードが当該ファイルの送信を要求するものである場合に、当該ファイルを当該アプリケーション実行手段により生成された前記ＨＴＭＬファイルと共に送信する、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワーク上でウェブ・コンテンツを提供するサーバに関し、特に、動的にウェブ・コンテンツを生成し提供するサーバに関する。
【背景技術】
【０００２】
動的にウェブ・コンテンツを生成するウェブ・アプリケーション・サーバは、フロントエンドにＨＴＴＰ（HyperTextTransfer Protocol）サーバを備え、バックエンドにプログラミング言語処理系（以下、アプリケーション実行部と記す）を備えて構成される。この２つのコンポーネントをつなぐ手法（ＳＡＰＩ：Server Application Programming Interface）として、ＦａｓｔＣＧＩやｍｏｄ＿ｐｈｐなどの手法がある。
【０００３】
ＳＡＰＩとしてＦａｓｔＣＧＩを用いる場合の実装として、例えば、Ｆａｓｔｅｒ  ＦａｓｔＣＧＩと呼ばれる手法がある（例えば、非特許文献１参照）。この手法は、ＨＴＴＰサーバのｌｉｇｈｔｔｐｄ  １．５  ｂｅｔａで実装されている。この手法では、ＰＨＰ言語処理系が共有メモリ（／ｄｅｖ／ｓｈｍ）に割り当てたファイルに対して実行結果を書き出し、ＦａｓｔＣＧＩのプロトコル上にはそのファイル名をＨＴＴＰのヘッダ（Ｘ−ＬＩＧＨＴＴＴＰＤ−ｔｅｍｐｆｉｌｅ）として流すことにより、ＨＴＴＰサーバのＦａｓｔＣＧＩモジュール（ｍｏｄ＿ｐｈｐ）が、ＯＳ（Operating System）のｓｅｎｄｆｉｌｅシステムコールを用いてメッセージを送る。
【０００４】
【非特許文献１】"lighty's life  Faster FastCGI"、[online]、2006年11月29日、lighty's life、[2008年2月29日検索]、インターネット＜URL : http://blog.lighttpd.net/articles/2006/11/29/faster-fastcgi＞
【発明の開示】
【発明が解決しようとする課題】
【０００５】
上記のようなウェブ・アプリケーション・サーバでは、一般に、クライアント（ＨＴＴＰクライアント）からのリクエストを受け付け、このリクエストに応じてＨＴＭＬ（HyperText Markup Language）ファイルが生成され、生成されたＨＴＭＬファイルがクライアントへ返送されるといった一連の動作が行われる。この場合、ＨＴＴＰサーバによる処理とアプリケーション実行部による処理とが移行しながら実行されるのに伴い、メモリのユーザ空間（ユーザ・メモリ）とカーネル空間（カーネル・メモリ）との間で、度々メモリコピーが行われる。アプリケーション実行部の動作によっては、記憶装置から必要なデータが読み出され、この読み出されたデータも一緒にコピーされる。
【０００６】
このメモリコピーには一定の処理コストを要す。そのため、冗長なメモリコピーが繰り返されると、ウェブ・アプリケーション・サーバ全体のパフォーマンスの低下を招くこととなる。
【０００７】
本発明は、上記の課題を解決し、メモリコピーによる処理コストを軽減し、ウェブ・アプリケーション・サーバの動作のパフォーマンスを向上させることを目的とする。
【課題を解決するための手段】
【０００８】
上記の目的を達成するため、本発明は、次のようなサーバとして実現される。このサーバは、ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成するサーバにおいて、ＨＴＴＰリクエストに基づいてＨＴＭＬファイルを生成するアプリケーション実行部と、ＨＴＴＰリクエストを受信し、アプリケーション実行部により生成されたＨＴＭＬファイルを含む、このＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとを備える。そして、アプリケーション実行部は、ＨＴＭＬファイルを生成する際にスクリプトを実行し、このスクリプトの命令コードが所定のファイルに対するものであって、かつファイルの内容を変更しない場合には、このファイルを読み込まずに処理を実行してＨＴＭＬファイルを構成するオブジェクトを生成する。ＨＴＴＰサーバは、アプリケーション実行部により生成されたＨＴＭＬファイルに、ファイルを読み込まずに処理を実行して生成されたオブジェクトがあり、かつ、このオブジェクトの元の命令コードがファイルの送信を要求するものである場合に、このファイルをＨＴＭＬファイルと共に送信する。
より詳細には、このＨＴＴＰサーバは、ファイルをメモリのカーネル空間に設けられた送信用のソケット・バッファに直接読み込み、送信する。
【０００９】
また、本発明は、次のようなサーバとしても実現される。このサーバは、ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成するサーバにおいて、ＨＴＴＰリクエストに基づいてＨＴＭＬファイルを生成するアプリケーション実行部と、ＨＴＴＰリクエストを受信し、アプリケーション実行部により生成されたＨＴＭＬファイルを含む、ＨＴＴＰリクエストに対するＨＴＴＰレスポンスを返送するＨＴＴＰサーバとを備える。そして、アプリケーション実行部は、ＨＴＭＬファイルを生成する際にスクリプトを実行し、このスクリプトの命令コードが記憶装置に保持されている所定のファイルの内容を表示させるものである場合に、このファイルを読み込まず、このファイルを特定する情報をオブジェクトに記述する。ＨＴＴＰサーバは、アプリケーション実行部により生成されたＨＴＭＬファイルにファイルを特定する情報が記述されたオブジェクトがある場合は、この情報に基づいて記憶装置に保持されているファイルを特定し、このファイルをＨＴＭＬファイルと共に送信する。
【００１０】
より好ましくは、アプリケーション実行部は、記憶装置に保持されている所定のファイルの内容を表示させる命令コードに関して、ＨＴＴＰサーバによる送信前にファイルへの書き込みが行われる場合は、書き込み前のファイルの複製を作成して保存する。そして、ＨＴＴＰサーバは、書き込みが行われる前のファイルを送信する。
さらに詳細には、アプリケーション実行部は、ＯＳに実装されたコピー・オン・ライト機能を持つハードリンクを用いて、ファイルへの書き込みが行われる場合の複製を作成する。
あるいは、このアプリケーション実行部は、送信対象のファイルをロックし、このファイルの複製へのハードリンクを作成し、このファイルへの書き込みを監視し、書き込みが行われる際に、ファイルの複製を実際に作成し、この複製をＨＴＴＰサーバへ送った後にファイルのロックを解除する。
【００１１】
これらのサーバにおいて、アプリケーション実行部は、スクリプトの命令コードがファイルの内容を表示させる命令コード以外のファイルに対する命令コードであって、かつファイルの内容を変更する場合に、このファイルを読み込んで処理を実行し、オブジェクトを生成する構成としても良い。
【００１２】
また、本発明は、ＨＴＴＰリクエストを受け付けてＨＴＭＬファイルを生成する方法として把握することもできる。この方法は、ＨＴＴＰリクエストに基づき、ＨＴＭＬファイルを生成するためのスクリプトを実行し、このスクリプトの命令コードが所定のファイルに対するものであって、かつファイルの内容を変更しない場合には、このファイルを読み込まずに処理を実行してオブジェクトを生成するステップと、ファイルを読み込まずに処理を実行して生成されたオブジェクトに関して、元の命令コードがファイルの送信を要求するものである場合に、このファイルをメモリのカーネル空間に設けられた送信用のソケット・バッファに直接読み込むステップと、生成されたＨＴＭＬファイルを、ソケット・バッファに読み込まれたファイルと共にＨＴＴＰレスポンスとして送信するステップと、を含む。
【００１３】
さらに本発明は、コンピュータを制御して上記のサーバにおける各機能を実現させるプログラム、あるいはコンピュータに上記の方法における各ステップに対応する処理を実行させるプログラムとしても実現される。このプログラムは、光ディスクや磁気ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより提供することができる。
【発明の効果】
【００１４】
以上のように構成された本発明によれば、ＨＴＭＬファイルを動的に生成する際に、処理に必要でないファイルを読み込まないことにより、メモリコピーによる処理コストを軽減し、ウェブ・アプリケーション・サーバの動作のパフォーマンスを向上させることができる。
【発明を実施するための最良の形態】
【００１５】
以下、添付図面を参照して、本発明の実施形態について詳細に説明する。
＜システム構成＞
図１は、本実施形態のウェブ・アプリケーション・サーバの機能構成を示す図である。
図１に示すウェブ・アプリケーション・サーバ１００は、パーソナルコンピュータ等のコンピュータにより実現され、ＨＴＴＰサーバ１１０と、アプリケーション実行部１２０と、ＯＳ実行部１３０と、記憶装置１４０とを備える。また、ネットワークを介してクライアント２００と接続されている。
【００１６】
本実施形態では、アプリケーション実行部１２０としてＰＨＰ（PHP: Hypertext Preprocessor）言語処理系が用いられるものとする。また、ＨＴＴＰサーバ１１０とアプリケーション実行部１２０との間の通信チャネル（ＳＡＰＩ）としては、ＦａｓｔＣＧＩが用いられるものとする。図１に示すように、アプリケーション実行部１２０は、通常のＰＨＰランタイム・ライブラリ（以下、単にランタイムと記す）１２１と、本実施形態により拡張される機能を担う拡張ライブラリ１２２とを備える。
【００１７】
図２は、本実施形態が適用されるコンピュータのハードウェア構成例を示す図である。
図２に示すコンピュータ１０は、演算手段であるＣＰＵ（Central Processing Unit）１０ａと、記憶手段であるメイン・メモリ１０ｃおよび磁気ディスク装置（ＨＤＤ：Hard Disk Drive）１０ｇを備える。また、ネットワークを介して外部装置に接続するためのネットワーク・インタフェース・カード１０ｆと、表示出力を行うためのビデオ・カード１０ｄおよび表示装置１０ｊと、音声出力を行うための音声機構１０ｈとを備える。さらに、キーボードやマウス等の入力デバイス１０ｉを備える。
【００１８】
図２に示すように、メイン・メモリ１０ｃおよびビデオ・カード１０ｄは、システム・コントローラ１０ｂを介してＣＰＵ１０ａに接続されている。また、ネットワーク・インタフェース・カード１０ｆ、磁気ディスク装置１０ｇ、音声機構１０ｈおよび入力デバイス１０ｉは、Ｉ／Ｏコントローラ１０ｅを介してシステム・コントローラ１０ｂと接続されている。各構成要素は、システム・バスや入出力バス等の各種のバスによって接続される。例えば、ＣＰＵ１０ａとメイン・メモリ１０ｃの間は、システム・バスやメモリ・バスにより接続される。また、ＣＰＵ１０ａと磁気ディスク装置１０ｇ、ネットワーク・インタフェース・カード１０ｆ、ビデオ・カード１０ｄ、音声機構１０ｈ、入力デバイス１０ｉ等との間は、ＰＣＩ（Peripheral Components Interconnect）、ＰＣＩ  Ｅｘｐｒｅｓｓ、シリアルＡＴＡ（AT Attachment）、ＵＳＢ（Universal Serial Bus）、ＡＧＰ（Accelerated Graphics Port）等の入出力バスにより接続される。
【００１９】
なお、図２は、本実施形態が適用されるのに好適なコンピュータのハードウェア構成を例示するに過ぎず、実際の各サーバが図示の構成に限定されないことは言うまでもない。例えば、ビデオ・カード１０ｄを設ける代わりに、ビデオメモリのみを搭載し、ＣＰＵ１０ａにてイメージ・データを処理する構成としても良い。また、音声機構１０ｈを独立した構成とせず、システム・コントローラ１０ｂやＩ／Ｏコントローラ１０ｅを構成するチップセットの機能として備えるようにしても良い。また、補助記憶装置として磁気ディスク装置１０ｇの他に、各種の光学ディスクやフレキシブル・ディスクをメディアとするドライブを設けても良い。表示装置１０ｊとしては、主として液晶ディスプレイが用いられるが、その他、ＣＲＴディスプレイやプラズマ・ディスプレイ等、任意の方式のディスプレイを用いて良い。
【００２０】
図１に示したウェブ・アプリケーション・サーバ１００において、ＨＴＴＰサーバ１１０、アプリケーション実行部１２０およびＯＳ実行部１３０の各機能は、例えば図２に示したコンピュータにおいて、メイン・メモリ１０ｃに読み込まれたプログラムをＣＰＵ１０ａが実行することにより実現される。記憶装置１４０は、磁気ディスク装置１０ｇにより実現される。また、アプリケーションが使用するユーザ・メモリおよびＯＳが使用するカーネル・メモリは、メイン・メモリ１０ｃにより実現される。
【００２１】
図１において、ＨＴＴＰサーバ１１０は、ＯＳ上で動作し、ネットワークを介してＨＴＴＰ通信を行うためのサーバであり、クライアント２００からＨＴＴＰリクエストを受け付けてアプリケーション実行部１２０に渡す。そして、アプリケーション実行部１２０から受け取った処理結果をＨＴＴＰレスポンスとしてクライアント２００に返送する。クライアント２００から受け付けたＨＴＴＰリクエストは、まずカーネル・メモリのソケット・バッファに格納され、ＨＴＴＰサーバ１１０のアプリケーションによって使用されるユーザ・メモリに読み込まれる。反対に、ＨＴＴＰレスポンスが送信される際は、カーネル・メモリのソケット・バッファに一旦格納された後、クライアント２００へ送信される。また、本実施形態のＨＴＴＰサーバ１１０は、ユーザ・メモリとカーネル・メモリとの間でのメモリコピーの負荷を軽減するため、アプリケーション実行部１２０に付与された拡張機能に応じた処理を実行する。この処理の詳細については、後述する。
【００２２】
アプリケーション実行部１２０は、ＯＳ上で動作するＰＨＰ言語処理系であり、ＨＴＴＰサーバ１１０により受け付けられたＨＴＴＰリクエストに応じて、ランタイム１２１および拡張ライブラリ１２２を用いてＨＴＭＬファイルを動的に生成する。ウェブ・アプリケーション・サーバ１００には、ＨＴＴＰリクエストに対応する具体的なＨＴＭＬファイルの元となるＨＴＭＬファイルが保持されている。この元となるＨＴＭＬファイルには、ＨＴＴＰリクエストに応じて実行されるＰＨＰスクリプトが記述されている。このＰＨＰスクリプトがアプリケーション実行部１２０で実行されることによりオブジェクト（ウェブ・オブジェクト）が生成される。そして、生成されたオブジェクトが元となるＨＴＭＬファイルに埋め込まれることにより、ＨＴＴＰリクエストに対応する具体的なＨＴＭＬファイルが動的に生成されることとなる。
【００２３】
図１に示したように、このアプリケーション実行部１２０は、ランタイム１２１と拡張ライブラリ１２２とを備える。ランタイム１２１は、ＰＨＰスクリプトを実行するための通常のランタイム・ライブラリである。本実施形態のアプリケーション実行部１２０では、メモリコピーの負荷を軽減するための機能もランタイム１２１により提供される。拡張ライブラリ１２２（ＰＨＰではｅｘｔｅｎｓｉｏｎと呼ばれる）は、本実施形態によるメモリコピーの負荷を軽減するための仕組みにおいて用いられる補助的な機能を提供する。これらのライブラリの機能およびこれらのライブラリを用いたアプリケーション実行部１２０の動作の詳細については、後述する。
【００２４】
ＯＳ実行部１３０は、ＯＳを実行し、ウェブ・アプリケーション・サーバ１００の基本機能を提供する。ＨＴＴＰサーバ１１０およびアプリケーション実行部１２０は、このＯＳ上で動作する。なお、図１においては、便宜的にＨＴＴＰサーバ１１０およびアプリケーション実行部１２０の各々に対応させて、複数のＯＳ実行部１３０が記載されているが、実際には、ＨＴＴＰサーバ１１０およびアプリケーション実行部１２０は、共通のＯＳ上で動作する。
【００２５】
記憶装置１４０は、アプリケーション実行部１２０により動的に生成される具体的なＨＴＭＬファイルの元となるＨＴＭＬファイルを保持する。また、記憶装置１４０は、所定のデータを保持する。このデータは、アプリケーション実行部１２０により生成されたＨＴＭＬファイルに書き出される。本実施形態では、アプリケーション実行部１２０の拡張ライブラリ１２２により提供された機能を用いて、ＨＴＴＰレスポンスが送信される際に、ＨＴＴＰサーバ１１０によって記憶装置１４０からデータが読み出され、ＨＴＭＬファイルに書き出される。
【００２６】
＜ファイル型文字列オブジェクトの導入＞
上記のように構成されるウェブ・アプリケーション・サーバ１００において、ＨＴＴＰサーバ１１０では、データを受信した際に、カーネル・メモリのソケット・バッファからユーザ・メモリへメモリコピーが行われる。また、データを送信する際に、ユーザ・メモリからカーネル・メモリのソケット・バッファへメモリコピーが行われる。さらに、ＨＴＴＰサーバ１１０とアプリケーション実行部１２０との間でのデータのやり取りは、ＯＳが管理するカーネル・メモリを介して行われる。そのため、一方から他方へデータが渡される度に、ユーザ・メモリとカーネル・メモリとの間でメモリコピーが２回行われる。
【００２７】
本実施形態は、このメモリコピーにおける負荷を軽減する仕組みを実現するため、ＨＴＭＬファイルを構成するオブジェクトの一つとして、ファイル処理を特別に扱う文字列オブジェクトを導入する。この文字列オブジェクトを、「ファイル型文字列オブジェクト」と呼ぶ。ファイル（記憶装置１４０に保持されているデータ）の内容を保持するための通常の文字列オブジェクト（例えば、ＰＨＰスクリプトで記述される、＄ａ＝ｆｉｌｅ＿ｇｅｔ＿ｃｏｎｔｅｎｔｓ（“／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ”）；の「＄ａ」）は、ファイルの中身全体を保持する。これに対し、本実施形態のファイル型文字列オブジェクトは、ファイルのファイル名（ＵＲＩ）のみを保持する。この実装は、アプリケーション・プログラムからは透過であり、通常の文字列オブジェクトと同じセマンティクスを保持している。
【００２８】
ファイル型文字列オブジェクトにおいても、文字列操作などを行うためにファイルの中身が必要な場合は、通常の文字列オブジェクトと同様に、実際にファイルが読み込まれ、その内容が保持される。しかし、文字列の長さやハッシュ値などのように、ファイルのヘッダ等から取得できる情報に関しては、実際にファイルを読み込まずに取得される。
【００２９】
このファイル型文字列オブジェクトにおけるファイルの中身の取得は、ＨＴＴＰサーバ１１０により実行される。アプリケーション実行部１２０は、ファイル型文字列オブジェクトの処理をＨＴＴＰサーバ１１０に依頼するために、アプリケーション実行部１２０からＨＴＴＰサーバ１１０へ送られるＦａｓｔＣＧＩプロトコルのメッセージのヘッダに特別なヘッダ情報を追加する。このヘッダ情報を、「Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダ」と呼ぶ。Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダには、ＦａｓｔＣＧＩメッセージのボディ部に記載されるファイル名の位置（ファイル名の先頭文字の位置を示すオフセット値およびファイル名の長さ）が記述される。ＨＴＴＰサーバ１１０は、このＸ−ＦｉｌｅＳｔｒｉｎｇヘッダに基づいてファイルを特定し、例えばＯＳのｓｅｎｄｆｉｌｅシステムコールを用いて、このファイルをクライアント２００へ送信する。
【００３０】
ここで、具体的なＰＨＰスクリプトの例を挙げて、上記のファイル型文字列オブジェクトを用いたデータ処理の概略的な手順を説明する。
図３に示すようなＰＨＰスクリプトを考える。このＰＨＰスクリプトは、ウェブ・アプリケーションにおいてよく用いられるパターンであり、「ｈｅｌｌｏ」の文字、ＨＴＭＬファイルＡの内容（文書）、「ｂｙｅ」の文字を表示させるものである。
【００３１】
アプリケーション実行部１２０は、まず、このＰＨＰスクリプトをパースし、命令コードに翻訳する。そして、翻訳した命令コードを実行する。このとき、ＥＣＨＯ（標準出力に文字列を表示する）に相当する命令コードを実行する際、対象の変数がファイル型文字列オブジェクトか否かを判定する。
【００３２】
変数がファイル型文字列オブジェクトである命令コードに対しては、ＦａｓｔＣＧＩパケットに、ファイルの内容ではなく、ファイル名のＵＲＩ（／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ）を追加する。また、ヘッダ情報としてＸ−ＦｉｌｅＳｔｒｉｎｇを記述し、ＦａｓｔＣＧＩパケット中のファイル名の位置を示すオフセット値および長さを指定する。
【００３３】
この後、アプリケーション実行部１２０で生成されたＦａｓｔＣＧＩパケットがＨＴＴＰサーバ１１０に送られて処理される。ＨＴＴＰサーバ１１０は、受け取ったＦａｓｔＣＧＩパケットのヘッダをパースする。そして、Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダを見つけた場合、ＨＴＴＰサーバ１１０は、そのＦａｓｔＣＧＩパケットをそのままソケットに流すのではなく、ｓｅｎｄｆｉｌｅシステムコールを用いて、Ｘ−ＦａｓｔＳｔｒｉｎｇヘッダで指定されたファイルをクライアント２００に返送する。
【００３４】
以上のように、本実施形態によれば、アプリケーション実行部１２０による処理を必要としないファイルに関して、アプリケーション実行部１２０が取得するのではなく、ＨＴＴＰサーバ１１０が取得してクライアント２００に送信する。そのため、アプリケーション実行部１２０がファイルを取得する際に必要となるメモリコピーが省略され、アプリケーション実行部１２０からＨＴＴＰサーバ１１０へＦａｓｔＣＧＩパケットが送られる際に行われるメモリコピーでも、ファイルのコピーは行われない。さらに、ＨＴＴＰサーバ１１０がクライアント２００へＨＴＴＰレスポンスを返送する際にも、ファイルは、ユーザ・メモリを介することなくカーネル・メモリからクライアント２００へ直接送信される。したがって、ファイルのメモリコピーが省略された分、処理コストが軽減され、ウェブ・アプリケーション・サーバ１００の動作のパフォーマンスが向上することとなる。
【００３５】
ところで、ウェブ・アプリケーション・サーバ１００が上記のような手順で動作する場合、アプリケーション実行部１２０により命令コードが実行された時点と、ＨＴＴＰサーバ１１０によりその命令コードの対象であるファイルが取得される時点には差がある。そのため、この遅延の間に送信対象であるファイルの内容が更新される可能性がある。一方、送信対象のファイルの内容は、アプリケーション実行部１２０が実行した時点でのファイルの内容と同一であることが保証される必要がある。そこで、本実施形態は、ＯＳレベルもしくはＰＨＰ言語処理系のレベルでＣｏｐｙ−ｏｎ−ｗｒｉｔｅを持つハードリンクを用いた仕組みにより、ファイルの内容を保証する。本実施形態では、この機能は、拡張ライブラリ１２２により提供される。このハードリンクを用いてファイルの内容を保証する手法の詳細については、後述する。
【００３６】
＜ライブラリにより提供される機能およびアプリケーション実行部の動作＞
次に、ランタイム１２１および拡張ライブラリ１２２により提供される機能と、アプリケーション実行部１２０の動作について詳細に説明する。
アプリケーション実行部１２０は、クライアント２００からのＨＴＴＰリクエストを、ＨＴＴＰサーバ１１０を介して取得し、このＨＴＴＰリクエストに応じてＨＴＴＰレスポンスとなるＨＴＭＬファイルを動的に生成する。この際、アプリケーション実行部１２０は、このＨＴＴＰレスポンスの元となるＨＴＭＬファイルに記述されたＰＨＰスクリプトを、ランタイム１２１および拡張ライブラリ１２２を用いて実行する。
【００３７】
図４は、拡張ライブラリ１２２によるアプリケーション実行部１２０の動作を示すフローチャートである。
アプリケーション実行部１２０は、ＰＨＰスクリプトの命令コードを順次取得し、拡張ライブラリ１２２を用いて処理を行う。図４を参照すると、アプリケーション実行部１２０は、まず命令コードによる処理対象の文字列オブジェクトがファイル型文字列オブジェクトか否かを判断する（ステップ４０１）。処理対象がファイル型文字列オブジェクトか否かは、命令コードの関数等に基づいて判断することができる。例えば、「ｆｉｌｅ＿ｇｅｔ＿ｃｏｎｔｅｎｔｓ」等の関数であれば、処理対象はファイル型文字列オブジェクトと判断される。具体的に、どの命令コードや関数の場合に処理対象がファイル型文字列オブジェクトであると判断するかについては、予め定義しておけば良い。
【００３８】
処理対象がファイル型文字列オブジェクトと判断した場合、アプリケーション実行部１２０は、次に、ウェブ・アプリケーション・サーバ１００のＯＳがＣｏｐｙ−ｏｎ−ｗｒｉｔｅに対応したハードリンクを実装しているか否かを判断する（ステップ４０２）。ＯＳがこの機能を実装しているならば（例えば、ｅｘｔ３ｃｏｗ、ＷＦＳ）、アプリケーション実行部１２０は、このＯＳの機能を用いて（ＯＳ実行部１３０に依頼して）、送信対象のファイルへのハードリンクを作成する（ステップ４０３）。このハードリンクは、元の（すなわち命令コードの関数により読み出される）ファイルのファイル名に基づいて作成される。
【００３９】
ステップ４０３の処理を経て、この文字列オブジェクト（ファイル型文字列オブジェクト）は、次のような属性を持つこととなる。
・ＴＹＰＥ：ＦＩＬＥ
・ＶＡＬＵＥ：／ｔｍｐ／ｆｉｌｅＡ−ｌｉｎｋ．ｈｔｍｌ
・ＯＲＩＧＩＮＡＬ：／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ
・Ｃｏｗ−ｈａｎｄｌｅｒ：ＯＳ
ここで、「ＴＹＰＥ」は文字列オブジェクトの型を示し、「ＦＩＬＥ」は文字列オブジェクトの型がファイル型であることを示す。「ＶＡＬＵＥ」はＨＴＴＰサーバ１１０が送信すべきファイルのファイル名を示す。「Ｏｒｉｇｉｎａｌ」はハードリンクされた元のファイルのファイル名を表す。「Ｃｏｗ−ｈａｎｄｌｅｒ」はＣｏｐｙ−ｏｎ−ｗｒｉｔｅ機能をどのレベルで実装しているかを示し、この場合にはＯＳが提供することを示している。
【００４０】
一方、ＯＳがＣｏｐｙ−ｏｎ−ｗｒｉｔｅに対応したハードリンクを実装していない場合、アプリケーション実行部１２０は、自身が同様の機能を提供するため、以下の処理を実行する（ステップ４０４）。
（１）他のプロセスからの書き込みを避けるために、／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌにロックをかける。
（２）／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌから／ｔｍｐ／ｆｉｌｅＡ−ｌｉｎｋ．ｈｔｍｌへハードリンクを作る。
（３）以下の文字列オブジェクトを作る。
・ＴＹＰＥ：ＦＩＬＥ
・ＶＡＬＵＥ：／ｔｍｐ／ｆｉｌｅＡ−ｌｉｎｋ．ｈｔｍｌ
・ＯＲＩＧＩＮＡＬ：／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ
・Ｃｏｗ−ｈａｎｄｌｅｒ：ＰＨＰ
（４）ｆｗｒｉｔｅ関数などで、ｆｉｌｅＡ．ｈｔｍｌへの書き込みを監視する。そして、ｆｉｌｅＡ．ｈｔｍｌへの書き込みが発生した場合は、ｆｉｌｅＡ−ｌｉｎｋ．ｈｔｍｌのコピーを作る（これはアプリケーション実行部１２０が実行する）。
（５）ＨＴＴＰサーバがｆｉｌｅＡ−ｌｉｎｋ．ｈｔｍｌを送った時点で、ｆｉｌｅＡ．ｈｔｍｌへのロックを解除する。
【００４１】
ステップ４０４により作成される文字列オブジェクトは、ステップ４０３で作成されるものと概ね同様であるが、Ｃｏｐｙ−ｏｎ−ｗｒｉｔｅ機能の実装レベルを示す「Ｃｏｗ−ｈａｎｄｌｅｒ」が異なり、ここではＰＨＰとなる。また、上記の動作のうち、（４）および（５）の動作は、（３）で文字列オブジェクトが作成された後、ランタイム１２１の処理が実行され、ＨＴＴＰサーバ１１０によりファイルが取得されるまでの間で、ファイルへの書き込みが発生した場合に実行される。
【００４２】
アプリケーション実行部１２０は、以上のようにしてハードリンクを作成した後、ランタイム１２１を用いた処理に移行する（ステップ４０５）。また、アプリケーション実行部１２０は、ステップ４０１で、処理対象がファイル型文字列オブジェクトではないと判断した場合、通常のＰＨＰ言語処理系による拡張ライブラリ１２２を用いた処理と同様の処理を必要に応じて行った後（ステップ４０６）、ランタイム１２１を用いた処理に移行する（ステップ４０５）。
【００４３】
図５は、ランタイム１２１によるアプリケーション実行部１２０の動作を示すフローチャートである。
図５を参照すると、アプリケーション実行部１２０は、拡張ライブラリ１２２を用いた処理が済んだ命令コードを順次取得する。そして、その命令コードが「ＥＣＨＯ」か否かを判断する（ステップ５０１）。
【００４４】
命令コードが「ＥＣＨＯ」である場合、次にアプリケーション実行部１２０は、処理対象であるオブジェクトがファイル型文字列オブジェクトか否かを判断する（ステップ５０２）。ファイル型文字列オブジェクトと判断したならば、次にアプリケーション実行部１２０は、オブジェクトの値に入っているファイル名を、ＳＡＰＩとして用いられるＦａｓｔＣＧＩパケットのボディ部分に追加する。また、そのファイル名の位置を示すオフセット値（ｏｆｆｓｅｔ）と長さ（ｌｅｎｇｔｈ）をＦａｓｔＣＧＩパケットのＸ−ＦｉｌｅＳｔｒｉｎｇヘッダに追加する（ステップ５０３）。このとき、拡張ライブラリ１２２により生成されたハードリンクに関する情報（リンク名、リンク名の長さ）も、ＦａｓｔＣＧＩパケットのボディ部分およびＸ−ＦｉｌｅＳｔｒｉｎｇヘッダに、それぞれ追加される。Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダのフォーマットは、例えば次のようになる。
Ｘ−ＦｉｌｅＳｔｒｉｎｇ：
オフセット値／元のファイル名の長さ／リンク名の長さ
【００４５】
具体例を挙げると、図３に示したＰＨＰスクリプトを実行した場合、ハードリンクのリンク名を「／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ−ｌｉｎｋ」とすると、ＦａｓｔＣＧＩパケットのヘッダ部（Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダ）とボディ部は、図６に示すようになる。
【００４６】
一方、ステップ５０２で、処理対象であるオブジェクトがファイル型文字列オブジェクトではない通常の文字列オブジェクトであると判断した場合、次にアプリケーション実行部１２０は、ＦａｓｔＣＧＩパケットのボディ部分に、文字列の内容（Ｓｔｒｉｎｇの値）を付加する（ステップ５０４）。
【００４７】
また、ステップ５０１で、取得した命令コードが「ＥＣＨＯ」でない場合、次にアプリケーション実行部１２０は、処理対象であるオブジェクトがファイル型文字列オブジェクトであって、かつ実行する関数が文字列に影響を与えるものか否かを判断する（ステップ５０５）。ここで、文字列に影響を与える関数とは、例えば、文字列から空白を除去する関数ｔｒｉｍ等が該当する。どの関数が文字列に影響を与えるかについては、予め定義しておけば良い。
【００４８】
オブジェクトがファイル型文字列オブジェクトであり、関数が文字列に影響を与える関数である場合、次にアプリケーション実行部１２０は、処理対象であるファイルを読み込み、ファイル型文字列オブジェクトを通常の文字列オブジェクトに置き換える（ステップ５０６）。そして、ステップ５０１で取得した命令コードを実行し、ＦａｓｔＣＧＩパケットを作成する（ステップ５０７）。例えば、下記のようなＰＨＰスクリプトの場合、実際にファイル（ｆｉｌｅＡ．ｈｔｍｌ）をロードして、通常の文字列オブジェクトとして処理を行う。
<?php  $a = file_get_contents(“/tmp/fileA.html”);  echo trim($a); ?>
【００４９】
一方、オブジェクトがファイル型文字列オブジェクトでないか、または関数が文字列に影響を与えない場合、アプリケーション実行部１２０は、そのままステップ５０１で取得した命令コードを実行し、ＦａｓｔＣＧＩパケットを作成する（ステップ５０７）。すなわち、オブジェクトがファイル型文字列オブジェクトであっても、関数が文字列に影響を与えない場合は、処理対象のファイルを読み込むことなく、命令コードが実行されることとなる。
【００５０】
ステップ５０３、５０４または５０７でＦａｓｔＣＧＩパケットが作成された後、アプリケーション実行部１２０は、未処理の命令コードが残っているか調べる（ステップ５０８）。そして、ＰＨＰスクリプトの各命令コードに対して、順次ステップ５０１乃至ステップ５０７の処理が行われる。全ての命令コードに対して処理が済んだならば、アプリケーション実行部１２０は、通信チャネル（ＳＡＰＩ）を介して、作成されたＦａｓｔＣＧＩパケットをＨＴＴＰサーバ１１０に渡す（ステップ５０９）。
【００５１】
＜ＨＴＴＰサーバの動作＞
次に、上記のようにしてアプリケーション実行部１２０により生成されたＨＴＭＬファイルに対するＨＴＴＰサーバ１１０の動作について説明する。
ＨＴＴＰサーバ１１０は、基本的な動作として、受け付けたＨＴＴＰリクエストに対するＨＴＴＰレスポンスとして、アプリケーション実行部１２０により生成されたＨＴＭＬファイルをクライアント２００に返送する。このとき、元のＨＴＭＬファイルにおけるＰＨＰスクリプトの命令コードが「ＥＣＨＯ」である場合、オブジェクトで指定されているファイルの中身がＨＴＭＬファイルと一緒にクライアント２００へ送信される必要がある。しかし、本実施形態では、上記のように、送信対象のファイルがアプリケーション実行部１２０により読み込まれていないため、ＨＴＭＬファイルの該当するオブジェクトにはファイルの中身が埋め込まれていない。そこで、ＨＴＴＰサーバ１１０が、送信対象のファイルを記憶装置１４０から読み出して、ＨＴＭＬファイルと共にクライアント２００へ送信する。
【００５２】
図７は、ＨＴＭＬファイルの送信時のＨＴＴＰサーバ１１０によるデータ処理の動作を示すフローチャートである。
図７に示すように、ＨＴＴＰサーバ１１０は、アプリケーション実行部１２０からＦａｓｔＣＧＩパケットを受信すると（ステップ７０１）、そのＦａｓｔＣＧＩパケットのヘッダ部にＸ−ＦｉｌｅＳｔｒｉｎｇヘッダが含まれているか否かを判断する（ステップ７０２）。Ｘ−ＦｉｌｅＳｔｒｉｎｇヘッダが含まれている場合は、以下の一連の処理（ステップ７０３〜７０６）を実行する。
【００５３】
ＨＴＴＰサーバ１１０は、まず、ＦａｓｔＣＧＩパケットのＸ−ＦｉｌｅＳｔｒｉｎｇヘッダに記述されているファイル名のオフセット値、元のファイル名の長さおよびリンク名の長さを取得する（ステップ７０３）。次に、ＨＴＴＰサーバ１１０は、ＦａｓｔＣＧＩパケットのボディ部を先頭から順に着目し、現在位置（初期的には先頭位置）からステップ７０３で取得したオフセット値で表される位置までに記載されたメッセージ・データをソケット・バッファに送る（ステップ７０４）。
【００５４】
次に、ＨＴＴＰサーバ１１０は、ステップ７０３で取得したファイル名の長さおよびリンク名の長さに基づいて、ＦａｓｔＣＧＩパケットのボディ部に記載されたファイル名およびリンク名を取得する。そして、このファイル名またはリンク名で特定されるファイルを、ｓｅｎｄｆｉｌｅシステムコールを用いてソケット・バッファに送る（ステップ７０５）。このとき、ＨＴＴＰサーバ１１０は、このファイル名およびリンク名とｓｔａｔシステムコールを用い、対象のファイルが更新されていないか確認する。ファイルが更新されていなければ、リンク名により特定されるファイル（アプリケーション実行部１２０が拡張ライブラリ１２２を用いて生成した複製ファイル）をソケット・バッファに送る。一方、ファイルが更新されている場合は、元のファイル名により特定されるファイルをソケット・バッファに送る。この処理では、ｓｅｎｄｆｉｌｅシステムコールを用いてファイルが送信されるため、対象のファイルは、記憶装置１４０から読み出されてカーネル・メモリのファイル・バッファに格納された後、ソケット・バッファに直接送られる。すなわち、ＨＴＴＰサーバ１１０のアプリケーションが使用するユーザ・メモリから、ソケット・バッファが設けられたカーネル・メモリへ、ファイルがコピーされることはない。
【００５５】
この後、ＦａｓｔＣＧＩパケットのボディ部における現在の着目位置がボディ部の最後に達したか否かを判断する（ステップ７０６）。ボディ部の最後に達していなければ、ステップ７０３に戻り、ステップ７０３〜７０５の処理を繰り返す。なお、ステップ７０４およびステップ７０５の処理については、該当するデータ（ファイル名でない文字列、元のファイル名、リンク名）が存在しないときは、適宜スキップする。
【００５６】
現在の着目位置がボディ部の最後に達したならば、ＨＴＴＰサーバ１１０によるデータ処理は終了する。ステップ７０２で、ＦａｓｔＣＧＩパケットのヘッダ部にＸ−ＦｉｌｅＳｔｒｉｎｇヘッダが含まれていないと判断された場合は、何ら特別のデータ処理が行われることなく、ＦａｓｔＣＧＩパケットのボディ部に記載されているメッセージ・データがソケット・バッファに送られる（ステップ７０７）。
ＨＴＴＰサーバ１１０は、以上のようにしてソケット・バッファに送られたデータを、ＨＴＴＰレスポンスとしてクライアント２００へ送信する。
【００５７】
以上の動作を、図３に示したＰＨＰスクリプトおよび図６に示したＦａｓｔＣＧＩパケットを例として説明する。
この場合、まず、ＦａｓｔＣＧＩパケットのボディ部におけるオフセット０−４までの文字であるメッセージ「ｈｅｌｌｏ」がソケット・バッファに送られる（図７のステップ７０４参照）。次に、ファイル名「／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ」またはリンク名「／ｔｍｐ／ｆｉｌｅＡ．ｈｔｍｌ−ｌｉｎｋ」に基づいて、ファイルがソケット・バッファに送られる（図７のステップ７０５参照）。この後、まだボディ部の最後に達していないので、ステップ７０３以降の処理を繰り返し、オフセット４０から４２までの文字であるメッセージ「ｂｙｅ」がソケット・バッファに送られる（図７のステップ７０４）。
【００５８】
＜メモリコピーによる負荷の軽減の説明＞
図８は、本実施形態によるウェブ・アプリケーション・サーバ１００の動作におけるメモリコピーの様子を示す図であり、図９は、従来のウェブ・アプリケーション・サーバの動作におけるメモリコピーの様子を示す図である。なお、図８、図９では、ＰＨＰスクリプトの命令コードが「ＥＣＨＯ」である場合の動作を示している。
【００５９】
図８を参照すると、ＨＴＴＰサーバ１１０がＨＴＴＰリクエストを受信した際に１回（Ｃ１）、ＨＴＴＰサーバ１１０からアプリケーション実行部１２０へのデータ伝達時に２回（Ｃ２、Ｃ３）、アプリケーション実行部１２０からＨＴＴＰサーバ１１０へのデータ伝達時に２回（Ｃ５、Ｃ６）、ＨＴＴＰサーバ１１０からＨＴＴＰレスポンスが送信される際に数回（Ｃ７）、メモリコピーが行われている。ここで、ＨＴＴＰサーバ１１０からＨＴＴＰレスポンスが送信される際のメモリコピーは、ｅｃｈｏとｆｉｌｅ＿ｇｅｔ＿ｃｏｎｔｅｎｔｓ関数が繰り返し、交互に呼ばれた場合に、その繰り返しの回数に応じて発生する。
【００６０】
図９を参照すると、図８の場合と同様にメモリコピーが行われる他、アプリケーション実行部１２０による処理中に、ファイルが記憶装置１４０から読み込まれる際に１回（Ｃ４）、メモリコピーが行われる。また、ＨＴＴＰサーバ１１０からＨＴＴＰレスポンスが送信される際のメモリコピー（Ｃ７）は１回のみである。
【００６１】
図９に示した各々のメモリコピー（Ｃ１〜Ｃ７）に要する時間を、発生順に、Ｔ１、Ｔ２、Ｔ３、Ｔ４、Ｔ５、Ｔ６、Ｔ７とする。一方、図８に示した各々のメモリコピー（Ｃ１〜Ｃ３、Ｃ５〜Ｃ７）に要する時間を、同じく発生順に、Ｔ１、Ｔ２、Ｔ３、Ｔ５’、Ｔ６’、Σｔ｛ｉ｝とする。ただし、Σｔ｛ｉ｝におけるｉは、ＨＴＴＰサーバ１１０からＨＴＴＰレスポンスが送信される際のメモリコピーの回数である。
【００６２】
図８と図９を比較すると、ＨＴＴＰリクエストがアプリケーション実行部１２０に伝達されるまでの３回のメモリコピー（Ｃ１〜Ｃ３）に要する時間は共通（Ｔ１、Ｔ２、Ｔ３）である。本実施形態の動作である図８では、アプリケーション実行部１２０がファイルを読み込まないので、メモリコピーＣ４が存在しない。また、アプリケーション実行部１２０からＨＴＴＰサーバ１１０へ伝達されるデータにはファイルが含まれていないため、伝達されるデータ量は図９の場合よりも小さく、メモリコピーＣ５、Ｃ６において、Ｔ５＞Ｔ５’、Ｔ６＞Ｔ６’である。一方、図８において、ＨＴＴＰサーバ１１０からＨＴＴＰレスポンスが送信される際のメモリコピーでは、Σｔ｛ｉ｝に加えて、ｓｅｎｄｆｉｌｅシステムコールを実行するための時間を要す。したがって、図８に示す本実施形態におけるメモリコピーに要する総時間と図９に示す従来のメモリコピーに要する総時間とを比較すると、図１０に示すようになる。
【００６３】
本実施形態では、Σｔ｛ｉ｝における複数回のメモリコピーと、その際に実行されるｓｅｎｄｆｉｌｅシステムコールの分だけ、従来よりも時間的コストを要する。しかし、サイズの大きいファイルをメモリコピーするのに要する時間的コストは非常に大きいため、一般には、本実施形態の動作の方が時間的コストを軽減できるものと考えられる。また、本実施形態では、ユーザ・メモリとカーネル・メモリとの間でファイルのコピーが行われないため、メモリコピーに要するメモリ容量も少なくて済み、この点においてもコストを軽減することができる。
【００６４】
以上、本実施形態について説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。例えば、上記実施形態では、アプリケーション実行部１２０をＰＨＰ言語処理系として説明したが、ＨＴＭＬファイルにスクリプトを記述できる他の処理系であっても良い。また、ＨＴＴＰサーバ１１０とアプリケーション実行部１２０との間の通信チャネル（ＳＡＰＩ）をＦａｓｔＣＧＩとしたが、ｍｏｄ＿ｐｈｐ等の他のＳＡＰＩであっても良い。さらに、ウェブ・アプリケーション・サーバ１００において、本実施形態による動作と図９に示した動作とを併用し、実行中に検査を行って、図１０の差分が０を越える場合に本実施形態を動的に適用することも可能である。その他、上記実施形態に、種々の変更または改良を加えたものも、本発明の技術的範囲に含まれることは、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００６５】
【図１】本実施形態のウェブ・アプリケーション・サーバの機能構成を示す図である。
【図２】本実施形態が適用されるコンピュータのハードウェア構成例を示す図である。
【図３】本実施形態で用いられるＰＨＰスクリプトの例を示す図である。
【図４】本実施形態の拡張ライブラリによるアプリケーション実行部の動作を示すフローチャートである。
【図５】本実施形態のランタイムによるアプリケーション実行部の動作を示すフローチャートである。
【図６】本実施形態におけるＦａｓｔＣＧＩパケットの構成例を示す図である。
【図７】本実施形態によるＨＴＭＬファイルの送信時のＨＴＴＰサーバによるデータ処理の動作を示すフローチャートである。
【図８】本実施形態によるウェブ・アプリケーション・サーバの動作におけるメモリコピーの様子を示す図である。
【図９】従来のウェブ・アプリケーション・サーバの動作におけるメモリコピーの様子を示す図である。
【図１０】本実施形態と従来のメモリコピーにおける時間的コストを比較する図表である。
【符号の説明】
【００６６】
１００…ウェブ・アプリケーション・サーバ、１１０…ＨＴＴＰサーバ、１２０…アプリケーション実行部、１２１…ランタイム、１２２…拡張ライブラリ、１３０…ＯＳ実行部、１４０…記憶装置
【図１】
0005235504.tif 000002
【図２】
0005235504.tif 000003
【図３】
0005235504.tif 000004
【図４】
0005235504.tif 000005
【図５】
0005235504.tif 000006
【図６】
0005235504.tif 000007
【図７】
0005235504.tif 000008
【図８】
0005235504.tif 000009
【図９】
0005235504.tif 000010
【図１０】
0005235504.tif 000011