13

Zend Framework アプリケーションをロードしようとすると、次のエラーが発生します。

致命的なエラー: /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php:462 で、「セッションは session.auto-start または session_start() によって既に開始されています」というメッセージを含む例外「Zend_Session_Exception」がキャッチされませんでした:462

スタックトレース:

#0 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143): Zend_Session::start(true)

#1 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth')

#2 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91): Zend_Auth_Storage_Session->__construct()

#3 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(141): Zend_Auth->getStorage()

#4 /www/htdocs/w00a1ed7/autospin/redaktion/application/layouts/scripts/layout.phtml(31): Zend_Auth->hasIdentity()

#5 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View.php(108): include('/www/htdocs/w00...')

#6 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View/Abstract.php(831): Zend_View->_run('/www/htdocs/w00...')

#7 /www/htdocs/w00a1ed in /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php 行 462

ローカル サーバーで とを使用Zend_Authしていますが、正常に動作しますが、運用サーバーでは上記のエラーが発生しますが、毎回ではありません。

ファイルでにsession.autostart設定されていることを確認し0ました。.htaccess

このエラーを修正するにはどうすればよいですか?


ご回答ありがとうございますが、私は session_start() をどこにも使用していません。ZF のみで動作します。

この問題は共有サーバーでのみ発生し、ローカルサーバーのスクリプトは完全に機能します。

このコードで INIT 関数を使用します。

保護された $user;

public function init()
{   
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $this->_redirect('auth/login');
    }else
    {
        $this->user = Zend_Auth::getInstance()->getIdentity();
    }
}

他のアクションが認証をチェックする必要がないように、私はすでにこのコードをindexActionにのみ設定しようとしています...しかし、まだ問題があります。

セッションまたはこのような何かについてチェックしないようにアクションに設定する方法はありますか?

よろしくお願いします

4

12 に答える 12

19

それはそれがそれであると言うものです。まだ呼び出されていないZend_Authため、新しいセッションを開始しようとします。Zend_Session::start()

問題はZend_Session::start()、セッションが開始される前に呼び出す必要があることです。しかし、 session.autostart が 0 であるため (ところで、これは.htaccessではなくphp.iniにあります)、おそらくどこかに書いているでしょう。ZF はセッションを完全に制御することを望んでいるため、これを行うことは許可されていません。つまり、グローバル セッション変数に直接アクセスするべきではありません。session_start();

それを解決するには、コードファイルを検索してsession_start()

  1. 1 つを除くすべてのオカレンスを削除します。すでに開始されているかどうかを確認するには、設定しますerror_reporting(E_ALL|E_STRICT);
  2. Zend_Session::start();すべての場所でそれを置き換えます

すべての出現が見つからない場合は、1 つの session_start(); を見つけます。それはあなたを悩ませZend_Auth::getInstance()->hasIdentity()、次のスニペットで問題をすばやく解決し ます

try {
    Zend_Session::start();
} catch(Zend_Session_Exception $e) {
    session_start();
}

アプリケーション全体で ZF を使用している場合は、2) を使用します。

于 2010-03-10T19:22:29.477 に答える
12

同じエラーが発生しました。ローカル マシンでは、すべて正常に動作しました。サーバーではありません。Zend_Session::start();私の解決策は、ブートストラップを実行する前に index.phpを入れることでした。次のようになります。

<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini'
);

error_reporting(E_ALL);
ini_set("display_errors", 1);

Zend_Session::start();

$application->bootstrap()->run();
于 2010-11-18T09:18:21.973 に答える
4

この問題が発生する主な理由は 3 つあります。

  1. session.auto_start は 0 またはオフに設定する必要があります。phpinfo(); を配置することで確認できます。任意のファイルで、ブラウザでアクセスしようとすると、auto_start が 0 またはオフになっていることを検索します。そうでない場合は、オフまたは 0 に設定します。
  2. サーバーの構成でセッションパス session.save_path を確認してください。デフォルトの構成で「セッションは既に session.auto-start または session_start() によって開始されています」というエラーが表示されている場合は、「/temp」に設定します。
  3. zend セッションの初期化の前に、コードで session_start() を使用した可能性があります。

ほとんどの場合、2 番目のオプションが理由です。

于 2012-06-28T14:31:29.730 に答える
3

PHP 5.3 とセッション フォルダーの問題またはhttp://somethingemporium.com/2007/06/obscure-error-with-php5-on-debian-ubuntu-で解決されたガベージ コレクションの問題に注意を向けたいと思います。セッション-phpini-ガベージ.

「セッションはすでに開始されています」を修正した後、GC のバグに遭遇しました。少なくとも一部のインスタンスでは、GC バグがセッション バグの根本原因であると思われます。これまでのところ、徹底的に調査するのに十分な時間がありませんでしたが、GC とセッションのバグがあなたのケースにも関連している場合はコメントしてください。

于 2011-11-02T11:10:04.800 に答える
2

あるサーバーから別のサーバーに移動する場合。もう1つの問題は、apacheが実行されているユーザーである可能性があります。新しいボックスに設定された古いボックスで別のユーザーを実行していました。古いhttpd.confの構成を使用しましたが、別のユーザーを反映するために/ var / lib / php/sessionのアクセス許可を更新するのを忘れていました。

テストするために、permsを777に変更しました。すべてが正常に機能し、エラーはなくなりました。

# cd /var/lib/php
# chmod 0777 session

そこで、パーマを返してグループを変更しました。もちろん、newApacheUserを、apacheでない場合はhttpdを実行しているユーザーアカウントに変更します。

# chmod 0770 session
# chown root:newApacheUser session

あなたがまだこの問題を抱えているかどうかをチェックするために何か:

致命的なエラー:キャッチされない例外'Zend_Session_Exception'とメッセージ'sessionはすでにsession.auto-startまたはsession_start()によって開始されています'

于 2010-11-19T21:43:41.503 に答える
2

同じエラーがありました。これは、同じセッションの 2 つのインスタンスが同時に使用された場合にのみ発生しました (たとえば、2 つのブラウザ インスタンスが同時にロードされた場合など)。これは、php が同じ ID を持つ 2 つの開いているセッションを同時に処理できないことが原因です。

于 2010-10-26T06:50:17.090 に答える
2

これが使用される場合に備えて、application/config/application.ini からセッション関連の行を取り出して、このエラーをクリアしました。

;resources.session.save_path = APPLICATION_PATH "/../data/session"
;resources.session.use_only_cookies = true
;resources.session.remember_me_seconds = 3600

問題の原因を解明してくれたchelmertzに感謝します。

于 2012-10-28T20:52:07.560 に答える
2

この問題に対して未解決の問題があります。

#25 「セッションは、session.auto-start または session_start() によって既に開始されています」というエラー メッセージが誤解を招く

于 2014-12-02T14:03:10.270 に答える
2

問題は に関連している可能性がありますsession.save_path。あなたが試すことができますini_set('session.save_path', 'path-to-your-session-storage-directory');

于 2019-11-06T08:24:30.280 に答える
1

私は同じ問題を抱えていて、これを含むすべての投稿を検索しても、同じ例外結果が得られたにもかかわらず、エラーがまったく別の原因で発生したことをリリースするまで答えが見つかりませんでした。

実際、オートロードに問題がありました。Bootstrap 中の問題のため、これが上記の例外を表示させたと思います (実際のエラーを隠しています)。

したがって、他の可能な修正をすべて行った場合は、Bootstrap の詳細をコメントアウトして、この問題を解決できるかどうかを確認してください。明らかに、ブートストラップのさまざまな部分をゆっくりと元に戻して、実際の問題を明らかにします。

于 2010-06-30T12:46:28.420 に答える