ここでは初心者なので、私の間違いを許してください。
.shtml ページ (SSI) を使用して Web サイトに取り組んでいます。PHP スクリプトを .shtml ページに含めようとしています。この時点まで、すべて正常に動作しています。PHP スクリプトが組み込まれ、意図したとおりに動作します。これが実際の例です。次のディレクティブを含む security_check.php というスクリプトを含むホームページ (index.shtml) があります。
<!--#include virtual="includes/security_check.php?idOp=000&idPage=0000" -->
これは、security_check.php の PHP コードです。
<?php
session_start();
include('config.php');
include('myfunctions.php');
include('security_functions.php');
$idOp = $_GET['idOp'];
$idPage = $_GET['idPage'];
$allowedReferer = array();
// Connection to the database (defined in myfunctions.php)
$link = DB_Connect($DBhost, $DBuser, $DBpass, 1, $DBname);
// Check if the PHP session already exists. If not, create one
// (that is insert a record in the DB and returns the id, which
// will be stored in the PHP session variable).
// user ID is 0 because not logged yet
if (!isset($_SESSION['idSess'])) {
$_SESSION['idUser'] = 0;
$_SESSION['idSess'] = create_session(); // security_functions.php
}
// Please note that create_session() correctly use $_SESSION['idUser']
// in order to do its work, even if it's not passed as a parameter
// (as it should be: $_SESSION is a superglobal!) and the same goes
// for activity_supervisor().
// Defined in security_functions.php:
// it uses both $_SESSION['idUser'] and $_SESSION['idSess']
activity_supervisor($idPage,$allowedReferer,2,$link);
mysql_close($link);
?>
この時点で、ホームページが正しく表示され、sign.shtml を呼び出す「サインアップ」ボタンがあります。この sign.shtml ページには、idPage パラメーターの値 (この場合は 0001) を除いて、上記とまったく同じ include ディレクティブを持つまったく同じsecurity_check.php スクリプトが含まれています。
スクリプトが PHP セッションを認識して新しいセッションを作成しないことを期待します が、実際には毎回新しいセッションが作成されます。
PHPセッションが機能しないことに関連する他のすべての投稿をすでに読んでおり、そこで提案された解決策も試しました。- session_start() は、スクリプトが1 つしかない
ため、すべてのスクリプトの上に記述されます
- session.save_path は /var/lib/php/session に等しく、Web サーバーによって書き込み可能です
- 私はすでに session.gc_probability = 0 を設定しようとしました。 Webサーバーを再起動します(役に立たなかったので、session.gc_probability = 1に戻りました)
-別のブラウザー(つまり、FirefoxとChrome)で試しましたが、同じ結果でした
だから私は次のテストを試しました(session_start()の前の2つの空の行に注意してください:読みやすさを向上させるために、常にこのように命令を配置します)単純なtest.phpスクリプトを作成します
<?php
session_start();
if (!isset($_SESSION['foo'])) {
$_SESSION['foo'] = 1;
echo ('Value is '.$_SESSION['foo'].'<br/>');
echo ('<a href="test.php">Refresh</a>');
}
else {
$_SESSION['foo']++;
echo ('Value is '.$_SESSION['foo'].'<br/>');
echo ('<a href="test.php">Refresh</a>');
}
?>
信じられないかもしれませんが、'Refresh' をクリックするたびに値
がインクリメントされるため、PHP はセッションを認識します (test.php スクリプトは、index.shtml および sign.shtml ページと同じドメイン内にあります)。
.html ファイル (.shtml ではない) へのリンクを表示し、次に test.php へのリンクを表示するように PHP スクリプトを作成しようとさえしました。それは正しく動作します!
理由がわからなくても、PHP スクリプトが .shtml ページに含まれている場合にのみ、セッションが正しく設定されていないようです。その理由と、何よりも、この退屈な行動を回避する方法を知っているのではないでしょうか? それは機能ですか?php.ini のパラメータ設定に依存しますか?
最後のヒント:
OS: CentOS 6.3 と 2.6.32-279.el6.x86_64 カーネル
サーバーのバージョン: Apache/2.2.15 (Unix)
PHP 5.3.3
サーバーは私のものなので、必要に応じてすべてを構成できます。
前もって感謝し、長い投稿をお許しください: 私が知っている他のすべての状況で PHP セッションが完全に機能することを明確にしようとしました。