0

こんにちは、私は以下のスクリプトを持っています:

 <?php
   session_save_path('sessions/');
    if (!isset($_SESSION)) {
    session_start();
    }
   $loginUsername = A;

   if (PHP_VERSION >= 5.1) {session_regenerate_id(true); } else {session_regenerate_id();}
$_SESSION['wallet_email'] = $loginUsername;
   echo  $_SESSION['wallet_email']

?>

新しいセッション ID が生成されると、「session_save_path('sessions/')」で指定されたパスが失われることに気付きました。これは、新しいセッションを作成できないことを意味します。

実際に次のエラーが発生します。

Warning: Unknown: open(sessions//sess_7af5c5f2f2bd83afff0203cc45190260, O_RDWR) failed:    No such file or directory (2) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (sessions/) in Unknown on line 0

これについて緊急の助けが必要です。

4

1 に答える 1

1

前述のように、パラメータには絶対パスを使用してくださいsession_save_path( )。理由は次のとおりです。

session_save_path( )前者へのパラメーターとして相対パスを使用すると、うまく連携しsession_regenerate_id( )ません。私のセットアップ (Windows 7、Apache 2.2.25、php 5.3.27) では、c:\www\test に次の index.php があります。

<?php
date_default_timezone_set( 'America/New_York' );
ini_set( 'session.save_path', './sessions' );
//ini_set( 'session.save_path', 'c:/www/test/sessions' );

session_start( );
if ( !isset( $_SESSION[ 'count' ] )) {
    $_SESSION[ 'count' ] = 0;
}
$s1 = session_id( );
$b1 = $_SESSION[ 'count' ]++;
//session_regenerate_id( true );
$s2 = session_id( );
$b2 = $_SESSION[ 'count' ]++;
?>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <h1>Test</h1>
        <p><?php echo "$s1: $b1"; ?></p>
        <p><?php echo "$s2: $b2"; ?></p>
    </body>
</html>

あなたが思うように動作します。スクリプトを参照すると、次のようになります。

  • 同じセッション ID が 2 回出力されます。
  • 各セッション ID の後に整数が続きます。
  • 2 番目の整数は最初の整数よりも 1 大きくなります。
  • ページを更新すると、連続する更新ごとに整数が 1 ずつ大きくなります。
  • セッション ファイルはディレクトリ c:\www\test\sessions にあります (このディレクトリは事前に作成する必要があります - PHP は作成しません!);
  • そのセッション ファイルは、連続する更新ごとに更新されます。

session_regenerate_id( ) コマンドのコメントを外してスクリプトを参照すると、次のようになります。

  • 2 つの異なるセッション IDを取得します。
  • 更新時に、最初のセッション ID は前のページの 2 番目のセッション ID と同じです。
  • 整数は常にそれぞれ 0 と 1 です。
  • c:\www\test\sessions にセッション ファイルがありません。(regen() に「false」を渡すと、一連の空のセッション ファイルが蓄積されます。)

代わりに 2 番目の ini_set コマンド (フル パスを指定) を使用すると、正常に動作します。

問題は、再生成関数が PHP を混乱させることのようです: 再生成後、PHP はセッション ファイルを c:\Program Files\Apache Software Foundation\Apache2.2\sessions に書き込みます。まだ作成されていません。2 番目のセッション ディレクトリを作成すると、そこにセッション ファイルが表示されることがわかりました。しかし、session_start( ) を呼び出したときに PHP がそこを調べていないため、蓄積されたセッションの知識はすべて、スクリプトの呼び出しの間に失われます。

「php_errors.log」に「ディレクトリが存在しません」というエラーメッセージが表示されなかったため、これを理解しただけです-少なくとも、期待していた場所ではありません。Apache2.2 ディレクトリで、その名前の別のファイルを見つけました。php.ini では、ディレクトリ パスを指定せずに、error_log ディレクティブに単純なファイル名を指定しました。再生成コマンドが c:\www\test\php_errors.log に移動する前に生成されたエラー メッセージはすべて、再生成後に Apache ディレクトリ内のファイルに移動しました。そのため、再生成の混乱の原因は、セッション機能を超えて拡大しているように見えます。

于 2014-01-30T18:58:22.573 に答える