この記事では、OPCache について説明し、OPCache を使用して PHP のパフォーマンスを向上させる方法を詳しく紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
PHP のようなインタープリタ型言語の場合、すべてのコードは実行されるたびにロードされ、解析されます。この利点は、コードがいつでも処理できることです。 . コンパイルする必要がないため、ホット アップデートの修正が行われます。しかし、これでは過剰なトラフィックを処理できないという問題も生じます。結局のところ、ロード、解析、リリースのたびに CPU への負荷が増加し、通常、8 コア 16G サーバーは、約 2000 または 3000 の同時実行で CPU 使用率が 60% 以上に達することがあります。 Laravel のような大規模なフレームワークを使用している場合、効率はさらに低くなります。現時点では通常、サーバーの負荷を軽減するために負荷分散のためにサーバーの数を増やします。ただし、その場合のコストは大幅に増加します。では、最適化ソリューションはあるのでしょうか?
Niao 兄弟によるブログの PHP7 の最適化に関する記事では、最初の提案は OPcache を有効にすることです。もちろん、Swoole を使用するという選択肢もあります。 Swooleについては次回に話すとして、今日はまずOPcacheについて学びます。
OPcache は、PHP スクリプトのプリコンパイルされたバイトコードを共有メモリに保存し、プリコンパイルされた単語を保存することにより、PHP のパフォーマンスを向上させます。コードを節約できる利点は次のとおりです。毎回 PHP スクリプトをロードして解析するオーバーヘッドが節約されるということです。
これは、PHP ドキュメントの OPcache の紹介です。つまり、OPcache は、毎回のロードと解析の手順を保存し、最初の解析とコンパイルの後にスクリプトのバイトコードをシステムにキャッシュします。共有メモリ内にあります。実際、これは不完全なコンパイルに似ています。
Java に似た言語は、オンラインで実行する前に、jar パッケージにパッケージ化するなど、パッケージ化してコンパイルする必要があります。 C または C# は、.dll または .exe にパッケージ化できます。これらのパッケージ化されたファイルはコンパイルされたファイルであり、実行後も通常は実行されたままになり、常駐プロセスとなり、そのコードがメモリに入ります。プログラムの実行時に解釈やコンパイルを行う必要がないため、当然のことながら速度は大幅に速くなります。 OPcache も同様の役割を果たします。ただし、これは完全なコンパイル プロセスではありません。スクリプトの実行には依然として PHP-FPM に依存しています。ただし、OPcache を有効にした後、PHP-FPM はまずメモリを検索して、関連するキャッシュされたバイトコードが既に存在するかどうかを確認します。メモリ内にある場合は直接アクセスされますが、そうでない場合は解釈されて再度コンパイルされ、キャッシュされます。さらに、OPcache はファイル用です。つまり、ファイルが新しく追加された場合、そのファイルは実行されている場合にのみキャッシュされ、実行されていない場合、現在の共有メモリには存在しません。
推奨学習: 「PHP ビデオ チュートリアル 」
OPcache はすでに PHP の公式拡張機能であり、パッケージは一緒にリリースされるため、PHP をコンパイルおよびインストールするときに --enable-opcache を使用して拡張機能を有効にすることができます。これはすでにデフォルトの拡張機能です。インストール パッケージ内のファイルを使用して、OPcache がインストールされていないシステムに OPcache をインストールすることもできます。
cd php-7.4.4/ext/opcache/ phpize ./configure make && make install
OPcache と Xdebug は運用環境では一緒に使用しないでください。 Xdebug 自体は運用環境での使用はお勧めできません。同時に使用する必要がある場合は、最初に OPcache をロードし、次に Xdebug をロードする必要があります。
拡張機能がインストールされたら、php.ini ファイル内の拡張機能を開きます。 OPcache 拡張機能は Zend 拡張機能パッケージであるため、開く必要があるのは Zend 拡張機能であることに注意してください。
zend_extension=opcache.so
また、それを有効にする必要があります。
opcache.enable=1
OPcache をオンにしてコードを更新すると、更新したばかりのコードが最新のコードではないことがわかります。これは、Java と同様にコードがキャッシュされており、サービスを再起動する必要があるためです。では、PHP における再起動とは何でしょうか?もちろん、PHP-FPM を再起動するだけで、kill -USR2 コマンドを使用してメイン プロセスを再起動するだけです。クイック再起動コマンドもここで提供されます。
ps -ef | grep "php-fpm: master" | grep -v grep | cut -c 9-15 | xargs kill -USR2
Zhihu からの修正に感謝します。PHP-FPM を再起動するのは最善の解決策ではありません。opcache_reset() を使用して手動で再起動するか、php を通じて opcache.validate_timestamps opcache.revalidate_freq を自動的に設定する必要があります。 ini ファイル。インターバル コンパイル、または opcache_compile_file() を通じて変更されたファイルを直接再コンパイルします。
テストするコンテンツはテスト環境の一部です。この2コア4Gサーバーで使用されているPHPバージョンはPHP7.4で、通常のNginxとPHPの設定とulimitも最大まで開放されています。このコードは単にテキスト行を出力するだけですが、単純な mvc フレームワークを使用しています。つまり、このコードが実行されると、1 つのファイルだけではなく、少なくとも複数のファイルが読み込まれます。
首先我们来看未开启 OPcache 的情况。
接下来是开启了 OPcache 的情况。
很明显,性能有了很大的提高。不仅速度快了很多,吞吐率也是直接上升了几倍。当然,这只是非常简单的一个测试,不过总体看来,确实对单机的性能提升有很大的帮助。最最主要的是,同样的并发情况下,CPU 资源也比未开启的状态下低了70%。
在 PHP 的官方文档中,已经为我们给出了一套默认的 OPcache 在 php.ini 中的配置。经过测试,基本没什么问题,当然,现在还没有在生产环境中使用过,还需要进行更多的测试。不过文档中指出,这套配置是可以直接运用到线上的,不过需要注意的是某些使用了注解之类功能的高级框架可能需要注意某些参数。
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1
具体的配置说明以及其他的一些配置选项我们可以参考官方文档进行详细的了解。
既然是我们的 PHP 大神鸟哥推荐的,而且也是官方推荐的扩展,我觉得在正式生产环境中使用不会有太大问题。另外,官方也给出了一套可以直接运用于线上生产环境的配置参数,也方便我们直接在线上进行测试。目前在生产环境中,我们只使用了一台服务器来进行测试,并且给它多分配了一些负载过来,从目前的情况来看,这一台机器的运行效率比其他几台的高很多。因为它一方面处理了更多的请求,另一方面它的 CPU 资源占用率还没有其他几台机器高。同时,OPcache 也不需要我们去了解更多的进程协程之类的知识,不像 Swoole 一样的会带来更高的学习成本。所以综上所述,在测试完备的情况下,OPcache 绝对是我们最优先考虑的单机优化方案。
更多编程相关知识,请访问:编程入门!!
以上がOPCacheとは何ですか? OPCache を使用して PHP のパフォーマンスを向上させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。