質問
私はそれらの1つを持っています<!> quot;私はサーバーに触れなかったことを誓います<!> quot;状況。正直なところ、PHPスクリプトには触れませんでした。私が抱えている問題は、PHPデータが異なるページ間またはページの更新間で保存されていないことです。セッション変数(たとえば$ _SESSION ['foo'] = <!> quot; foo <!> quot;を設定して、同じページに問題なく印刷できるため、新しいセッションが正しく作成されていることがわかります。同じ変数を別のページで使用しようとすると設定されません!ホストサーバーで何が起こっているかを確認するために使用できるphp関数または情報はありますか?
これは、現在のところ私のホストのサーバーで動作しないスクリプトの例です:
<?php
session_start();
if(isset($_SESSION['views']))
$_SESSION['views'] = $_SESSION['views']+ 1;
else
$_SESSION['views'] = 1;
echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>
ページの更新後、「views」変数が増分されることはありません。私はこれが彼らの側の問題だと思っていますが、私は最初に完全な馬鹿ではないことを確認したかったです。
これは私のホストのサーバー用のphpinfo()です(PHPバージョン4.4.7):
解決
すべての役立つ情報に感謝します。私のホストはサーバーを変更し、もう存在していなかった/ var / php_sessions以外の別のセッション保存パスを使用し始めたことがわかりました。解決策は、すべてのスクリプトファイルでini_set(' session.save_path','SOME WRITABLE PATH');
を宣言することでしたが、それは苦痛でした。私はホストと話をして、セッションパスを明示的に存在する実際のパスに設定しました。これがセッションパスに問題がある人の助けになることを願っています。
他のヒント
https://とhttp://が混在していないことを確認してください。セッション変数は、安全なセッションと安全でないセッションの間を流れません。
同じ問題がありました-私に起こったことは、サーバー管理者がsession.cookie_secureブール値をOnに変更したことです。これは、Cookieが安全な接続でのみ送信されることを意味します。 Cookieが見つからなかったため、phpは毎回新しいセッションを作成していたため、セッション変数は表示されませんでした。
phpinfo()
を使用して、session.*
設定を確認します。
情報はCookieに保存されているため、ブラウザはCookieなどを受け入れません。
最初にそれを確認し、結果を返します。
<!> nbsp; print_r($_SESSION);
を実行して、この変数のダンプを取得し、内容を表示することもできます。...
session.save_path
について、<=>は有効ですか? Webサーバーにはこのディレクトリへの書き込みアクセスがありますか?
これがお役に立てば幸いです。
次の問題がありました
index.php
<?
session_start();
$_SESSION['a'] = 123;
header('location:index2.php');
?>
index2.php
<?
session_start();
echo $_SESSION['a'];
?>
変数$_SESSION['a']
が正しく設定されていません。次に、index.php
を適宜変更しました
<?
session_start();
$_SESSION['a'] = 123;
session_write_close();
header('location:index2.php');
?>
これが内部的に何を意味するのかわかりません。セッション変数の変更が十分に速くなかったことを自分に説明します:)
セッション保存パスがWebサーバーによって書き込み可能かどうかを確認します。
Cookieが有効になっていることを確認してください。(何かをテストするためにCookieを無効にしたことを忘れています)
firefox拡張機能とfirefoxを使用して、Cookieが設定されて返送されているかどうかを確認します。
また、無関係な点については、php4の最後のバージョンであるphp 4.4.9であるため、php5を参照してください。
スクリプトを実行するフォルダーのグループと所有者を確認します。グループIDまたはユーザーIDが間違っている場合、たとえばrootに設定されている場合、セッションが適切に保存されません。
<!> quot; views <!> quotの値を確認します。増分する前。何らかの奇妙な理由で文字列に設定されている場合、1を追加すると、常に1が返されます。
if (isset($_SESSION['views'])) {
if (!is_numeric($_SESSION['views'])) {
echo "CRAP!";
}
++$_SESSION['views'];
} else {
$_SESSION['views'] = 1;
}
まあ、私は自分のサーバー(PHP 5)でコードをテストしたので、コードエラーを排除できます。
確認する内容は次のとおりです。
-
session_unset()またはsession_destroy()をどこで呼び出していますか?これらの関数は、セッションデータをすぐに削除します。これらをスクリプトの最後に配置すると、説明したとおりに動作し始めます。
-
すべてのブラウザで同じように機能しますか?あるブラウザで機能し、別のブラウザでは機能しない場合は、機能していないブラウザで設定の問題が発生している可能性があります(つまり、Cookieを無効にして有効にしたのを忘れたか、誤ってCookieをブロックしています)。
-
セッションフォルダーは書き込み可能ですか? is_writable()でこれをテストすることはできないので、フォルダーに移動し(phpinfo()から/ var / php_sessionsのように見える)、セッションが実際に作成されていることを確認する必要があります。
php5でセッションを設定し、php4ページで読み込もうとすると、正しい場所が表示されない可能性があります!ページを同じphpバージョンにするか、session_pathを設定します。
同じような問題の答えを探すために何年も費やしました。同じサーバー上の別の.phpでも非常によく似たコードが完全に機能したため、コードやセットアップの問題ではありませんでした。問題は、このページのセッションに大量のデータが保存されていることが原因であることが判明しました。 1つの場所には、次のような行がありました。$_SESSION['full_list'] = $full_list
ここで、$full_list
はデータベースからロードされたデータの配列でした。各行は約150要素の配列でした。数年前にコードが最初に記述されたとき、DBには約1000行しか含まれていなかったため、<=>には約100個の要素が含まれ、各要素は約20個の要素の配列です。時間が経つにつれて、20の要素が150に、1000の行が17000になったため、コードは64メガ近くのデータをセッションに保存していました。どうやら、この量のデータが保存されているため、それ以外の保存は拒否されました。セッションに保存せずにデータをローカルで処理するようにコードを変更すると、すべてが完全に機能しました。
1つの特定のキー(つまり、unset($ _ SESSION ['key']))の設定を解除することで同様の問題が発生したときに見つけた1つのソリューション(Apache 1のOSXおよびPHP5に切り替えた)を知っています保存する。そのキーの設定を解除しないとすぐに保存されました。別のサイトのそのサーバーを除いて、これを二度と見たことはありませんが、それは別の変数でした。どちらも特別なものではありませんでした。
ダリルさん、ありがとうございました。これは私を助けてくれました。セッション変数を削除していましたが、何らかの理由でセッションのコミットを妨げていました。今では代わりにnullに設定しているだけで(これはアプリに適しています)、動作します。
1つの特定のキー(つまり、unset($ _ SESSION ['key']))の設定を解除することで同様の問題が発生したときに見つけた1つのソリューション(Apache 1のOSXおよびPHP5に切り替えた)を知っています保存する。そのキーの設定を解除しないとすぐに保存されました。別のサイトのそのサーバーを除いて、これを二度と見たことはありませんが、それは別の変数でした。どちらも特別なものではありませんでした。
これは、他のコメントで対処されていない一般的な問題の1つです。ホストが何らかのキャッシュを実行していますか?何らかの方法で結果が自動的にキャッシュされる場合、このような動作が発生します。
ページ上のsession_start()ステートメントを誤って見逃した場合にも発生する可能性があることに注意してください。
セッションCookieパスを<!> quot; // <!> quotに設定しました。 <!> quot; / <!> quot;の代わりに。 Firebugは素晴らしいです。 それが誰かを助けることを願っています。
domain.com/destpage.phpにリダイレクトされるwww.domain.com/auth.phpからアクセスしていたセキュアページを使用すると、この問題が発生しました。 auth.phpリンクからwwwを削除しましたが、機能しました。すべてが別の方法で機能したため、これは私を投げました。目的地に到着したとき、セッションは設定されていませんでした。
よく見落とされる一般的な問題は、session_start()コマンドの前に他のコードや余分なスペースを入れてはならないことです。
この問題は、session_start()の前に空行があり、適切に動作しない原因になる前に発生しました。
ソリューションの追加:
正しいドメインにアクセスしているかどうかを確認します。 www.mysite.com
を使用してセッションを開始し、mysite.com
から(www
なしで)受信しようとしました。
すべてのドメインのhtaccess書き換えをwwwに追加して安全なサイト/サイトに追加することでこれを解決しました。
httpまたはhttpsを使用しているかどうかも確認してください。
php.iniを編集します。
session.gc_probabilityの値は1だと思うので、0に設定します。
session.gc_probability=0
session_write_close()を使用しているかどうかを確認します。どこでも、私は別のセッションの直後にこれを使用してから、セッションに再度書き込みを試みましたが、機能していませんでした。
他にやらなければならないことがいくつかありました(同じ問題がありました。PHPを5.4にアップグレードした後、セッションが保持されません)。サーバーのphp.iniの内容に応じて、これらの多くは必要ありません(phpinfio()を確認してください);
session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0; ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this
基本的に、php.iniはCookieなしに設定する必要があり、セッションパラメータはoscの要求と一致する必要があります。
また、application_top.phpでいくつかのセッションコードスニペットを変更する必要があります-tep_session_is_registered(...)呼び出しに存在しないオブジェクト(ナビゲーションオブジェクトなど)を作成し、$ HTTP_変数を新しい$ _SERVERに設定します空のオブジェクト(情報のためのグーグル)のためのものと他のいくつかのissetテスト。最終的には、元のsessions.phpファイル(includes / classesとincludes / functions)を少し修正したapplication_top.phpとともに使用して、物事をやり直すことができました。 php.iniの設定が主な問題でしたが、これはもちろん、サーバー会社がデフォルトとしてインストールしたものに依存します。