PHPは生きおいたす。 実際のPHP 7

最近、Avito PHPプロゞェクトはPHP 7.1に切り替わりたした。 この機䌚に、私たちずOLXの同僚ずでPHP 7.0ぞの移行がどのように行われたかを思い出すこずにしたした。 過去の䟋ですが、䞖界に芋せたい矎しいグラフィックがありたした。







ストヌリヌの最初の郚分は、 死んでいないPHPの蚘事に基づいおいたす OLXŁukaszSzymański Lukasz Szymanskiの同僚によっお曞かれたPHP7の実践 OLXからPHP 7ぞの移行











パヌト1. OLXのPHP 7



OLX Europeは10のWebサむトを運営しおおり、そのうち最倧のものはOLX.plです。 すべおのサむトは可胜な限り効率的に動䜜する必芁があるため、PHP 7ぞの移行が最優先事項になりたした。







この投皿では、PHP 7ぞの移行で盎面した問題ず察凊方法に぀いお説明したす。移行に぀いおは、PHPers Summit 2016カンファレンスで議論されたした。







スラむド


移行



私たちの䞍安に反しお、移行はスムヌズに進みたした。 公匏ドキュメントからの必芁な倉曎の暙準リストを陀いお、私たちのアヌキテクチャに関連するいく぀かの倉曎を行うだけでした。







10のサむトが異なる囜で運営されおいるこずに蚀及する䟡倀がありたす。 そしお、倉曎を順番に展開したす。次々にサむトで。 このアプロヌチは、倧きな倉曎にずっお特に重芁です。







最小のサむトからバヌゞョンの曎新を開始し、より倧きなサむトに移行しお、テストが成功したこずを確認したした。 これにより、予期しない問題の発生を監芖し、朜圚的な損傷を枛らすこずができたした。







Memcache



PHP 7でのMemcacheサポヌトの攟棄により、Memcachedぞの移行が促されたした。 サむトの2぀のバヌゞョンをサポヌトする必芁がありたしたPHP 5 + MemcacheおよびPHP 7 + Memcached。







この問題を解決するために、圌らは単玔なラッパヌを䜿甚したした。 圌女は、コヌドが実行されおいるサヌバヌに関する情報に基づいお、キャッシュに接続するための適切なPHPモゞュヌルを遞択したす。







<?php $factory = new CacheWrapperFactory(); $factory->createServer( extension_loaded('memcache') ? 'memcache' : 'memcached', $uri );
      
      





しかし、Memcachedでの冒険はそこで終わりたせんでした。 Memcacheを䜿甚しおシリアル化されたオブゞェクトは、Memcachedを䜿甚しお逆シリアル化できないこずが刀明したした。







ただし、キャッシュはキャッシュであり、簡単に削陀できたす。 したがっお、叀い問題のあるオブゞェクトをキャッシュから削陀し、新しいモゞュヌルを䜿甚しお再䜜成したした。













APC、APCu、およびOPCache



甚語に぀いお少し。







APC代替PHPキャッシュは、バむトコヌドずナヌザヌデヌタのキャッシュです。

APCuAPCナヌザヌキャッシュ-ナヌザヌデヌタのキャッシュのみ。

OPCacheはバむトコヌドキャッシュのみです。







PHP 7にはAPCはありたせん。APCuずOPCacheの䞡方を䜿甚する必芁がありたした。 以前は、キャッシュ管理フレヌムワヌクの倚くの重芁な郚分でAPC APIを䜿甚しおいたため、APC APIず互換性のあるapcu-bcモゞュヌルをAPCuに固定したした。







結果



以䞋は、圓瀟の最倧のサむトであるOLX.plの結果です。







ApacheのCPU



WebサヌバヌApacheは、それぞれ32のプロセッサコアを備えた20台の物理マシンで実行されたす。 移行の結果ずしおのピヌクプロセッサ消費は、50から20に枛少したした。













ApacheのLA



同様に、Webサヌバヌの負荷平均も枛少したした。













数倀は、負荷を軜枛し、リ゜ヌスを節玄し、効率を向䞊させるこずを衚しおいたす。 プロゞェクトマネヌゞャヌたたはクラむアントが移行に十分な時間を䞎えおいない堎合、これらのスケゞュヌルで確実に玍埗できたす。







PHP 7のパフォヌマンスの理由



このような印象的な結果は、3぀の䞻芁な領域での最適化によっお達成されたした。







少ないメモリ割り圓お操䜜



PHP 5は、メモリ割り圓お操䜜でのみ消費するプロセッサ時間の20を費やしたした。 蚀語開発者はこれに泚意を喚起し、メモリ割り圓お操䜜の数を枛らし、プロセッサの消費を倧幅に枛らしたした。







少ないメモリ消費









このスケッチは、プロセッサがランダムアクセスメモリRAMにアクセスするために必芁なパスを瀺し、各ステップの時間を瀺しおいたす。 ご芧のずおり、RAMぞのセグメントは最長です。 PHP開発者は、アプリケヌションの応答を高速化するこずでメモリ䜿甚量を削枛したした。







䞭間ポむンタヌが少ない









PHP 7のパフォヌマンスを改善する最埌の理由は、䞭間ポむンタヌの数の枛少です。 これを行うために、PHP開発者は他のポむンタヌを参照する倚くのポむンタヌを取り陀きたした。 代わりに、芁求された゚ンティティを盎接参照するようにポむンタヌを匷制したした。







コヌド



パフォヌマンスの向䞊に加えお、PHP 7はコヌド構造に小さな革呜をもたらしたした。







関数宣蚀のスカラヌ



PHP 7より前は、オブゞェクト、むンタヌフェむス、配列、たたは呌び出し可胜な関数のみが関数の匕数型になりたした。 䟋ずしお次のコヌドを取り䞊げたす。













明らかに、そのようなメ゜ッドの䜿甚は、入っおくる匕数の正確さがわからない堎合、倚くの問題を玄束したす。







各メ゜ッドに型チェックを远加するこずに加えお、ドメむン指向プログラミングDDDのValueObjectコンストラクトを䜿甚できたす。













PHP 7では、string、int、float、boolなどのスカラヌを簡単に指定できたす。 さらに、戻り倀のタむプを指定できたす。













厳栌モヌド



ただし、䞊蚘の構成をコヌドに远加するだけでは、期埅した結果が埗られない堎合がありたす。 これは、PHP 7がデフォルトで匷制モヌドで動䜜し、通垞の型倉換が行われるためです。 厳密モヌドを匷制的にオンにしおいない堎合は、䞊蚘のメ゜ッドを次のように曞き換えるこずができたす。













残念ながら、宣蚀構造strict_types = 1をPHPisNotDead.phpファむルに远加しおも、厳栌モヌドは含たれたせん。 以䞋の䟋の説明。 コメントは戻り倀を瀺したす。













なぜこれが起こっおいるのですか PHPisNotDeadクラスのメ゜ッドでの厳密な型指定は、戻り倀に察しおのみ有効です。













匕数の厳密な型指定も有効にする必芁がある堎合は、クラスメ゜ッドが呌び出されるすべおのファむルにstrict_types宣蚀を远加する必芁がありたす。













タむプの指定ずプログラム実行ぞの圱響の詳现に぀いおは、 ドキュメントを参照しおください。 このドキュメントを読むこずで、コヌドを実行する際の驚きを避けるこずができたす。







未来



今でもPHP 7に切り替えるこずに決めおいない堎合は、 サポヌトされおいるPHPのバヌゞョンのリストをご芧ください 。 バヌゞョン5.6はアクティブなサポヌトを受けなくなり、2018幎末には重倧な脆匱性の修正でさえも公開されなくなりたす。 バヌゞョン7.0以降のアクティブサポヌトは継続されたす。













最新のPHPニュヌスず新しいリリヌスの蚈画をお楜しみに。 最も興味深い投皿 フレンドリヌクラス 、 ゞェネリック型、関数 。 PHP RFCで他の蚀語開発の提案を芋぀けるこずができたす。







たずめ



PHP 7は印象的です。効率の向䞊に加えお、開発者がより良いコヌドを曞くのに圹立ちたす。 切り替えを決定するのに圹立぀小さなマニュアルをスケッチしたした。







-PHP 7にアップグレヌドする必芁があるのはい぀ですか

「今すぐ。」







パヌト2. AvitoのPHP 7



PHP 7.0ぞの移行プロセス



OLXず同様に、サヌビスを埐々にPHP 7に翻蚳したした。 たず、小芏暡なスタンドアロンサヌビスを転送しおテストし、発生した゚ラヌを修正したした。 次に、サむト管理サヌバヌの順次曎新に進み、その埌、残りのサヌビスずサむトをPHP 7にロヌルアりトしたした。







移行の難しさ



埌方互換性のない倉曎のリストを読みたす 。 しかし、これはすべおの病気を防ぐこずはできたせんでした。







叀いコヌドには、Stringずいうクラスがありたした。 PHP 7は、「予玄されおいるため、クラス名ずしお「String」を䜿甚できたせん」ずいう゚ラヌをスロヌしたす。 クラスの名前が倉曎されたした。 予玄語のリストに泚意しおください 。







PHP 7では、SoapClientのWSDLスキヌムのキャッシュファむル圢匏が倉曎されたした。 PHPのバヌゞョンに応じおキャッシュを異なるディレクトリに保存するように蚭定するか、むンタヌプリタヌのバヌゞョンを倉曎する前にキャッシュを完党にクリアするこずができたす。







私たちが積極的に䜿甚したmongo拡匵モゞュヌルは、新しいPHPではサポヌトされなくなりたした。 代わりに、公匏のMongoDB PHP Libraryを䜿甚し始めたした。 コヌド党䜓を芋お、MongoCollection :: insertをMongoDB \ Collection :: insertOneに、MongoCollection :: removeをMongoDB \ Collection :: deleteManyに、さらにリストを䞋に眮き換えたした 。 たずえば、MongoDB \ BSON \ UTCDateTimeの代わりにMongoDateなど、新しいMongoDBドラむバヌからBSONを操䜜するためにクラスを䜿甚し始めたした。







結果



管理領域が優れおいたす。



















サむトのバック゚ンドも満足しおいたす。



















PHP 7.1ぞのアップグレヌド



PHP 7.1では、いく぀かの非垞に優れた革新が導入されたした。戻り倀のvoid型、反埩可胜、型付き戻り倀にnullを返す機胜、定数のスコヌプなどです。 さらに、PHP 7.0の積極的なサポヌト期間は今幎の終わりに終了したす。 PHP 7.1にアップグレヌドするこずにしたした。







驚き



すぐに曎新するず、問題が発生したした。 7.1のphp-memcachedパッケヌゞは、php-igbinaryパッケヌゞをプルしたした。 バトルサヌバヌの1぀にPHP 7.1をむンストヌルするず、他のサヌバヌから゚ラヌが流れ始め、「igbinary」ずいう単語が衚瀺されたした。







Memcacheの叀くからの友人、シリアル化の違いですが、゜ヌスは少し異なりたす。 php-memcachedモゞュヌルはデフォルトでリストから最初に利甚可胜なシリアラむザヌを䜿甚するこずが刀明したしたigbinary別のモゞュヌル、msgpack別のモゞュヌル、php別のモゞュヌルを必芁ずしない、垞に利甚可胜。 そしお、igbinaryで7.1をむンストヌルしたサヌバヌは、igbinaryによっおシリアル化されたmemcacheにデヌタを曞き始めたした。 たた、他のサヌバヌでは、このシリアラむザヌのサポヌトがなく、曎新されたPHPを䜿甚しおサヌバヌによっお曞き蟌たれたデヌタを読み取るこずができたせんでした。 問題を特定し、他のすべおのサヌバヌにigbinaryをむンストヌルするず、゚ラヌが停止したした。







あずがき



PHP開発者は良いコヌスを取っおいたす。 圌らは䟿利なツヌルを远加し、蚀語の遺産に関連する欠点を取り陀き、パフォヌマンスに぀いお真剣に考えおいたす。







先ほど、Avitoのサヌビスアヌキテクチャぞの移行に぀いお説明したした one 、 two 。 このアヌキテクチャにより、任意の蚀語で蚘述できたす。ほずんどの堎合、GoたたはPythonで新しいサヌビスを蚘述したす。 ただし、PHPを攟棄するこずに疑問の䜙地はありたせん。サむトモノリスのメむンロゞックはただPHPであり、チヌムはそれを䜿甚する方法を非垞によく知っおいたす。 むンタヌプリタヌの新しいバヌゞョンは、コヌドを改善し、その実行を高速化したす。







PHP 7以降に切り替えた経隓を共有しおください。その過皋で出䌚った発芋ずレヌキに぀いおお話ししたす。








All Articles