12因子のアプリケーション宣言はどのようにPHPプロジェクトに適用されますか?

私は、 12因子のアプリケーションを読んでいます。これは、Webベースで適用するためのかなり包括的なルールのようです応用。例ではPythonやレールを使用していますが、決してphpはありません...私は、宣言の要因がPHPプロジェクトにどのように適用できるのか

ありがとう

17

4 答え

Short answer:

All points apply to PHP as the twelve factor app manifesto refers specifically for web apps.

PHPは特に1,2,7,8,9(7と8の副作用として)と12(部分的に)の項目では、12の要素に準拠するのに非常に苦労しています。実際には、RubyとPythonのコミュニティでよく見られる "PHPの嫌な思い"(私が間違ったことはしないで、RubyとPythonはより良い言語だと思うが、私は嫌いではないPHPを使用し、「自分の言葉はより良い」という批判を明確に嫌います。)

つまり、PHPプロジェクトはWebアプリケーションやSaaSではなく、シンプルなWebサイトなので、12の要素が必要ではないと考えるかもしれません。

Long answer: A point-by-point analysis would be:

  1. コードベース:問題ではありません

  2. pearの依存関係はシステム全体にインストールされ、通常は宣言するための統合マニフェストはありませんので、

    依存関係: PHPのセットアップでは、いくつかのライブラリを利用できるように、OSインストールにパッケージを追加する必要があります。最後にAFAIKには、 "virtualenv"、 "rbenv"、 "rvm"のような分離を提供するためのツールがPHPにはありません(PHPコミュニティの中ではあまり人気がない場合)。編集: a href = "http://getcomposer.org/"> http://getcomposer.org/ )は依存関係に関して正しいことをしているようですが、それでもPHPバージョンは分離されませんが、残りのすべてそれはうまくいくはずです。

    設定:一部のPHPフレームワークはこれにはあまり適していませんが、確かにうまくいくものがあります。/li>

    サービスをバックアップする

    ビルド、リリース、実行:これはPHPには完全に適用可能です。 PHPコミュニティのいくつかのプロジェクトやホスティングプラットフォームが直接FTPなどを悪用していると主張しているかもしれませんが、それはPHP自身の欠陥ではなく、この項目に関して正しいことをする上で本当の障害はありません。

  3. プロセス:これはPHPの決定的な問題です。 PHPは完全にステートレスなプロセスを実行することができます(ステートレスという言葉に重点が置かれています)。実際、いくつかのフレームワークは、あなたの人生を簡単にします。例えば、symfonyは通常のセッションの代わりにmemcachedやデータベースストレージを使ってすぐにセッションを管理できます。

  4. ポートバインディング:これを単純に説明すると、この点では基本的にリバースプロキシと、分離されたコンポーネントではなく実際のウェブサーバーをアプリに埋め込む必要があります。これにより、PHPは非常に厳しい条件に適合します。これを行う方法はありますが(PHPをFastCGIとして使用することについての返答を参照してください)、他のコミュニティ(例:Ruby、Node.js)と同じように、PHPアプリケーションを提供するための最も一般的な方法でも、 p>

  5. プロセス:これはPHPでは不可能ではありません。しかし、いくつかの要素がPHPを厳格な位置に置いています。すなわち、項目6と項目7の良好なサポートの欠如。新しいプロセスを生成するPHP APIが本当にうまく動作しないという事実。特にApacheのmod_phpがワーカーを処理する方法(これはPHPの最も一般的なデプロイメントスキーマです)

  6. 使い捨て:適切なツールを使用している場合、迅速で使い捨てで整頓されたWebおよびワーカープロセスを作成できないよう、PHPには何もありません。しかし、基盤となるプロセスモデルはポイント7と8で実装するのが難しいので、9は副作用として少し厄介になります

  7. Dev/prod parity:これは非常にプラットフォームにとらわれないものです。 PHPはこのルールの例外ではありませんが、特別な障害もありません。実際には、マニフェストに指定されているツールのほとんどはPHPプロジェクトに適用できます。

  8. ログ:実行環境のログシステムに依存しないアプリケーションをPHP上で実行することができます。

  9. 管理プロセス:この点に関するPHPの最も重要な欠陥は、REPLシェルがないことです。その他の点については、Symfonyのようないくつかのフレームワークでは、管理タスク(例えばDoctineベースのデータベース移行)をプログラムし、それらを「通常の」Web環境と同じ環境で実行することができます。

PHPコミュニティは進化しているので、すでに言及されているいくつかの間違いを正しているかもしれません。

15
追加された

ビルド、リリース、実行:コンパイルされたコードに適用されますが、PHPではそうではありません。したがって、この   あなたが見る必要があるものではありません。

私はこの12の要素については何の権限も主張していないが、私がこのセクションを読んだのは、著者が反対するということだ。コンパイルだけでなく、小さなコード(コードのスナップショット)と大きなコード(コードが使用するライブラリ)の両方で依存関係を管理することです。

あなたが新しいデベロッパーであると想像してみてください。「大丈夫、これはカスタムのPHPアプリケーションです。だから...

a)カスタムコードは実際にはrepo Aとrepo Bの2つのサブプロジェクトです。

b)ディレクトリレイアウトを作成する必要があります。

c)各サブプロジェクトのコードをこのサブディレクトリとこのサブディレクトリにチェックアウトします。

d)次の3つのオープンソースPHPライブラリも必要です。

ライブラリFooのバージョン3.1、 ライブラリバーのバージョン2.3 ライブラリBatのバージョン5.6。

e)自宅のプロジェクトサイトからダウンロードして解凍し、このディレクトリ、そのディレクトリ、および他のディレクトリにコピーします。

f)これらの設定を外部ライブラリに設定する必要があります。

g)とこれらの設定は、2つのカスタムコードプロジェクトに含まれています。

h)それがすべて完了したら、tar/gzipですべてをアップし、QAサーバーにアップロードし、htdocsに展開します。

その一連のステップにはコンパイルはありませんが、たくさんのビルディングがあると確信できます。

セットアップと作業のすべてを得ることは、ビルドのステップです。

tar/gzipを使用して作業ビルドのスナップショットを作成するのがリリースのステップです。

それをQAサーバのhtdocsディレクトリにSCPで展開することは実行時のステップです。

上記の手順のいくつかは不要であると言えるかもしれません - ライブラリはシステムレベルで展開し、単にインポートする必要があります。 12factors.netのサイトからは、作者があなたのアプリを一意にインポートすることを好みます。これは依存性のバージョニングの問題を回避し、より多くのディスクスペースを犠牲にします(誰も気にしません)。これらの依存関係をすべてローカルでアプリケーションとして管理するのはもっと面倒ですが、それがビルド/リリース/ランタイム方式のポイントです。

3
追加された
良い引数@スティーブンありがとう。
追加された 著者 Jay Godse,
うーん、私はSCPとアンパックはまだリリースのステップであると言うでしょう。実行時のステップは、「アプリが実行されている間に何が起こるか」というIMOです。
追加された 著者 Jerome Baum,

このPOSTを参考にしないでください。これは2011年に書かれましたが、それ以降は多くのことが変更されています...プログラミングの世界は絶え間なく進化しています。 2011年の見通しは、2018年に引き続き有効です。


私はちょうど各点のいくつかの行を読んで、ここで私の文書の分析に行く:

  1. コードベース:小さなプロジェクトでも誰でも、PHPでもコードベースでもコードベースを持つ必要があります。

  2. Dependecies :PHPは、コードをサーバーに単純にコピーするだけで簡単に移植できるインクルードとコードライブラリを使用します。場合によってはPEARを使用し、サーバーがそれをサポートしていない場合は、手動でpearをコピーしてインストールする必要があります。私はほとんどの場合Zend Frameworkを使用しているので、ftpのアップロードでフレームワークのコードをコピーするだけです。

  3. 設定:PHPアプリケーションに設定を保存する書き込み可能な設定ファイルがあるのが一般的です。保存場所は開発者の選択ですが、通常はアプリのルートまたはsettings/configフォルダにあります。

  4. バッキングサービス:PHPはMySQLなどのバックアップサービスをほとんど使用しています。あなたのアプリに依存する他の一般的なサービスは、TwitterやFacebookです。あなたは彼らのAPIを使って彼らと通信し、作業するためのデータを格納/取得します。

  5. ビルド、リリース、実行:PHPの場合とは異なるコンパイル済みコードに適用されます。だから、この点はあなたが見る必要があるものではありません。

  6. プロセス:HTTPはステートレスでサービスされているため、通常はWebサーバーとは別にプロセスがありません。これは完全に真実ではありません.Webサービスは、あなたがパッケージングしたり作成したりするアプリケーションとバンドルされている可能性があります。しかし、標準のために、通常、ウェブ世界でプロセスを使用する必要はありません。

  7. ポートバインディング:PHPはポートバインディングにはまったく適用されません。なぜなら、Apache、NGinx、Lighttpdがアドレスにフックするプロセスではないからです。 #6/7を読むと、ウェブサイトが12ファクタのアプリにならないことを理解できます。

  8. 同時実行性:この点は、PHP Webページには適用されないプロセスについても扱います。この点はコンテンツを提供するサーバーに当てはまります。

  9. 使い捨て:この段階では、プロセスの速さについて説明します。明らかに、プロセスではないPHP Webサイトは適用されるべきではありませんが、常にあなたのウェブサイトはできるだけ早くページを実行する必要があることに注意してください...このブロックまたはコードブロックについて常に考えて、最適化されているかどうかを確認してください。 >

  10. 開発/プロダクトパリティ:この点は、どのアプリケーション開発においても重要です。 2つのアプリケーションバージョンの間に大きなギャップがあることを決して望んでいない、またはアップグレードが面倒になることがあります。さらに、クライアント固有のバージョンのアプリを決して作成しないでください。

  11. テンプレートレベルでアプリケーションを設定/カスタマイズできるようにする方法を常に見つけてください。

  12. ログ:ログは常に良いことですが、画面に出力することなくコードの処理を続けることができます。私のお気に入りの戦術は、Linuxコンソールの中で "tail -f logfile"を実行して、自分のコードを実行しているときに何が起きているのか見てみましょう。

  13. 管理プロセス:PHPではプロセスはありませんが、ユーザー名とパスワードで保護できるページがあります。 >

2
追加された
読みやすくするためにフォーマットを変更できますか?素晴らしいthouroughの答え。
追加された 著者 Naoise Golden,
私は7年前にこの記事を参考にしてはいけないと書いています...コーディングの世界は大きく進化しており、これはもはや必ずしも真実ではありません...
追加された 著者 Mathieu Dumoulin,
答えのいくつかは、マチューがこの記事を理解して読まなかったことを明らかにする。たとえば:「#6/7を読むと、ウェブサイトが12要素のアプリにならないことを理解できます。」それは本当ではない、彼らはWebサーバーがアプリの一部でなければならないと言っている...
追加された 著者 Jeremy Logan,
#5 "貧しいアドバイス"への答えを呼び出すのはなぜそうするのですか?あなたは説得力のある議論をしていますか?
追加された 著者 Jay Godse,
#7ポートバインディングの場合。 Apacheでmod_phpを実行している場合は意味がありません。しかし、PHPをFastCGIとして使用する場合(例: PHP-FPM )、PHP-FPMを localhost:9000 のようなポートです。この場合、ApacheまたはNginxはPHPリクエストをそのPHP-FPMインスタンスに転送します。
追加された 著者 Shane Stillwell,
#5へのあなたの答えは貧弱なアドバイスです。 Webアプリケーションには、間違いなくビルド、リリース、実行プロセスが必要です。
追加された 著者 Travis,

PHPの例がいくつかありますが、そのうちのいくつかは12要素の概念の否定的なように思えますが、読んでから変更されている可能性があります。

通常のmod_phpサイトが12因子に違反する方法の1つは、 VII。ポートバインディング。マニフェストから:

12要素のアプリケーションは完全に自己完結しており、実行環境へのWebサーバーのランタイムインジェクションに依存せず、Web対面サービスを作成します。 Webアプリケーションは、ポートにバインドし、そのポートに入ってくるリクエストをリッスンすることで、HTTPをサービスとしてエクスポートします。

しかし、apache/phpは次のようなものでこの世界観に詰め込むことができます:

https://gist.github.com/1398498

完璧ではありませんが、ほとんどの部分で機能します。それをテストするには、foremanをインストールします。

gem install foreman

要点を複製したディレクトリで実行してください:

foreman start

訪問する

http:// localhost:5000/foo

2
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com