PHP-FPMの.user.ini設定を少し深掘りしてみます。
ファイルのアップロード可能な容量制限を変更するとき、次のような設定をすることがあります。
memory_limit = 256M upload_max_filesize = 10M post_max_size = 12M
しかし、実はこれうまくいきません。
このうち.user.iniで完全に反映できるのはmemory_limitのみです。
他2つは.user.iniではphpinfo()に反映されても、実際の動作には反映されない可能性が高いです。
| ディレクティブ | .user.iniに設定 | phpinfo() に反映 | 動作に反映されるか |
|---|---|---|---|
| memory_limit | できる | 表示される | 動作にも反映 |
| post_max_size | 一部反映される | 表示される | 動作には反映されない(FPM起動前に必要) |
| upload_max_filesize | 一部反映される | 表示される | 動作には反映されない(FPM起動前に必要) |
これらはPHPがファイルやPOSTデータを受け取る前に使われる設定のためです。
post_max_size:PHPがPOSTデータ全体を読み込む前に必要
upload_max_filesize:ファイルアップロード制御も同様にPHPエンジンが処理を始める前に評価
.user.iniは「スクリプトが実行される直前」に読み込まれるため、POSTボディがすでに破棄された後ということになります。
.user.iniではなくFPMの構成ファイル(www.conf)かphp.iniに設定します。
特定のディレクトリでPHPの設定を変更するため、.htaccessを作成し以下のように設定していたら500 Internal Server Errorが発生しました。
php_value memory_limit 128M php_value max_execution_time 0
調査したところ、PHP動作モードがFPM(FastCGI Process Manager)であることが原因でした。
phpinfoのServer APIがFPM/FastCGIになっている場合です。
どうやらPHP-FPMでは.htaccessにphp_valueを使った設定変更が出来ないようなのです。
※.htaccess自体が使えないわけではありません。
CGI版で使用できる設定ファイル.user.iniを使います。
設定例は以下のようになります。
memory_limit 128M max_execution_time 0
Apacheの設定で.user.iniへのアクセスを拒否する設定があるか確認、なければ設定しておいてください。
PHP: .user.ini ファイル – Manual文字列”false”をbool型として扱いたい場合、単純にキャストしてしまうとfalseの動作を期待しているのに意図とは反対にtrueの動作となってしまうことがあるので注意が必要です。
例えば以下のように文字列”false”をbool型にキャストしてみます。
$bool = (bool)"false"; var_dump($bool);
するとどうでしょう。以下のような結果が返ってきます。
bool(true)
“false”をキャストしたのにtrueとなってしまいます。
この原因はキャストだとfalseとは認識されず、”false”というただの文字列という認識となり空文字ではないという判断になるためです。
公式のマニュアルを見てみてください。
booleanへの変換
- boolean の false
- integer の 0 (ゼロ)
- float の 0.0 および -0.0 (ゼロ)
- 空の文字列 “”、 および文字列の “0”
- 要素の数がゼロである 配列
- unit 型 NULL (値がセットされていない変数を含む)
- bool 型へキャストするように動作がオーバーロードされた内部オブジェクト。 例: 属性がない空要素から作成された SimpleXML オブジェクト。
上記以外は全てtrueとみなされます。
ではどうすれば良いでしょうか。
続きを読む…»
WordPressのメニューを表示する際、wp_nav_menuメソッドを使って表示することがあると思います。
その際の例
wp_nav_menu( array( 'menu' => 'GlobalMenu', 'menu_id' => 'global_navi', 'container_class' => 'global_navigation' ) );
wp_nav_menuではidやクラス等、ある程度はパラメータを与えることでカスタマイズ出来るようになっています。
しかし、例えばメニューアイテムの最後に任意のアイテムを追加で表示させたいなど、柔軟なカスタマイズをすることが出来ません。
そんな柔軟なカスタマイズを行いたいときの手法をご紹介します。
順に解説していきますが、実際には一連の処理をfunctions.phpにカスタムメソッドとして作成し、メニューを表示したい任意の箇所で実行してください。
メニュー名を指定し、wp_get_nav_menu_objectメソッドでメニュー情報を取得します。
※メニュー名は[外観]->[メニュー]->[メニュー構造]で設定しているメニュー名を指定してください。
// メニュー名 $menu_name = 'GlobalMenu'; // メニュー情報取得 $menu = wp_get_nav_menu_object($menu_name);
取得したメニュー情報を基にメニューアイテムを取得します。
// メニューアイテム取得 $menu_items = wp_get_nav_menu_items($menu->term_id);