Help us understand the problem. What is going on with this article?

phpの実行開始が遅い際、どのiniの読み込みが遅いのかを特定する

phpの実行開始が遅い場合の対処 という記事にあったのと同じ状況になりました。

(以下引用)

php -v
php -n -v // -nはiniファイルを読まないオプション

この2つの実行で体感で分かるぐらい速度差がある時は特定のPHP拡張の初期化が原因です。liipのPHP v7.1.7とMacOS Sierraで問題があり1秒ぐらいかかってました。

どのiniの読み込みに時間がかかっているのかを確認する

大雑把な方法ですが、この方法で特定ができました。

php.iniの情報から、読み込んでいるiniを確認する

$ php --ini
Configuration File (php.ini) Path: /etc/php/7.2/cli
Loaded Configuration File:         /etc/php/7.2/cli/php.ini
Scan for additional .ini files in: /etc/php/7.2/cli/conf.d
Additional .ini files parsed:      /etc/php/7.2/cli/conf.d/10-opcache.ini,
/etc/php/7.2/cli/conf.d/10-pdo.ini,
/etc/php/7.2/cli/conf.d/15-xml.ini,
/etc/php/7.2/cli/conf.d/20-bz2.ini,
/etc/php/7.2/cli/conf.d/20-calendar.ini,
...

該当ディレクトリ以下のファイルをすべて標準出力し、'.so'でgrepする

$ cat /etc/php/7.2/cli/conf.d/* | grep '\.so'
zend_extension=opcache.so
extension=pdo.so
extension=xml.so
extension=bz2.so
extension=calendar.so
extension=ctype.so
extension=dom.so

出力をfile等に流し込んで、以下のようなコマンドとして編集して実行する

$ cat /etc/php/7.2/cli/conf.d/* | grep '\.so' > file
$ vim file

こんなコマンド群を作成.以下の記事を参考に.
https://github.com/liip/build-entropy-php/issues/11#issuecomment-59716269

$ cat file 
time php -n -d zend_extension=opcache.so -v 
time php -n -d extension=pdo.so -v
time php -n -d extension=xml.so -v

コピーしてコンソールにペーストして流し込み

$ time php -n -d zend_extension=opcache.so -v 
PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct  7 2020 15:24:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.7, Copyright (c) 1999-2018, by Zend Technologies

real    0m0.027s
user    0m0.022s
sys 0m0.006s
$ time php -n -d extension=pdo.so -v
PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct  7 2020 15:24:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

real    0m0.012s
user    0m0.006s
sys 0m0.006s
$ time php -n -d extension=xml.so -v
PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct  7 2020 15:24:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

real    0m0.008s
user    0m0.000s
sys 0m0.008s

iniファイル読み込みごとの実行時間が確認できます。時間のかかっている箇所があれば、php.ini からその箇所の設定をコメントアウト、再実行してみて、結果を確認してみてください。

注意点

  • .so のファイルによっては、依存関係他よくわからない理由で読み込みが失敗したりするのを確認しています。

これとか

time php -n -d extension=xsl.so -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'xsl.so' (tried: /usr/lib/php/20170718/xsl.so (/usr/lib/php/20170718/xsl.so: undefined symbol: dom_node_class_entry), /usr/lib/php/20170718/xsl.so.so (/usr/lib/php/20170718/xsl.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct  7 2020 15:24:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

real    0m0.007s
user    0m0.007s
sys 0m0.000s

ファイルは存在するんですけどね。ライブラリ読み込みにおける依存関係によるものかなぁと推測していますが、しっかりとは確認していません。

$ ls -l /usr/lib/php/20170718/xsl.so 
-rw-r--r-- 1 root root 30824 10月  8 00:24 /usr/lib/php/20170718/xsl.so
x-trans
AWS、GCP、Azureの導入設計、環境構築、運用・保守までサポートするエンジニア軍団
https://x-trans.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away