BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。2016/10/31PHPにおけるシンボリックリンクを使ったデプロイの危険性について(「realpath_cache」和訳)この文書は@julienPauliさんによる記事「realpath_cache」の日本語翻訳です。元々は@gilbiteさんがKLab社内向けに翻訳したものでしたが、日本語では見たことがない指摘を含んでおり今でも有用だと考えたため、@julienPauliさんの了解を取った上で@hnwが修正・追記して公開するものです。知っておきたい極めて重要な概念です。コードのデプロイ時にシンボリックリンクを取り扱う場合は知っておくべきでしょう。界隈にフレームワークが現れ始めた時期ですね。システムコールの復習あなたのシステムがどうやって動いているのか、重々ご承知とは思いますが、いったん整理しましょう。指定された場合に、カーネルやファイルシステムは実際のところ何が指定されたのかを知る必要があります。(Unixでいうところの)ファイルにアクセスしようとしてパスを指定するときは、必ずあなた自身なり、ライブラリなり、カーネルなりがそのパスを解決する必要があります。ここでいうパスの解決とは、要はそれがファイルなのか、ディレクトリなのか、はたまたリンクなのか、という情報を得る事です。パスの解決は、OSにそのファイルの種類を問い合わせることで行われます。ファイルがシンボリックリンクだった場合は、さらにリンク先のファイルの種類を問い合わせることになります。ような相対パスの場合には、まずフルパスに直し、そのフルパスのパス解決を行います(Unixでいうファイルは、すべての種類の実ファイル、ディレクトリ、リンクのことを指します)。システムコールを呼びます。システムコールですからカーネルトラップやコンテキストスイッチを発生させますし、ほぼ確実にディスクに対してメタデータを問い合わせます。cacheに乗っていないかもしれません。発生してしまうことになります。プロジェクトでは大量のファイルを使用しますよね。昨今は大量のクラスを使用するので、大量のファイルが存在することになります(1ファイルに1クラスだと仮定しています)。情報を問い合わせる必要があります。そんなわけで、PHPからファイルアクセスするたびにパスの解決、リンクの解決、またファイルの情報の取得が行われます。システムコールを使用します。呼ばれる領域にキャッシュされています。実はPHPの他にも多くのソフトウェアがstatをキャッシュしています。キャッシュするのはパス解決された結果であるところのrealpathだけです。cacheではキャッシュされません。PHPには最後のstatシステムコール1件をキャッシュする仕組みがあり、そちらではその他の情報もキャッシュされます。例によって、ソースコードを確認してみると良さそうですね。