Enhancement(機能追加・改善) #3919
完了PHP 5.6 対応
100%
説明
Youichi Kimura さんがほぼ9年前に更新
PHP5.6.18 で dev モードの pc_frontend (pc_frontend_dev.php) を開くと以下のように警告が出力されます。
Warning: ob_start(): function '' not found or invalid function name in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php on line 155 Notice: ob_start(): failed to create buffer in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php on line 155 Notice: Array to string conversion in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php on line 1152 (上の一行と同じ Notice が 15 回繰り返し) Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 409 (上の一行と同じ Deprecated が 3 回繰り返し) Deprecated: Non-static method Net_UserAgent_Mobile::factory() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/util/opMobileUserAgent.class.php on line 32 Deprecated: Non-static method Net_UserAgent_Mobile::isDoCoMo() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 144 Deprecated: Non-static method Net_UserAgent_Mobile::isEZweb() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 146 Deprecated: Non-static method Net_UserAgent_Mobile::isSoftBank() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 148 Deprecated: Non-static method Net_UserAgent_Mobile::isWillcom() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 150 Deprecated: Non-static method PEAR::staticPushErrorHandling() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 170 Deprecated: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile/Common.php on line 140 Deprecated: Non-static method PEAR::staticPopErrorHandling() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 172 Deprecated: Non-static method Net_UserAgent_Mobile::isError() should not be called statically, assuming $this from incompatible context in /home/upsilon/git/openpne3/master/lib/vendor/PEAR/Net/UserAgent/Mobile.php on line 174 Warning: Cannot modify header information - headers already sent by (output started at /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php:409) in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 336 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 409 Warning: Cannot modify header information - headers already sent by (output started at /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php:409) in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 357 Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/upsilon/git/openpne3/master/lib/vendor/symfony/lib/response/sfWebResponse.class.php on line 409
どの警告も動作に支障を来すものではありませんが、最初に出力される Warning については ./symfony openpne:install
などタスクの実行時にも出力される (#3887) ため、「正常動作なのに Warning が表示される」という意味では利用者に余計な不安を与えるかもしれません。
その他の警告については一般のユーザーが目にすることはありませんが、「開発者が dev モードで見たときに本来気付くべき警告が埋もれてしまう」という懸念はあります。
Youichi Kimura さんが8年以上前に更新
PHP 5.6.x における下位互換性の無い変更点¶
https://secure.php.net/manual/ja/migration56.incompatible.php
- 配列リテラルを用いてクラスのプロパティに配列を設定した場合、配列のキーが上書きされない
- 「クラスのプロパティとして宣言されている配列で明示的なキーと暗黙のキーが混在している場合」という特殊な条件下でキーが上書きされる動作が修正されたもの。これを意図的に起こすようなコードが存在するとは考えにくく(おそらくレビュー段階で止められるであろう)、かつ単純な grep 等では該当する箇所を探すことは困難であることから無視
- json_decode() が、より厳格に
- OpenPNE で外部から JSON データを受け取るために json_decode 関数を使用しているのは
opSecurityUser::getRememberLoginCookie()
のみであり、このメソッドはopSecurityUser::setRememberLoginCookie()
によってセットされた Cookie から JSON を読み出している。閲覧者が意図的に Cookie を書き換えるような状況でない限り json_decode が厳格になることで問題が起こることはない
- OpenPNE で外部から JSON データを受け取るために json_decode 関数を使用しているのは
- ストリームラッパーが、SSL/TLS を使っている場合のピア証明書とホスト名の検証にデフォルトで対応
- #3919-7 を参照
- GMP リソースがオブジェクトに
- GMP 関数は
lib/vendor/php-openid/Auth/OpenID/BigMath.php
内で使われているが、GMP リソースに対してis_resource()
関数を使用する箇所は見当たらなかった
- GMP 関数は
- Mcrypt 関数は、有効なキーと IV を要求する
- OpenPNE で mcrypt_* 関数が使われているのは 1849103f の箇所のみ
- 部分 SSL を有効にし User-Agent を au 携帯のものに設定して正常にログインできることを確認した
- cURL でのファイルアップロード
- CURLOPT_POSTFIELDS のパラメータに
"@filename.txt"
の形式でファイルパスを記述するとファイルアップロードを行える機能がデフォルトで無効化された。grep で@
から始まる文字列を検索してみたが curl のパラメータのために用いている箇所は見付からなかった
- CURLOPT_POSTFIELDS のパラメータに
PHP 5.5.x における下位互換性の無い変更点¶
https://secure.php.net/manual/ja/migration55.incompatible.php
- Windows XP および 2003 のサポートの終了
- 大文字小文字を区別しない比較がロケールに依存しなくなる
- トルコ語のように「i」(U+0069) と「I」(U+0049) が case-insensitive な比較でも異なる文字として扱われるロケールで発生する問題。これが今後は特定のロケールによって挙動が変化しなくなるため、今まで日本語圏で問題が起きていないのであれば今後も問題は起きないはず
- pack() と unpack() の変更
- pack/unpack 関数の書式文字 "A", "a" を使用している箇所は #3918 の Archive_Tar 以外では見付からなかった
- self や parent そして static が、どんな場合であっても大文字小文字を区別しないようになる
SELF::CONSTANT
のような書き方ができるようになる、という変更なので既存のコードに影響するものではない
- PHP ロゴの GUID の削除
*_guid()
関数を使用している箇所は見付からなかった
- 内部的な実行方法の変更
- 拡張モジュールの開発者などを除いては基本的に影響しない
その他の変更点¶
- crypt() で、salt パラメータを省略したときに E_NOTICE が発生するようになりました
- crypt 関数を使用している箇所は存在しなかった
- preg_replace() の /e 修飾子
- sfWebResponse::normalizeHeaderName() が使用しており #3919-5 のように E_DEPRECATED エラーを出力している
- とりあえず PHP5.6 では動作に支障はない (PHP7.0 では削除されている)
- 呼び出し時の参照渡しをサポートしなくなりました
- 同梱されている Smarty2 がこれを多用しているように見える(実際に動かしたわけではないので勘違いかも)
- #132 で Smarty 対応が提案されていたが、今のところ使われていないので特に影響はない
Youichi Kimura さんが8年以上前に更新
PHP 5.6.x から TLS/SSL を使用する全ての通信においてピア証明書およびホスト名の検証がデフォルトで行われるようになります。
通常は通信先のサーバーが正しい証明書を使用していれば特別に対策を取る必要はありません。ただし、もし PHP 5.6.x に移行したことで下記に挙げる機能が動作しなくなった場合は、証明書の検証に失敗したことが原因であると考えられます。
影響を受ける機能の例:
- OpenPNE.yml の
mail_smtp_host
を使用したメール送信 - メンバーの「BlogのURL設定」 (opBlogPlugin)
- OpenID によるログイン (opAuthOpenIDPlugin)
これらの機能でエラーが発生する場合は、通信先のサーバーの証明書に問題がある(自己署名証明書を使用している、中間証明書が設定されていない、ホスト名と CN が一致しないなど)か、OpenPNE が設置されているサーバーに CA バンドルが正しくインストールされていないなどの理由が考えられます。
Youichi Kimura さんが8年以上前に更新
PHP 5.6 以降で APC が使用できない点について調査:
- OpenPNE に含まれるクラスでは sfAPCCache, Doctrine_Cache_Apc クラスが APC の
apc_store
,apc_fetch
等の関数を使用している - 実際に OpenPNE で使われているのは Doctrine_Cache_Apc のみで、APC が利用可能な場合のみ有効となる
- source:lib/config/opProjectConfiguration.class.php@43190aa1#L118
- APC が使えない場合は Doctrine_Cache_Apc も使用されないので、APC が無いことでエラーになるということはない
- Doctrine_Cache_Apc は Query Cache に使用されており、DQL をパースし SQL を生成した結果がキャッシュされている
- Doctrine のドキュメントには“You should always use query cache in a production environment.”と記載されている
APCu 拡張について:
- APC から User Cache 以外の機能を削った APCu が存在する (PHP 5.6 でも動く)
- APCu のビルド時に
--enable-apc-bc=yes
(デフォルト) の状態であればapc_store
,apc_fetch
等の関数はそのまま動く- この場合、
extension_loaded('apc')
も true を返す
- この場合、
- APCu が入った状態で Doctrine のクエリキャッシュが正常に動作していることを確認済み