忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 14:29 |
EC-CUBE PHP5.3.1でEC-CUBEを動かす
手元のPHPがそれまで5.2.9だったのですが、5.3.1にアップグレードしたところ死亡。

>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\DB.php on line 475
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\DB.php on line 552
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\DB.php on line 1129
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\PEAR.php on line 557
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\PEAR.php on line 560
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\Mail.php on line 156
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\Net\UserAgent\Mobile.php on line 165
>Deprecated: Function ereg() is deprecated in C:\eccube\data\class\util\SC_Utils.php on line 83
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\DB\common.php on line 964
>Deprecated: Assigning the return value of new by reference is deprecated in C:\eccube\data\module\DB\common.php on line 1171


平たく言うと、「その関数、使い方は今後サポートしなくなるから使うな」ということです。
Pearでエラーってどういうことだよ、と見てみると更新日が2007年。
PHP4なんていい加減捨ててしまえ。

フォーラムでの解決方法は「ダウングレードしろ
いや駄目だろそれ。

後方互換性の確保という理念はまあいいのですが、そのために新バージョン切り捨てとかありえない。


手っ取り早く修正するのであればerror_reporting()C:\eccube\data\class/SC_Initial.phpに書かれていますので、

function setErrorReporting() {
  //error_reporting(E_ALL & ~E_NOTICE);
  error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
}


ってするといいのですがこんなのではよくありません。

とりあえずpearコマンドで入れられている共通版のPearをインクルードするように差し替えようと思いましたが、至る所で
    require_once(dirname(__FILE__) . '/../module/Mail.php');
とか書かれてる。
もうちょっとこう……

次善の策と言うことで直接書き換えます。
Pear関連で発生しているDeprecatedエラーは、全部 &newって書かれているせいなので、単&にを削除するだけです。

残りは\data\class\util\SC_Utils.phpereg()ですが、単に文字列比較しているだけなので
  //if( !ereg('/install/', $_SERVER['PHP_SELF']) ) {
    if( strpos($_SERVER['PHP_SELF'] , '/install/' )===false ) {

と書き換えます。

余談ですがこのSC_Utils::sfInitInstall()、場合によっては最終的に完成するURLが'hoge/fuga//install/'みたいになります。
header('Location: hoge/fuga//install/')であればhttp://eccube.localhost/hoge/fuga/install/に一応辿り着けるのですが、htmlディレクトリをDocumentRootにしている場合、header('Location: //install/')となりhttp://install/を探しに行って死にます。
最初の一回しか使わないからいいといえばいいんですけどねえ。

さて無事エラーは出なくなりましたが、かわりに真っ白です。
はて。

順に読んでいくと、

/html/install/index.php
require_once("../require.php");

/html/require.php
require_once($require_php_dir . HTML2DATA_DIR . "require_base.php");

/data/require_base.php
$sessionFactory->initSession();

/data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php
session_start();
で死んでいました。
お?

どのタイミングで死ぬかというと、/data/require_base.php
$objSession = new SC_Helper_Session_Ex();
です。
これより前だとsession_start()に成功し、後だとsession_start()に失敗します。

SC_Helper_Sessionが何をやってるかというとsession_set_save_handler()を使ってセッションをDBに保存していました。

…データベースの設定はインストール開始後に行うんですが…
FatalErrorすら吐かずに完全停止というのは少々ご勘弁願いたい。

とりあえず/data/class/SC_Inittial.phpに以下の対応を行うことでフリーズは回避されます。
  //define("DEFAULT_DSN", "pgsql://nobody:password@localhost:5432/eccubedb")
    define("DEFAULT_DSN", "mysql://nobody:password@localhost:5432/eccubedb");


なんでだよ。

インストール開始後も、ことある毎にDeprecatedエラーが大量発生しまくって酷いったらありゃしない。
インストール終了後、サイトトップを表示してみると目眩がします。
なんで今更ereg()なんか使ってるんだ。

はっきりいって使えたものではないので、結局error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);にしてしまいました。


EC-CUBEの記事
PR


2010/04/30 22:34 | Comments(1) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コミュ版では直ってるぽいです
http://svn.ec-cube.net/open_trac/ticket/603

まあWindowsでは云々とか書くくらいならPATH_SEPARATOR使えよって思わなくもないですが。
posted by NurseAngel at 2010/04/30 22:55 [ コメントを修正する ]

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2010/05/02 | HOME | ==NOVEL PHILOSOMA== 12>>
忍者ブログ[PR]