5

私は自分のプロジェクトで問題が発生したことはありません。つい最近、arch linux(5.4にアップデート)でpacman-updateを実行したとき、私のプロジェクトの多くはもう実行できなくなりました。

興味深いことに、この問題は、セッションファイルがファイルシステム上に作成された直後にのみ発生します。つまり、/ tmp / sess *が存在しない限り、初めてWebサイトに電話をかけることができます。

もう一度呼び出したいときに/tmp/ sess *が既に書き込まれていると、次のエラーが発生します(stacktrace、Zend Frameworkを含む)。

Zend_Controller_Exception: session has already been started by session.auto-start or session_start()#0 /srv/http/bahasa/library/Zend/Session/Namespace.php(143): Zend_Session::start(true)
#1 /srv/http/bahasa/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')
#2 /srv/http/bahasa/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct()
#3 /srv/http/bahasa/library/Zend/Auth.php(141): Zend_Auth->getStorage()
#4 /srv/http/bahasa/library/Skoch/Controller/Plugin/Navigation.php(59): Zend_Auth->hasIdentity()
#5 /srv/http/bahasa/library/Zend/Controller/Plugin/Broker.php(287): Skoch_Controller_Plugin_Navigation->dispatchLoopStartup(Object(Zend_Controller_Request_Http))
#6 /srv/http/bahasa/library/Zend/Controller/Front.php(928): Zend_Controller_Plugin_Broker->dispatchLoopStartup(Object(Zend_Controller_Request_Http))
#7 /srv/http/bahasa/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#8 /srv/http/bahasa/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#9 /srv/http/bahasa/public/index.php(30): Zend_Application->run()
#10 {main} in /srv/http/bahasa/library/Zend/Controller/Plugin/Broker.php on line 312

もちろん、stackoverflowでこの問題について他の回答を確認しましたが、次のようになります。

  • session.auto-startが0に設定されている
  • library / Zend /の外部の場所でsession_start()呼び出しはありません(プロジェクトディレクトリ全体でgrep -rを実行しました)
  • Bootstrap.phpにZend_Session::start()を(バグ修正として)書き込むと、新しい致命的なエラーが発生します
  • ファイルシステムの権限は問題なく、/ tmpには777があり、作成されたsess-fileにはhttp rwがあります(777は動作を変更しません)。

また、前述のように、PHP5.3からPHP5.4にアップデートするとすぐに奇妙なことが起こりました。問題は、ダウングレードが機能していないように見えることです(その後、mysql-librariesが何らかの形で壊れています)。

そして、すでに述べたように、私にとって最も奇妙なことは、セッションファイルが/tmpに作成されたときにのみ発生することです。/ tmpにセッションファイルがない場合、すべてが完全に機能します。

そして、ええ、それは私自身のプロジェクトが影響を受けるだけでなく、私が別の会社(彼らのサーバーと彼らのローカルPCでチャームのように動作する)のために取り組んでいるので、私自身のコード内の問題と矛盾します(同じように2つのZendFrameworkプロジェクトで発生します)。

そしてもちろん、私のプロジェクトは、PHP5.2.12を使用したオンラインWebスペースでもチャームのように実行されます。

以前のPHPの通知も興味深いものになると思います。

Notice: Array to string conversion in /srv/http/bahasa/library/Zend/Session/Exception.php on line 58

Call Stack:
0.0009     134352   1. {main}() /srv/http/bahasa/public/index.php:0
0.2805    3703732   2. Zend_Application->run() /srv/http/bahasa/public/index.php:30
0.2805    3703756   3. Zend_Application_Bootstrap_Bootstrap->run() /srv/http/bahasa/library/Zend/Application.php:366
0.2806    3703876   4. Zend_Controller_Front->dispatch() /srv/http/bahasa/library/Zend/Application/Bootstrap/Bootstrap.php:97
0.2873    3829732   5. Zend_Controller_Plugin_Broker->routeStartup() /srv/http/bahasa/library/Zend/Controller/Front.php:908
0.2873    3829820   6. Skoch_Controller_Plugin_Autologin->routeStartup() /srv/http/bahasa/library/Zend/Controller/Plugin/Broker.php:237
0.2883    3840992   7. Zend_Auth->hasIdentity() /srv/http/bahasa/library/Skoch/Controller/Plugin/Autologin.php:12
0.2884    3841016   8. Zend_Auth->getStorage() /srv/http/bahasa/library/Zend/Auth.php:141
0.2960    3980864   9. Zend_Auth_Storage_Session->__construct() /srv/http/bahasa/library/Zend/Auth.php:91
0.2960    3981072  10. Zend_Session_Namespace->__construct() /srv/http/bahasa/library/Zend/Auth/Storage/Session.php:87
0.2961    3981232  11. Zend_Session::start() /srv/http/bahasa/library/Zend/Session/Namespace.php:143
0.2968    3989956  12. session_start() /srv/http/bahasa/library/Zend/Session.php:469
0.2972    3997536  13. PropelAutoloader->autoload() /srv/http/bahasa/library/Zend/Session.php:0
0.3000    4060508  14. require('/srv/http/bahasa/application/models/bahasa/User.php') /srv/http/bahasa/library/propel-1.6.4/runtime/lib/util/PropelAutoloader.php:108
0.3377    4925056  15. Zend_Session_Exception::handleSessionStartError() /srv/http/bahasa/library/propel-1.6.4/runtime/lib/util/PropelAutoloader.php:16

ただし、Propelは独自のコード内にsession_start()を持っていないようであるため、それが原因ではありません(propelもチェックされたプロジェクトディレクター内にあります)。

個人的には、この通知の完全な意味はまだわかりませんが、長く見ると、エラーに関連しているように見えます(少なくともスタックトレース、つまり、通知は配列から文字列への変換のみに関するものです)。

Zend_Session :: start()の呼び出しのバックトレース

さて、Zend_Session::start()2回呼び出されたときのバックトレースを見つけました。

初め:

#0  Zend_Session::start(1) called at [/srv/http/bahasa/library/Zend/Session/Namespace.php:143]
#1  Zend_Session_Namespace->__construct(Zend_Auth) called at [/srv/http/bahasa/library/Zend/Auth/Storage/Session.php:87]
#2  Zend_Auth_Storage_Session->__construct() called at [/srv/http/bahasa/library/Zend/Auth.php:91]
#3  Zend_Auth->getStorage() called at [/srv/http/bahasa/library/Zend/Auth.php:141]
#4  Zend_Auth->hasIdentity() called at [/srv/http/bahasa/library/Skoch/Controller/Plugin/Autologin.php:12]
#5  Skoch_Controller_Plugin_Autologin->routeStartup(Zend_Controller_Request_Http Object ([] => Array ([0] => _GET,[1] => _POST),[] => /de/,[] => ,[] => ,[] => ,[] => Array (),[] => ,[] => Array (),[] => ,[] => ,[] => module,[] => ,[] => controller,[] => ,[] => action)) called at [/srv/http/bahasa/library/Zend/Controller/Plugin/Broker.php:237]
#6  Zend_Controller_Plugin_Broker->routeStartup(Zend_Controller_Request_Http Object ([] => Array ([0] => _GET,[1] => _POST),[] => /de/,[] => ,[] => ,[] => ,[] => Array (),[] => ,[] => Array (),[] => ,[] => ,[] => module,[] => ,[] => controller,[] => ,[] => action)) called at [/srv/http/bahasa/library/Zend/Controller/Front.php:908]
#7  Zend_Controller_Front->dispatch() called at [/srv/http/bahasa/library/Zend/Application/Bootstrap/Bootstrap.php:97]
#8  Zend_Application_Bootstrap_Bootstrap->run() called at [/srv/http/bahasa/library/Zend/Application.php:366]
#9  Zend_Application->run() called at [/srv/http/bahasa/public/index.php:29]

2番:

#0  Zend_Session::start(1) called at [/srv/http/bahasa/library/Zend/Session/Namespace.php:143]
#1  Zend_Session_Namespace->__construct(Zend_Auth) called at [/srv/http/bahasa/library/Zend/Auth/Storage/Session.php:87]
#2  Zend_Auth_Storage_Session->__construct() called at [/srv/http/bahasa/library/Zend/Auth.php:91]
#3  Zend_Auth->getStorage() called at [/srv/http/bahasa/library/Zend/Auth.php:141]
#4  Zend_Auth->hasIdentity() called at [/srv/http/bahasa/library/Skoch/Controller/Plugin/Navigation.php:59]
#5  Skoch_Controller_Plugin_Navigation->dispatchLoopStartup(Zend_Controller_Request_Http Object ([] => Array ([0] => _GET,[1] => _POST),[] => /de/,[] => ,[] => ,[] => de,[] => …
4

4 に答える 4

10

さて、私はエラーを見つけました。それはあなたが見つけることができたであろうことは全く何もありませんが、一般的な答えは他の人にとって興味深いかもしれません。

一般的な答え

通知は本当にエラーと関係がありました。問題は、Zend_Session_Exceptionがsession_start()のエラーハンドラーとして登録され、session_start()が小さな通知をZend_Session_Exceptionに渡したことです。これは単なる通知ですが(本番システムでは起動されないため、そこで機能します)、Zend_Session_Exceptionが起動Zend_Session_Exception::$sessionStartErrorされ、エラーに設定されます。

このようなエラーがログに記録されるとすぐに、セッションはZend_Sessionに登録されません。session_start()自体がtrueを返したとしても

これは次の行で確認できます($startedCleanlyの戻り値を示しますsession_start()): if (!$startedCleanly || Zend_Session_Exception::$sessionStartError != null) {

具体的な答え

私の特別なケースでは、これはすべて継承の競合によるものでした。Propels(データベースORM)ベースクラスのパラメーターをサブクラスに追加しませんでした。次に、PHPは、これを修正する必要があるという通知を送信しました。

このようなPropelオブジェクトは私のセッション(User)内に存在していたため、session_start()が呼び出されたときに通知が正確に発行されました。これが、Zend_Session_Exceptionが警告された理由です。そして、それは上記のように進みました。

まだ未解決の質問

私が知らなかったのは、この動作がPHP5.4で発生した理由です。私も以前にパラメータを実装したことはありませんでしたが、セッションを解決するときに問題と見なされることはありませんでした。セッションの開始時に何かが変更されたと思います-値。

于 2012-06-29T17:21:34.173 に答える
4

PHP5.3からPHP5.4+にアップグレードした後にZend_Session_Exceptionが発生する場合は、エラーが原因で問題が発生している可能性があります。E_STRICTPHP 5.4ではE_STRICT、の一部になりましE_ALLた。

php.iniで厳密なエラーを無効にすることができます。

error_reporting = E_ALL & ~E_STRICT

例外がなくなることを期待しますが、問題はZend_Sessionクラスの次の行にあります。

$errorLevel = (is_int(self::$_throwStartupExceptions)) ? self::$_throwStartupExceptions : E_ALL;

// some code omitted
set_error_handler(array('Zend_Session_Exception', 'handleSessionStartError'), $errorLevel);

// some code omitted
set_error_handler(array('Zend_Session_Exception', 'handleSilentWriteClose'), $errorLevel);

基本的に、Zend_Session_Exceptionはエラーハンドラとして登録されerror_reporting、オプションを設定しない場合、すべてのエラーレベル(設定の設定に関係なく)に対して呼び出されthrow_startup_exceptionsます。

私にとっての解決策は、コードのstrict/noticeエラーを修正するまでオプションthrow_startup_exceptionsをに設定することでした。false

application.iniで設定できます。

resources.session.throw_startup_exceptions = false

または電話でZend_Session::setOptions()

于 2014-09-17T15:13:39.337 に答える
1

ブラウザのCookieをクリアします。PHPセッションはSIDをCookieに保存しているように見えるため、php 5.3から5.4に切り替えたときに、セッションの既存のCookie値を処理する際に問題が発生したようです。セッションデータをクリアするだけでは不十分でした。すべてのセッションデータをクリアし、ブラウザのCookieも削除してみてください。

于 2013-05-29T20:46:38.800 に答える
0

私の場合は、セッションディレクトリの書き込みモードを許可するだけでした

于 2013-05-31T13:22:49.237 に答える