「サーバーに触れなかったと誓う」状況の1つがあります。正直なところ、PHPスクリプトには触れませんでした。私が抱えている問題は、PHPデータが異なるページ間またはページの更新間で保存されていないことです。セッション変数(たとえば$ _SESSION ['foo'] = "foo"を設定して、同じページに問題なく印刷できるため、新しいセッションが正しく作成されていることがわかります。しかし、同じ変数を使用しようとすると別のページで設定されていません!何が起こっているかを見るためにホストサーバーで使用できる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>';
?>
「ビュー」変数は、ページの更新を行った後は決して増加しません。私はこれが彼らの側の問題だと思っていますが、私は最初に完全なバカではないことを確認したかったです。
これが私のホストのサーバー(PHPバージョン4.4.7)のphpinfo()です。
すべての有用な情報をありがとう。私のホストはサーバーを変更し、もう存在していなかった/ var/php_sessions以外の別のセッション保存パスの使用を開始したことがわかりました。解決策は、すべてのスクリプトファイルでini_set(' session.save_path','SOME WRITABLE PATH');
を宣言することでしたが、それは苦痛でした。私はホストと話をしましたが、彼らは明示的にセッションパスを実際に存在するパスに設定しました。これがセッションパスに問題がある人の助けになることを願っています。
Https://とhttp://が混在していないことを確認してください。セッション変数は、安全なセッションと安全でないセッションの間を流れません。
同じ問題がありました-私に起こったことは、サーバー管理者がsession.cookie_secureブール値をOnに変更したことです。これは、Cookieが安全な接続を介してのみ送信されることを意味します。 Cookieが見つからなかったため、phpは毎回新しいセッションを作成していたため、セッション変数は表示されませんでした。
phpinfo()
を使用して、_session.*
_設定を確認します。
たぶん、情報はクッキーに保存されており、ブラウザはクッキーを受け入れません。
最初にそれを確認し、結果を返します。
また、a dumpprint_r($_SESSION);
を実行して、この変数のダンプを取得し、内容を表示することもできます。
phpinfo()
に関して、_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をfirebug拡張とともに使用して、Cookieが設定されて送信されているかどうかを確認します。
また、無関係な点については、php4.4.9がphp4シリーズの最後であるため、php5を見てください。
グループと所有者がスクリプトを実行するフォルダーのだれであるかを確認します。グループIDまたはユーザーIDが間違っている場合(たとえば、rootに設定されている場合)、セッションは適切に保存されません。
Php5でセッションを設定し、php4ページでそれを読み取ろうとすると、正しい場所が表示されない可能性があります。ページを同じphpバージョンにするか、session_pathを設定します。
私が同様の問題を抱えていたときに見つけた1つの解決策(Apache 1を備えたOSXとPHP5に切り替えた)は、1つの特定のキーを設定解除する(つまりunset($ _ SESSION ['key']);)ことで保存されないことを知っています。そのキーの設定を解除しないとすぐに保存されました。別のサイトのサーバーを除いて、これを見たことはありませんが、それは別の変数でした。どちらも特別なものではありませんでした。
ダリルさん、ありがとうございます。これは私を助けてくれました。セッション変数を削除していましたが、何らかの理由でセッションのコミットを妨げていました。今では代わりにnullに設定しているだけで(これは私のアプリには問題ありません)、動作します。
増分する前に「ビュー」の値を確認してください。何らかの奇妙な理由で文字列に設定されている場合、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のように見えます)、セッションが実際に作成されていることを確認する必要があります。
私は同じような問題の答えを探すために何年も費やしました。非常によく似たコードが同じサーバー上の別の.phpで完全に機能したため、コードやセットアップの問題ではありませんでした。問題は、このページのセッションに大量のデータが保存されていることが原因であることが判明しました。ある場所には、次のような行がありました:$_SESSION['full_list'] = $full_list
ここで$full_list
は、データベースからロードされたデータの配列でした。各行は約150要素の配列でした。コードが数年前に最初に記述されたとき、DBには約1000行しか含まれていなかったため、$full_list
には約100個の要素が含まれ、各要素は約20個の要素の配列です。時間の経過とともに、20の要素が150に、1000の行が17000になったため、コードは64メガ近くのデータをセッションに保存していました。どうやら、この量のデータが保存されているため、それ以外の保存は拒否されました。セッションに保存せずにデータをローカルで処理するようにコードを変更すると、すべてが完全に機能しました。
これは、ページのsession_start()ステートメントを誤って見逃した場合にも発生する可能性があることに注意してください。
よく見落とされる一般的な問題は、session_start()コマンドの前に他のコードや余分なスペースが存在してはならないことです。
Session_start()の前に空行があり、適切に動作しない原因になる前に、この問題がありました。
Domain.com/destpage.phpにリダイレクトするwww.domain.com/auth.phpからアクセスしていた安全なページを使用すると、この問題が発生しました。 auth.phpリンクからwwwを削除しましたが、うまくいきました。すべてが別の方法で機能したため、これは私を投げました。目的地に到着したとき、セッションは設定されていませんでした。
Php.iniを編集します。
session.gc_probabilityの値は1だと思うので、0に設定します。
session.gc_probability=0
セッションCookieパスを「/」ではなく「//」に設定しました。 Firebugは素晴らしいです。それが誰かを助けることを願っています。
他のコメントで対処していない一般的な問題の1つを次に示します。ホストが何らかのキャッシュを実行していますか?何らかの方法で結果を自動的にキャッシュする場合、このような動作が発生します。
私のソリューションを追加する:
正しいドメインにアクセスしているかどうかを確認します。私はwww.mysite.com
を使用してセッションを開始し、mysite.com
から(www
なしで)受信しようとしました。
すべてのドメインのhtaccess書き換えをwwwに追加して安全な側/サイトに追加することで、これを解決しました。
Httpまたはhttpsを使用しているかどうかも確認してください。
私が同様の問題を抱えていたときに見つけた1つの解決策(Apache 1を備えたOSXとPHP5に切り替えた)は、1つの特定のキーを設定解除する(つまりunset($ _ SESSION ['key']);)ことで保存されないことを知っています。そのキーの設定を解除しないとすぐに保存されました。別のサイトのサーバーを除いて、これを見たことはありませんが、それは別の変数でした。どちらも特別なものではありませんでした。
私がしなければならなかった別のいくつかのこと(同じ問題がありました: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テスト(情報のグーグル)。少し変更したapplication_top.phpを使用して、元のsessions.phpファイル(includes/classesおよびincludes/functions)を使用できるようになりました。 php.iniの設定が主な問題でしたが、これはもちろんサーバー会社がデフォルトとしてインストールしたものに依存します。
Session_write_close()を使用しているかどうかを確認してください。どこでも、私は別のセッションの直後にこれを使用してから、セッションに再度書き込みを試みましたが、機能していませんでした。