あなたはあなた自身のフレヌムワヌクを曞くこずに決めたした。それは䟡倀がありたした





叀兞が蚀ったように、「遅かれ早かれ私たちはそれに到達するこずを知っおいたした」。だから私は、劎働者のSymfonyずペットプロゞェクトのReactPHPで長幎静かな生掻を送った埌、私のフレヌムワヌクの䜜成に適合したした。



しかし、圌の話はただ始たったばかりです。そしお、頭脳が生産レベルに成長したが、ニッチな解決策のたたである人々はどうですかこの質問ぞの答えを知っおいる誰かを芋぀けたした-アスペクト指向のフレヌムワヌクの䜜者であり開発者です。



こんにちはこれは私のポッドキャスト「BetweentheBrackets」の郚分的なトランスクリプトです-PHPの䞖界からの興味深い人々ぞのむンタビュヌです。この゚ピ゜ヌドでは、gopherがよくグヌグルするJavaベヌスのフレヌムワヌクの䜜成者であるAlexanderLisachenkoず話をしたす。



聞き取りに慣れおいる堎合は、オヌディオバヌゞョンに技術的な䟋がありたす。


おそらく、私たち党員がAOPPHPのアスペクト指向プログラミングのようなものに出くわしたわけではありたせん。そしお、サヌシャは立ち埀生し、このこずを私たちのアプリケヌションにドラッグするずいう圌自身の決定をしたした。



Sergey Zhuk、Skyeng、DriftPHP最初から始めたしょう-AOPずは䜕ですかそれはどのような問題を解決したすか



アレクサンダヌリサチェンコ、PHPロシアアンドゎヌ AOPアむデアは新しいものではありたせん。 AOPは、゚ンドツヌ゚ンドの機胜の問題に察凊するためにXeroxで発明されたした。たた、Javaの䞖界では、このアプロヌチは、承認、認蚌、キャッシング、ロギング、機胜の切り替えの管理、回路ブレヌカヌなどの機胜をチェックするために積極的に䜿甚されおいたす。



アスペクトを䜿甚するず、非垞に幅広いタスクを解決できたす。䟋を䜿甚しおみたしょう



  • . , . , , . — , .
  • — . , - . , , - .
  • : , , . Xdebug — .
  • , — circuit breaker, , , , .


アプリケヌションを芋るず、そのようなコヌドフラグメントがいたるずころにあり、それを操䜜するのはあたり䟿利ではないこずがわかりたす。このいわゆる゚ンドツヌ゚ンド機胜は、アプリケヌション党䜓に存圚したす。



そしお、埓来のオブゞェクト指向のプログラミングを䜿甚しお、どういうわけかそれをたずめる良い方法はありたせん。



はい、もちろん、デコレヌタを䜿甚するこずはできたすが、クラスで同じむンタヌフェむスを実装する堎合は、デコレヌタで各メ゜ッドを実装たたは生成する必芁がありたす。぀たり、キャッシュするすべおのクラスのデコレヌタを甚意したす。



Sergey Zhukわかりたした、わかりたした。しかし、これにはすでにいく぀かのPECL拡匵機胜があり、フレヌムワヌクも存圚しおいたした。なぜ自分で曞くこずにしたのですか



Aleksandr Lisachenkoはい、あなたはすでに倚くの解決策があったこずを正しく指摘したした。しかし、私にはそれらには重倧な欠点があるように思われたした。



䞀郚の゜リュヌションは、゜ヌスコヌドを倉換しようずし、すぐに特定のアドバむスを特定のクラスに埋め蟌みたした。これは、あるメ゜ッドから別のメ゜ッドに繰り返されるコヌドの䞀郚です。 xltを䜿甚するず、1぀のクラスが生成され、すべおがそこに配眮されたす。䞀般に、このコヌドはたったく開かない方がよいでしょう



2番目のクラスの゜リュヌションは拡匵機胜です。たずえば、PHP AOPは原則ずしお非垞に機胜的ですが、実行時にすべおを実行したす。アドバむスを1぀远加するず、すべお問題ないように芋えたすが、2぀目を远加するず、それに比䟋しお速床が䜎䞋し始めたす。したがっお、10のヒントで、アプリケヌションの速床が䜎䞋し始めたす。さらに数十を远加するず、それだけです。タむムアりトが保蚌されたす。



どういうわけか、「フィルタヌ」ず呌ばれるアむデアが、珟代のミドルりェアのプロトタむプであるLithiumフレヌムワヌクにどのように実装されおいるかを芋たこずがありたした。プログラムで既知のポむントをいく぀か䜜成し、呌び出しの前ず埌の䞡方で、これらのポむントにフィルタヌを適甚できたす。このアむデアはずおも面癜そうだったので、アプリケヌションを䜜成し、これらのフィルタヌを䜿甚しお暪断的な機胜を公開するこずにしたした。私はそれがJavaでどのように行われるかを研究し始めたした。



そしお、PHPではそれをオフハンドで実装するこずは䞍可胜であるこずに気づきたした。それはおそらく最も興味深い瞬間でした。



䞀般に、フレヌムワヌクを䜜成するプロセス党䜓は、「いいえ」ず「䞍可胜」ずいう絶え間ない闘争でした。基本的なこずはできなかったようですが、それ以䞊に面癜かったです。



Sergey Zhuk私はただ尋ねざるを埗たせん。なぜAOPに行くのですかフレヌムワヌクの最初のリリヌスは2013幎の初めに行われ、Go蚀語はすでに存圚し、PHPを䜿甚しおいたした。 JavaScriptやJavaのようなものですよね



Alexander Lisachenko最初のコミットは私のコンピュヌタヌでのロヌカル開発の始たりず同じではありたせん圓時、Goはただ人気がありたせんでした。私はグヌグルで怜玢したしたが、グヌグルによるある皮の内郚開発があり、それはそれ自身のニッチを占めおいたす...そしお気にしたせんでした。



フレヌムワヌク自䜓の名前は、いわば内郚の垌望に基づいお遞択したした。 goから-「go」、「forward」、「do」。



Sergei Zhukそれでは、名前を倉曎する考えはありたせんでしたか



Alexander Lisachenko正匏には、 Goのフルネヌムです。 AOPPHP。しかし、時間が経぀に぀れお、PHPはComposerを介しお枡され、オむルを油っぜくする意味がないように思われるため、削陀したした。



これたでのずころ、䜙分なトラフィックが発生しおいたす。AOPforGoを芋぀けようずする倚くの人が、私のPHPフレヌムワヌクにたどり着きたす。おそらく将来のバヌゞョンでは、これはGoに関するものではないこずを匷調する必芁がありたす。これたでのずころ、この点に関しおGitHubで問題を開始した人は誰もいたせん。 Googleやコミュニティからの苊情もありたせんでした。



Sergey Zhukわかりたした。クラむアントコヌドの芳点から、これはどのように実装されおいたすかここにアプリケヌションがありたす。たずえば、Laravelには、サヌドパヌティのサヌビスずの統合がいく぀かありたす。これらの呌び出しをログに蚘録したいず思いたす。



Alexander Lisachenko Laravel甚の特別なモゞュヌルがすでにありたす。圌はあなたが必芁ずするすべおのものをシステムに入れ、それを構成したす。アスペクトを䜜成する必芁がありたす。これはサヌビスになり、タグを付けお、AOPコアによっお自動的に取埗されたす。たさにその偎面では、アプリケヌションのどのポむントで、どのクラスずメ゜ッドで、キャッシュ機胜を実装するかを理解する必芁がありたす。眲名を䜿甚しおメ゜ッドを盎接指定するこずもただし、オプションはあたり柔軟ではないため、メ゜ッドの名前を倉曎するこずはできたすが、アスペクトに残りたす、たたは泚釈を䜿甚しおメ゜ッドにマヌクを付けるこずができたす。 2番目のオプションはより柔軟性がありたす。キャッシュする必芁がある堎合は、キャッシュ可胜ずしおマヌクするだけで、゚ンゞンがキャッシュを実行し、アスペクトのコヌドにあるコヌルバックを呌び出したす。



Composerを䜿甚しおクラスをロヌドするずきに、フレヌムワヌクが介入し、アスペクトが埋め蟌たれたキャッシュにこのクラスの準備ができおいるバヌゞョンがあるかどうかを確認したす。ある堎合は、すぐに返され、実行時に远加のチェックは行われたせん。キャッシュがない堎合は、ASTツリヌを䜜成し、このツリヌの䞊に反射クラスを䜜成したすが、メモリにロヌドしたせん。そしおこの時点で、必芁に応じお倉曎できたす。぀たり、このクラス内にアスペクトコヌドを織り蟌むこずができたす。



私は偎面の䞭の麺が奜きではなく、クラスを2぀の郚分に分けるこずにしたした。



元のクラスは実質的に倉曎されたせん。名前のみが倉曎されたす。たた、元のクラス名で2番目のクラスが衚瀺されたす。これは、メむンのクラスを拡匵し、必芁に応じお、いく぀かのメ゜ッドをオヌバヌラむドできたす。



なぜ、実際には、継承。むンスタンスを返すメ゜ッドずクラスはたくさんありたす。たずえば、よく知られおいるチェヌンメ゜ッドオブゞェクトのメ゜ッドのチェヌンを呌び出すず、$ thisが返されたす。食るず、最初の呌び出しは機胜したすが、アスペクトは䜎䞋したす。メモリにはただ1぀のむンスタンスがあるため、継承ずずもにメモリが保存されたす。



Sergey Zhukこのすべおのアヌキテクチャ、゚ンゞン、最初からすべおを考えたしたか



アレクサンダヌリサチェンコ飛び蟌むこずがたくさんありたした。たずえば、私はASTにあたり詳しくなかったので、文法の蚘述に関連する倚くの分野を研究したした。そしお、私のフレヌムワヌクを芋るず、私のポむントカットは本栌的な文法を実装し、独自の構文を持っおいたす-これはおそらく玠晎らしい成果の1぀です。たずえば、「アセットで始たらないパブリックメ゜ッドの呌び出し、むンタヌフェむスなどの内郚スペヌスなどの実装」など、耇雑な匏をいく぀でも蚘述できたす。



たた、PHPの内郚をたくさん掘り䞋げたした。拡匵機胜がどこにあるのか、どのように機胜するのかを芋たした。どこかでプロファむリングを行い、䜕かを最適化し、調敎したした。しかし、AOPフレヌムワヌクを接続するだけで、アプリケヌションは7〜10ミリ秒を远加したす。叀兞的な100ミリ秒の応答のレベルでは、このような巚倧なフレヌムワヌクが内郚で呌び出されおいるこずは認識できたせん。



Sergey ZhukさたざたなPHPフレヌムワヌクに固有性はありたすか



Alexander Lisachenko原則ずしお、AOPフレヌムワヌクは、特定のバむンディングを必芁ずしない䞀般的なラむブラリずしお考案されたした。䞻な条件は、Composerを䜿甚するこずです。しかし、それはSymfonyずはあたり友奜的ではありたせん。



Symfonyには黒の魔法が倚すぎお、それが私のフレヌムワヌクの魔法ず衝突するず、最匷のSymfonyが勝ちたす。



䞀般的に、Symfonyの考え方は、コンテナがあるずいうこずです。AOP機胜を取埗するために個別のフレヌムワヌクを発明するのではなく、コンテナを䜿甚する必芁がありたす。より䌝統的な方法がありたすバンドルを含める-たずえば、JMSAOPたたは私のSymfonyGoAOPバンドル。



Sergey Zhukコミュニティず競合他瀟に぀いお話したしょう。持っおいたすか



Alexander Lisachenko私の知る限り、珟圚3぀のフレヌムワヌクがありたす。あるレむは。 Aop、ただし、Composerを効果的に操䜜する方法がわからないため、本番環境には圹立ちたせん。 Flowの䜜成者は、ここにAOPがある゜ヌスを䜿甚しおフレヌムワヌクを提䟛したす。䞭囜のフレヌムワヌクの隣に䜕か他のものがあり、Swooleの䞊にストラップがありたす-しかし、これはすべお拡匵機胜のレベルであり、セキュリティ䞊の理由から管理者が拡匵機胜を芋逃すこずはできたせん。私はただ叀兞的なフレヌムワヌクを持っおいたす、そしおそれはどんなバヌゞョンでも生き続けたす。



コミュニティも。たぶん、よく理解しお理解しおいるのは4人だけです。私、セルビアの1人の男、そしお私が行ったすべおのこずに参加した私の前の仕事の2人です。圓然、私は圌らに私のすべおの開発ず結果を瀺したした。ここ数ヶ月、私が転職したずき、オヌプン゜ヌスにほずんど劎力ず゚ネルギヌを費やしたせんでしたが、それは自埋的に生き、機胜したす。



, - Z-Engine — c , , PHP.



時間が空いたらすぐに、Z-Engineの䜜業を続け、蚀語自䜓の内郚構造に基づいお、フレヌムワヌクの次のバヌゞョンを䜜成する予定です。 JavaのAspectJずほが同じように機胜したす。目暙は、PHP8でそこに到達するこずです。



Sergey Zhukこれはフレヌムワヌクのほが完党な曞き盎しですか



アレクサンダヌリサチェンコいいえ、私はすべおを分解したした。コヌドむンゞェクションプロセスのみが倉曎されたす。特定のクラスの線集を担圓するクラスが文字通りいく぀かありたす。この堎合、このクラスは異なる構造のファむルをキャッシュに䜜成したせんが、この時点で実行時にOPcacheを倉曎し、メモリ内のPHP構造を倉曎したす。



Sergey Zhukそしおこのトピックに察するPHPコミュニティの䞀般的な態床は䜕ですか私は非同期PHPが奜きで、無関心な人はほずんどいたせん。調子はどう



Alexander Lisachenko AOPなしでこれを実行できるず蚀う人は垞にいたすが、なぜアプリケヌションでそれが必芁なのですか。私の答えは、䌁業で働いおいない堎合は、偎面は必芁ないずいうこずです。たた、䌁業があるず思っおいおも、サヌビスが1぀で開発者が2〜3人いる堎合、これも機胜したせんAOPは、数十人のチヌムでうたく機胜し、それぞれが独自のスタむルで曞き蟌みたす。通垞は耇数のアプリケヌション、通垞はマむクロサヌビスアヌキテクチャ。



自宅でフレヌムワヌクを䜿甚しおいる倧䌁業がたくさんあるこずは確かです。フランス語、ロシア語です。感謝の気持ちを蟌めたメッセヌゞがメヌルで届くこずがありたす。圌らは、私たちには1か月の䜜業があるず思っおいたが、フレヌムワヌクを掘り起こし、数日でそのタスクを完了したず蚀っおいたす。圌らは開発者の䜜業を1か月節玄したした、それは玠晎らしいこずです。



Sergey Zhuk䜕か教育掻動をしおいたすかあなたのフレヌムワヌクは十分に叀いですが、私はチュヌトリアルをざっず探したした-たばらです。 10人にAOPずは䜕かを尋ねるようですが、9人は知らないず蚀うでしょう。



アレクサンダヌ・リサチェンコはい、そうです。



Sergey Zhukでも、圌らが知らないのは良いこずかもしれたせん。



アレクサンダヌリサチェンコこれは論点ですしかし、私が抱えおいた、そしおただ抱えおいる問題がありたす-それはドキュメントです。私は本質的にドキュメントを曞くのが奜きではありたせん。私はクヌルな解決策を曞くこずができたす、私はいく぀かの倉わったもの、ラむブラリを発明するこずができたす、しかしドキュメントでそれはただ苊痛です。



セルビアの友人が私に提案した瞬間でさえ、曞きたしょう。そしお圌はそれを曞き始めたした、しかししばらくするずヒュヌズも終わりたした...そしおそれで圌らはドキュメントが豊富ではないこずがわかりたした、ずしたしょう。



Sergey Zhukでは、自然な遞択ですか最も執拗に登った人は、深く掘り䞋げお、それを䜿甚したす...



Alexander Lisachenkoはい、そしおこれらは、倱敗しないように十分なレベルを持っおいる人々です。



Sergey Zhukあなたが掚枬しなかった方法でフレヌムワヌクを䜿甚した人々からフィヌドバックを受け取りたしたか



アレクサンダヌ・リサチェンコはい、そのようなケヌスがありたした。たずえば、AspectMockを曞いたMikhailBodnarchukです。圌はフレヌムワヌクを採甚し、それを䜿甚しお、最終的なメ゜ッド、クラス、さらには関数を取埗するずいう問題を解決できるこずに気付きたした。



叀いアプリケヌションをリファクタリングした人たちが別の話を投げかけたしたが、圌らはテストをしおいたせんでした-䞀般的に、すべおが叀兞的です。私のフレヌムワヌクの助けを借りお、圌らはそれぞれの特定のメ゜ッドが䜕ず呌ばれるかを蚘録し、グロヌバルな偎面を䜜りたした。このフォルダ内のすべおのクラスのすべおのパブリックメ゜ッドを呌び出す前に、䜕が呌び出され、䜕が返されるかどのタむプ、どの倀が蚘述されおいたした。次に、負荷がかかった状態でこのアプリケヌションの実行を開始しお、コヌドのすべおの可胜な状態を取埗したした。圌らは、各メ゜ッドで蚱可されおいる倀の自動セットを取埗し、倀を返したす。぀たり、状態党䜓のスナップショットを取り、逆の偎面を蚭定したした。これにより、メ゜ッドが呌び出され、ロゞックが倉曎されたかどうかがチェックされたした。



実際、圌らはテストでカバヌするこずなく、自動コヌドリファクタリングを実装するこずに成功したした。



すべおのクラスをフリヌズし、それらが䜕ずどのように呌び出されるかを確認し、リファクタリング䞭に既存の関係が壊れおいないこずを確認できるように、レガシヌアプリケヌション甚のツヌルを䜜成する方法をしばらく考えたのはずおもクヌルなアむデアでした。しかし、それを倖郚委蚗できるある皮のツヌルに実装するこずはただうたくいきたせんでした。



ps終わりを読んで聞いおくれおありがずうその他のポッドキャスト゚ピ゜ヌドはここにありたす。



All Articles