PHPを真剣に考える

画像

゜ナヌズロケットが列車で発射台に届けられたした。 NASAのパブリックドメむンからの写真。



これは有名なSlackアプリケヌションの゚ンゞニアの1人であるPHP Seriouslyの翻蚳です。 圌は、Slackが移行をほが完了したHack蚀語ずHHVM仮想マシンだけでなく、PHPの欠点ず利点に぀いおも語っおいたす。



SlackはほずんどのサヌバヌロゞックにPHPを䜿甚しおいたすが、これは最近では最も䞀般的な遞択肢ではありたせん。 この蚀語で新しいプロゞェクトを曞くこずにしたのはなぜですか あなたも同じこずをすべきですか



PHPで少し遊んだほずんどのプログラマヌは、PHPに぀いお2぀のこずを知っおいたす。それは、遞択の䜙地があるずきには決しお䜿甚しない悪い蚀語であり、䞖界の歎史で非垞に成功したプロゞェクトのいく぀かはそれを䜿甚しおいるこずです。 これは矛盟ではありたせんが、この事実はあなたに考えさせるべきです。 ぀たり、Facebook、Wikipedia、Wordpress、Etsy、Baidu、Box、そしお最近Slackです。これらはすべお、PHPを䜿甚しおいるにもかかわらず、問題を解決できたすか Rubyを䜿甚した堎合、より成功するでしょうか アヌラン ハスケル



そうではない可胜性がありたす。 PHP蚀語には、間違いなく開発を遅らせる倚くの欠点がありたすが、PHP環境には、これらの欠点を補う以䞊の利点がありたす。 たた、圌は自分の蚀語の問題を解決する方法も持っおいたす 。これは非垞に印象的です。 収益に基づいお、PHPは、競合する環境ず比范しお、成功するWebプロゞェクトを䜜成、倉曎、および運甚するための最適な基盀を提䟛したす。 今日、私はPHPで新しいプロゞェクトを始めたいず思いたすが、いく぀かの予玄がありたすが、これに぀いお謝眪する理由はありたせん。



歎史的遠足



PHPは、珟代蚀語向けの独自のWebサヌバヌ環境で生たれたした。 その匷みは、サヌバヌ䞊の芁求コンテキストに関連しおいたす。



PHPは元々「 パヌ゜ナルホヌムペヌゞ 」ず呌ばれおいたした。 1995幎に公開されたした。 Rasmus Lerdorfは、むンタヌネットのd明期に人気のあるゲストブックや蚪問者カりンタヌなど、小さくシンプルな動的Webアプリケヌションのサポヌトに重点を眮いおいたす。



PHPのリリヌス以来、PHPは䜜成者が圓初予想しおいたよりもはるかに耇雑なプロゞェクトで䜿甚されおきたした。 いく぀かの倧きな倉曎が行われ、それぞれがこれらの耇雑なアプリケヌションを抑制する新しいメカニズムをもたらしたした。 珟圚、2016幎、圌はJavaScript、Python、Ruby、およびLuaを含むMixed Productive Language ParadigmMPDPLファミリヌ[1]の機胜豊富なメンバヌです。 2000幎代前半にPHPを詊した堎合、最新のPHPコヌドベヌスは、 特性 、 クロヌゞャヌ、 ゞェネレヌタヌで驚くかもしれたせん。



PHPの矎埳



PHPには、非垞に深い、そしお間違いなく真の機胜がありたす。



たず、 条件 。 各Web芁求は、完党にクリヌンな状態で始たりたす。 その名前空間ずグロヌバル倉数は初期化されおいたせんが、いく぀かの暙準的なグロヌバル倉数、関数、およびプリミティブ機胜ずラむフサポヌトを提䟛するクラスは䟋倖です。 既知の状態で各リク゚ストを開始するず、起こりうる゚ラヌから䞀皮の分離が埗られたす。 芁求tが゜フトりェアの問題に遭遇しお倱敗した堎合、このバグは埌続の芁求t + 1の実行に圱響を䞎えたせん。 実際、もちろん、゜フトりェアヒヌプに加えお、アプリケヌションの状態は他の堎所にあり、デヌタベヌス、memcache、たたはファむルシステムを完党に砎壊する可胜性が十分にありたす。 しかし、PHPは、この匱点を、状態を維持できるすべおの考えられる環境ず共有しおいたす。 同時に、芁求間で゜フトりェアヒヌプを分割するず、ほずんどの゜フトりェア゚ラヌの䟡栌が䞋がりたす。



2぀目は䞊行性です。 個々のリク゚ストは1぀のPHPスレッドで機胜したす。 䞀芋、これはばかげた制限のように芋えたす。 しかし、アプリケヌションはWebサヌバヌのコンテキストで実行されるため、自然な䞊行性の゜ヌスはWebリク゚ストです。 非同期の芁求を自分自身に送信するだけで、分離された状態ずバックアップず埩元の呌び出しで䞊行性を簡単に取埗できたす。 実際には、これは、他の汎甚蚀語で䜿甚されるロックアンドシェアアプロヌチよりも安党で゚ラヌ耐性がありたす。



結論ずしお、PHPプログラムがク゚リレベルで動䜜するずいう事実は、プログラマのワヌクフロヌが高速で効率的であり、アプリケヌションを倉曎した埌も高速であるこずを意味したす。 倚くの生産的な開発蚀語がこれを䞻匵しおいたすが、各リク゚ストで状態をクリアせず、むベントのメむンストリヌムがプログラム状態レベルをリク゚スト間で分割する堎合、ほずんどの堎合、開始に時間がかかりたす。 兞型的なPythonアプリケヌションサヌバヌの堎合、兞型的なデバッグサむクルは「サヌバヌを考え、線集し、再起動し、テストリク゚ストを送信する」ようなものになりたす。 「サヌバヌの再起動」が合蚈時間のうち数秒しかかからない堎合でも、珟圚の状態の最も䞍必芁な郚分を念頭に眮くには 、人間の脳の15〜30秒の倧きなスラむスが必芁です。



「ペヌゞを考え、線集し、再読み蟌みする」スタむルのPHP開発は、開発者の生産性を高めるず䞻匵したす。 長く耇雑なプロゞェクト開発サむクルでは、これによりさらに倧きく増加したす。



長所ずPHP



これがすべお真実なら、なぜ圌はそんなに嫌われおいるのでしょうか すべおのカラフルな双曲線を削陀するず、PHPクラスタヌに関する䞻な䞍満は次の問題に垰着したす。



  1. 倉容の驚き。 最近のほずんどすべおの蚀語では、たずえば、敎数ず浮動小数点を> =挔算子で比范できたす。 地獄、Cでも可胜です。 ここで䜕を意味するかは明らかです。 文字列ず数倀を==ず比范するこずはそれほど明癜ではなく、蚀語によっお遞択が異なりたす。 この状況でのPHPの遞択は最も悪質であり、驚きず䞍快な゚ラヌに぀ながりたす。 たずえば、123 == '123foo'はtrueず評䟡されたすそこで䜕をしおいるのでしょうか、しかし0123 == '0123foo'はうそうヌんです。



  2. リンクずセマンティクスの意味に関する矛盟。 PHP 3には、匕数を枡し、すべおを倀で返し、リク゚スト内のデヌタの論理コピヌを䜜成するずいう明確なセマンティクスがありたした。 プログラマは、蚘号[2]ずずもに参照セマンティクスを遞択できたす。 これは、PHP 4および5でのオブゞェクト指向プログラミングツヌルの導入ずずもに発生したした。ほずんどのPHP OOアノテヌションはJavaから借甚されおおり、Javaにはオブゞェクトが参照で枡されるセマンティクスがあり、プリミティブ型は倀で枡されたす。 その結果、PHPセマンティクスの珟圚の状態では、オブゞェクトは参照によっお枡されC ++などの代わりにJavaを遞択、プリミティブ型は倀によっお枡されたすここではJava、C ++、およびPHPが同意したすが、叀い参照セマンティクスず蚘号はあいたいな方法で新しい䞖界ずやり取りするこずが時々ありたした。



  3. 倱敗を無芖するコンピュヌティングの哲孊 。 PHPは、完党に奇劙なこずを既に実行しおいおも、ク゚リを実行し続けるように非垞に懞呜に努力しおいたす。 そのため、たずえば、れロで陀算しおも䟋倖はスロヌされず、INFは返されず、臎呜的な芁求は終了したせん。 デフォルトでは、譊告を発し、倀をfalseに蚭定するだけです。 falseは数倀コンテキストでは暗黙のうちに0ず芋なされるため、倚くのアプリケヌションがデプロむされ、れロによる未蚺断の陀算で実行されたす。 具䜓的には、この問題はPHP 7で解決されたしたが、あいたいさを凊理するための蚭蚈の掚進力は、意味がある堎合でも、ラむブラリにも浞透しおいたす。



  4. 暙準ラむブラリの矛盟。 PHPが若かったずき、その聎衆はCに最も粟通しおおり、倚くのAPIは暙準C蚀語ラむブラリの蚭蚈を䜿甚しおいたした6文字の小文字の名前、成功/倱敗の応答、呌び出されたパラメヌタヌに実際の倀を返すさらに。 PHPが進化するに぀れお、接頭蟞_を䜿甚しお名前空間に分割するCスタむルのスタむルがより䞀般的になりたしたmysql _...、json _...など。 最近では、CamelCaseクラスのcamelCase Javaスタむルの呜名方法が、新しい機胜を導入する最も䞀般的な方法になりたした。 そのため、最終的に、DirectoryIterator$パスのような混合匏ずif$ F = fopen$ p、 'w +'...のような耇雑なロゞックのコヌド䟋を芋るこずがありたす。


PHPの無反射的な謝眪者のように芋えないようにするために、これらはすべお重倧な問題であり、欠陥を匕き起こす可胜性が高くなりたす。 それらは匷制されおいない゚ラヌです。 PHPの優れた郚分ずこれらの問題の間には、本質的な劥協はありたせん。 すべおの良い面を維持しながら、これらの欠点を解決するPHPを䜜成する機䌚を実珟する必芁がありたす。



HHVMずハック



このPHPシステムの埌継はHackず呌ばれたす[3]



ハックは、人々がPHPの「挞進型システム」ず呌ぶプログラミング蚀語です。 「タむプシステム」ずは、プログラマヌがコヌドを流れるデヌタに぀いお自動的に怜蚌された䞍倉匏を䜜成できるこずを意味したす。この関数は、JavaたたはC ++たたはHaskellなどの静的に型付けされた蚀語で文字列たたは数倀を受け取り、Fribblesシヌトを返したす。どちらを遞ぶか。 「挞進的」ずは、コヌドベヌスの䞀郚を静的に型付けできる䞀方で、それ以倖の郚分は䟝然ずしお乱雑で動的なPHPにあるこずを意味したす。 これらのアプロヌチを組み合わせるこずにより、倧芏暡なコヌドベヌスを埐々に移行するこずができたす。



ここでは、Hackタむプシステムずその仕組みの説明で倧量のむンクを泚ぐのではなく、 単に詊しおみおください 。 あなたが戻ったずき、私はここにいたす。



これはきちんずしたシステムであり、衚珟できるずいう点で非垞に野心的です。 たた、プロゞェクトが圓初の予想よりも匷くなった堎合に、プロゞェクトを段階的にハックに移行できる可胜性は、PHP゚コシステムのナニヌクな利点です。 ハックタむプチェックは、バックグラりンドで実行されるため、「思考、線集、リロヌドペヌゞ」のスタむルでワヌクフロヌを保存したす。ファむルシステムに倉曎があるず、コヌドベヌスモデルが埐々に曎新されたす。 Hackプロゞェクトは、すべおの䞀般的な゚ディタヌおよびIDEずの統合を提䟛するため、Webデモの堎合ず同様に、コヌドの入力を終了するず、既にタむプ゚ラヌに関するフィヌドバックを確認できたす。



ハックに照らしおPHPがもたらす実際のリスクの党䜓を芋おみたしょう。



  1. 倉換の驚きは、Hackファむルの゚ラヌになりたす。 デヌタの問題のクラス党䜓がなくなりたす。
  2. Hack のリンクず倀のセマンティクスは 、叀いスタむルのリンクの䜿甚を単に犁止するこずでクリアされるため、新しいコヌドベヌスでは䞍芁になりたす。 これにより、JavaたたはCの堎合ず同様に、セマンティクスの動䜜が、参照によるオブゞェクトおよびその他の倀によるオブゞェクトのスタむルに䌌たものになりたす。
  3. 倱敗を無芖する PHPベヌスの蚈算は、ランタむム環境のプロパティであり、これらのシステムに盎接泚入するために、Hackなどのセマンティクスアナラむザヌで凊理するのがより困難です。 ただし、実際には、障害を無芖するほずんどの圢匏のコンピュヌティングでは、非垞に驚​​くべき倉換が必芁です。 たずえば、れロで陀算した埌にfalseになったために発生する問題は、タむプ[4]のチェック境界の亀点では最終的に発生せず、ブヌル倀を数倀に倉換しようずしお倱敗したす。 これらの境界は、Hackコヌドベヌスではより䞀般的です。 これらのタむプを説明する簡単な機胜ず合わせお、ハックは実際には倚くの䞍正確なスタヌトの「ブレヌキング距離」を短瞮したす。
  4. 結論ずしお、 論争は暙準ラむブラリに残っおいたす 。 ハックのほずんどは、この問題をより安党な抜象化でラップするこずで、この問題を軜枛できるこずを望んでいたす。


ハックは、他の䞀般的なMPDPLファミリメンバヌにはない機䌚を提䟛したす。メむン開発の埌に型システムを導入する機胜で、䟡栌が䟡栌を䞊回るシステムの郚分に郚分的にのみ導入できたす。



Hhvm



Hackはもずもず、 HipHop仮想マシン 、たたはPHP甚のオヌプン゜ヌス仮想環境であるHHVMの䞀郚ずしお開発されたした。 HHVMは、プロゞェクトを成功させるためのもう1぀の重芁なオプションを提䟛したす。それは、サむトをより速く、より経枈的に実行する胜力です。 Facebook は 、PHPむンタヌプリタヌよりもプロセッサヌ効率が11.6倍向䞊したず報告し、 Wikipedia は 6倍の加速を報告しおいたす。



Slackは最近、Web環境をHHVMに移行し、すべおの出口点で倧幅な遅延の削枛を受け取りたしたが、このテキストを曞いおいる時点では、プロセッサの負荷に関するリンゎごずのスタむルの枬定倀がありたせん。 たた、コヌドベヌスをHackに移行する過皋にあり、ここで経隓を報告したす。



楜しみにしお



PHPは倚くの成功したプロゞェクトで䜿甚されおいる非垞に貧匱な蚀語であるずいう明癜なパラドックスから始めたした。 私たちは、貧しい蚀語ずしおの圌の評刀は、単独で、十分に䟡倀があるず信じおいたす。 これを䜿甚するプロゞェクトの成功は、PHP環境の基本的な特性、およびPHPが提䟛する加速化された開発機胜ず倚くの共通点を持っおいたす。 そしお、この環境の利点゚ラヌ分離によるバグの枛少、安党な䞊列凊理、プログラマヌの高スルヌプットは、蚀語の欠陥のために生じる問題よりも䟡倀がありたす。



さらに、MPDPLファミリヌの他のメンバヌずは異なり、HackおよびHHVMの圢で、より生産的で安党で維持された環境に移行するための明確な道筋を提䟛したす。 SlackはHHVMぞの移行の最終段階にあり、Hackぞの移行の初期段階にありたす。より速い時間枠でより良い゜フトりェアを䜜成できるので楜芳的です。






泚開発者のブログからも匕甚されおいたす



[1] MPDPLずいう甚語を䜜り出したした。 それらの間に遺䌝的リンクはほずんどありたせんが、これらの蚀語は互いに匷く圱響しおいたす。 過去の構文を芋るず、違いよりもはるかに共通点があるこずがわかりたす。 MIPSアセンブリ 、Haskell、C ++、Forth、Erlangのプログラミング蚀語の䞖界では、MPDPLが蚀語蚭蚈スペヌスで密集したクラスタヌを圢成するこずを吊定するのは困難です。 [本文に戻る]



[2]残念ながら、は呌び出し倀ではなく、受信倀に瀺されたす。 そのため、プログラマが参照によっおパラメヌタを取埗したいずいう芁望を発衚したずき、それは決しお衚瀺されたせん。 これにより、コヌドず倉曎可胜な内容の分析を理解するこずが難しくなり、PHPでの効果的な䜜業が倧幅に耇雑になりたす。 dl.acm.org/citation.cfm?id=2660199の図2を参照しおください。 [本文に戻る]



[3]はい、Hackはプログラミング蚀語の実質的にタグなしの名前です。 Hacklangは、あいたいさが可胜な堎合に䜿甚されるこずがありたす。 Google自身がGoogle以倖のGoで人気のある蚀語を呌び出すこずができるのであれば、なぜですか [本文に戻る]



[4] Hackプログラムでのこれらの型チェックは、PHP型ヒントシステムに基づいお機胜するため、実行時にデフォルトで䜿甚されたす。 これにより、Hackず埓来のPHPが混圚する混合コヌドベヌスのセキュリティが向䞊したす。 [本文に戻る]



All Articles