OpenPNE2系→OpenPNE3系へのアップデート

結論

情報がかなり少なくて悪戦苦闘

最終的には、2.14.9→3.6.5→3.8.10という順番でアップデートに成功した

 

手順

OpenPNE3.6.5にまずアップデート

OpenPNE2.14からのアップデートですよ

# wget https://github.com/openpne/OpenPNE3/archive/OpenPNE-3.6.5.tar.gz

# tar xvfz OpenPNE-3.6.5.tar.gz

# mv /usr/local/src/OpenPNE3-OpenPNE-3.6.5/ /usr/local/

# mv /usr/local/OpenPNE3-OpenPNE-3.6.5/ /usr/local/OpenPNE36

# mysql -uroot -p openpne < /usr/local/src/openpne2.sql

# cp /usr/local/OpenPNE36/config/ProjectConfiguration.class.php.sample /usr/local/OpenPNE36/config/ProjectConfiguration.class.php

# cp /usr/local/OpenPNE36/config/OpenPNE.yml.sample /usr/local/OpenPNE36/config/OpenPNE.yml

# vi /usr/local/OpenPNE36/config/OpenPNE.yml

# cp /usr/local/OpenPNE2/config.php /usr/local/OpenPNE36/config/config.OpenPNE2.php

 ※PEARのTar.phpが古くPluginインストール時にエラーになってしまうのでその対策

↓これは日記プラグインインストール時のエラーだけど、こういうエラーが大量に出る

# ./symfony opPlugin:install opDiaryPlugin -r 1.5.0

>> plugin    installing plugin "opDiaryPlugin"

>> sfPearFrontendPlugin downloading opDiaryPlugin-1.5.0.tgz ...

>> sfPearFrontendPlugin Starting to download opDiaryPlugin-1.5.0.tgz (64,612 bytes)

>> sfPearFrontendPlugin .

>> sfPearFrontendPlugin .

...

>> sfPearFrontendPlugin .

>> sfPearFrontendPlugin ...done: 64,612 bytes

>> sfPearFrontendPlugin could not extract the package.xml file from

>> sfPearFrontendPlugin "/usr/local/OpenPNE38/cache/.pear/opDiaryPlugin-1.5.0.tgz"

>> sfPearFrontendPlugin Download of "http://get.openpne.jp/opDiaryPlugin-1.5.0.tgz"

>> sfPearFrontendPlugin succeeded, but it is not a valid package archive

>> sfPearFrontendPlugin Invalid or missing remote package file

Plugin "opDiaryPlugin" installation failed:

 Tar.phpを新しくしておきます

# cd /usr/local/src/

# wget http://download.pear.php.net/package/Archive_Tar-1.3.11.tgz

# tar xvfz Archive_Tar-1.3.11.tgz

# mv /usr/local/OpenPNE36/lib/vendor/PEAR/Archive/Tar.php /usr/local/OpenPNE36/lib/vendor/PEAR/Archive/Tar.php.bk

# cp /usr/local/src/Archive_Tar-1.3.11/Archive/Tar.php /usr/local/openpne3/lib/vendor/PEAR/Archive/Tar.php

 あとは、下記コマンドを実行後、httpd.conf、.htaccessなど変更してブラウザからアクセスできればOK

# ./symfony opPlugin:sync

# ./symfony openpne:permission

# ./symfony openpne:upgrade-from-2 --origin=2.14 

OpenPNE3.8.10にアップデート

# wget https://codeload.github.com/openpne/OpenPNE3/legacy.zip/OpenPNE-3.8.10

# unzip OpenPNE-3.8.10

# mv /usr/local/src/openpne-OpenPNE3-7902757/ /usr/local/

# mv /usr/local/openpne-OpenPNE3-7902757/ /usr/local/OpenPNE38

# cp /usr/local/OpenPNE38/config/ProjectConfiguration.class.php.sample /usr/local/OpenPNE38/config/ProjectConfiguration.class.php

# cp /usr/local/OpenPNE38/config/OpenPNE.yml.sample /usr/local/OpenPNE38/config/OpenPNE.yml

# vi /usr/local/OpenPNE38/config/OpenPNE.yml

# cp /usr/local/OpenPNE36/config/databases.yml /usr/local/OpenPNE38/config/databases.yml

 symfonyでインストール

# ./symfony doctrine:build-model

# ./symfony cc

# ./symfony openpne:migrate

# ./symfony plugin:publish-assets

# ./symfony openpne:fix-session-db

ディレクトリ変更とかははぶいているので、このまま上から順番に打ち込んでいけばOKってわけではない

流れはこんな感じで大丈夫かと思うので自分の環境に合わせて適宜読み替えてください。

 

エラーもろもろ

さて、インストールしたはいいが、エラーが大量に出ていてこのままでは使い物にならない

opSkinClassicPlugin_loginでエラー

さて、インストール終わり♪さぁ動かそう♪と思ったら、トップページにこんなメッセージ

現在、サーバが混み合っているか、メンテナンス中です。

ご迷惑をおかけいたしますが、しばらく時間を空けて再度アクセスしてください。

Currently, our service is too busy or is under maintenance.

We're sorry and please retry accessing later.

 ググってみると、同じようなエラーに悩まされている人が2人...たった2人!?

デバッグモードのようなものがあるらしく、

pc_frontend_dev.php

を見ろと書いてある。見てみると、こんな感じのメッセージ?これはApacheのログの方だったかな...

500 | Internal Server Error | sfConfigurationException

The route "opSkinClassicPlugin_login" does not exist.

 調べてみても全然ひっかからない

そして3日ほど悩んだ。いやほんとに。

このプラグイン(opSkinClassicPlugin)をはずしてみても、このエラーが出る

これはDBが悪さをしているなーと思ったのでDBのdumpファイルで検索するとようやく発見。

mysql> select * from sns_config where name = 'external_pc_login_url';

+----+-----------------------+----------------------------+

| id | name                  | value                      |

+----+-----------------------+----------------------------+

| 49 | external_pc_login_url | @opSkinClassicPlugin_login |

+----+-----------------------+----------------------------+

1 row in set (0.00 sec)

どうやらexternal_pc_login_urlが指定されていると、ログインするときに強制的に読みにいっちゃう?のか?

消すのは不安なので、とりあえずUPDATEして様子を見る

mysql> update sns_config set name='_external_pc_login_url' where id=49;

そしてアクセスすると...

出た―!普通のログイン画面出た―!

 

ファイルの置き換え

さて、大きなエラーは消えたが、pc_frontend_dev.phpを見ると、色々エラーが出てることに気づく

どうやらPHP5.5&ログモードを厳しめで動かしていると、古いスクリプトエラーになっちゃうみたい

エラーが出ているファイルをひたすら修正

/usr/local/OpenPNE38/lib/vendor/symfony/lib/config/sfApplicationConfiguration.class.php:155

ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');

ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : null);

 /usr/local/OpenPNE38/lib/vendor/symfony/lib/exception/sfException.class.php:103

ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : '');

ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : null);

 /usr/local/OpenPNE38/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php:1152

return array_diff($componentsAfter, $componentsBefore);

$diff = array();

foreach($componentsAfter as $key => $val) {

   if(!isset($componentsBefore[$key])) {

       $diff[$key] = $val;

   } elseif(is_array($componentsBefore[$key]) && !is_array($val)) {

       $diff[$key] = $val;

   }

}

return $diff;

/usr/local/OpenPNE38/lib/vendor/symfony/lib/response/sfWebResponse.class.php

return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));

strtr(ucfirst(strtolower($name)), '_', '-');

return str_replace(array('\'$1$3\'','\'$2$4\'','\'$1\'', '\'$2\'', '$1', '$2'),array('$matches[1].$matches[3]','$matches[2].$matches[4]','$matches[1]','$matches[2]','$matches[1]','$matches[2]'),$name);

 /usr/local/OpenPNE38/lib/vendor/symfony/lib/util/sfToolkit.class.php:362

return preg_replace(array_keys($replacePairs), array_values($replacePairs), $search);

foreach($replacePairs as $pattern => $replacement)

{

 if (preg_match('/(.*)e$/', $pattern, $matches))

 {

   $pattern = $matches[1];

   $search = preg_replace_callback($pattern, function ($matches) use ($replacement) {

     preg_match("/('::'\.)?([a-z]*)\('\\\\([0-9]{1})'\)/", $replacement, $match);

     return ($match[1]==''?'':'::').call_user_func($match[2], $matches[$match[3]]);

   }, $search);

 }

 else

 {

   $search = preg_replace($pattern, $replacement, $search);

 }

}

return $search;

 こんなにたくさん勝手に書き換えていいのか??自己責任で...

まだあるのかもしれないけど、とりあえず動けばいい、の精神で

シンボリックリンクエイリアス

pc_frontend_dev.phpで画像が表示されないので、とりあえず張ってみた

ApacheのAlias指定の方がいいのかなぁ...

# ln -s /usr/local/OpenPNE38/lib/vendor/symfony/data/web/sf /usr/local/OpenPNE38/web/sf

 opDiaryPluginインストール

さて、ログイン後、ホーム画面は表示されるんだけど、各種日記等の個別ページに行こうとするとなんか足りないと言われる

Fatal error: Class 'DiaryCommentForm' not found in ...

ググっても1件もない

私だけですか...色々やりすぎておかしくなっちゃったのかな

# ./symfony opPlugin:install opDiaryPlugin -r 1.5.0

# ./symfony openpne:migrate --target=opDiaryPlugin

 プラグインを再インストール?してあげればOK

ちなみにTar.phpが古いと失敗するので、Tar.php新しくするのは必須

この時初めて知ったんだけど、OpenPNE3からは日記書くのもプラグインいれなきゃだめなのね

もっとマニュアルとかにガンガン書いておいてくれてもいいんじゃないかしら...

日記書くのなんて基本機能なんだからそのくらい付けておいてくれてもいいんじゃ...

大量のPHPエラー

Strict Standards: Non-static method Calendar_Engine_Factory::getEngine() should not be called statically, assuming $this from incompatible context in /usr/local/OpenPNE38/lib/vendor/PEAR/Calendar/Calendar.php on line 210

 pc_frontend_dev.php見てるとこういうのが大量に出る

これはPHPのエラーレベルにE_DEPRECATEDが加わったためで、将来的にサポートされなくなる関数が使用されているときに出る警告らしい

場当たり的な対処かもしれないけれど、とりあえずエラーレベルを変更次のymlファイルを編集してエラーレベルを変更

/apps/pc_frontend/config/settings.yml

/apps/pc_backend/config/settings.yml

/apps/mobile_frontend/config/settings.yml

/apps/mobile_mail_frontend/config/settings.yml

dev:

  .settings:

    error_reporting:        <?php echo (E_ERROR & ~E_NOTICE & ~E_PARSE)."\n" ?>

    web_debug:              true

    cache:                  false

    no_script_name:         false

    etag:                   false

 てか、こんな対処するしかないのー!?

と、このあたりでOpenPNE導入はちょっと...やめたいなと思い始めてきた(こんなんだと全世界に公開、はナシかなぁ。社内SNSくらいなら...アリ?)

---

とりあえずここまで。

もう少し色々使ってみたらまた、かくかも