serializeの挙動

このQ&Aのポイント
  • phpのバージョンを4.2.2から4.3.7へとあげた際、serializeの挙動がおかしくなりました。
  • セッションすべてをファイルとして保存するためのserializeが、セッションの容量が多くなると効かなくなる問題が発生。
  • 容量が大きくなるとserializeだけでページが表示できなくなることがあり、困っています。
回答を見る
  • ベストアンサー

serializeの挙動

phpのバージョンを4.2.2から4.3.7へとあげたのですが、その際にとあるシステムのserializeの挙動がおかしくなってしまいました。 serializeで、  $str = serialize($_SESSION); このような形で、セッションすべてをファイルとして保存させる箇所があるのですが、そのセッションの容量が多くなると、どうもserializeが効かなくなるようなのです。IEでは、「ページを表示できません。」と出てきてしまいます。 セッション全体で100kbを超えるくらいの容量になることもあるのですが、そうなるとserialize($_SESSION);だけでページが表示できなくなってしまいます。 4.2.2の時は、200kb近くになっても大丈夫だったのですが…… 一応、50kbくらいになると保存は出来ますが、100kbを超える事もあり得るので困ってます。 お心当たりはございませんでしょうか? (もしかしたら、容量が大きいのが原因ではないのかもしれません。他に原因にお心当たりがあれば、よろしくお願いします。)

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んと…serializeは、 http://bugs.php.net/bug.php?id=36424 http://bugs.php.net/bug.php?id=35579 をはじめとして、正直「バグの温床」です。可能なかぎり「使用されない」事をお勧めします。 また、 serialize($_SESSION); で「200kb近く」は、パフォーマンス的にもちょっと重過ぎるように思われます。 最低限「独自にserializeを実装しなおす」か、もうちょっと手を入れられるようであれば「セッションに格納する情報の整理をする:リファクタする」などをなさったほうがよいように思われます。

labo_m
質問者

お礼

ありがとうございます。 かなりバグが多いようなのですね。もう少し考えてみます。バージョン戻すことも含めて(前のバージョンだと、この部分でのエラーは出たことがないので)

関連するQ&A

  • 処理中に変数の値が変わってしまう

    Webページでセッションに値を格納し処理を行っています。 クラスをserialize()しセッションに格納して同じページで利用しています。 このセッションに格納した値がFireFoxでは想定通りに動くのですが、 IE6.0だと特定の個所のみ突然値が変わってしまいます。 ページの一番最後で出力したセッションの値が、 次ページの一番最初で出力した場合値が変わっています。 ファイルにserialize()したデータを書き込んで見たのですが、 正しいデータを持っているにもかかわらず、 書き込んだデータは異常な値でした。 また、書き込んだ後に画面に値を表示しても正常に表示されました。 $aを画面に表示     → 正常 $aをファイルに書き込み → 異常 $aを画面に表示     → 正常 環境は PHP5.1.2 Apache2.0.48 RedHatLinux9 です。 宜しくお願いします。

    • 締切済み
    • PHP
  • IE8の挙動について

    初めて質問させて頂きます。 IE8の挙動でかなり困っております。 症状としては、 # A.php 入力フォーム  セッションにGETパラメータの値を格納し、その後フォームを出力するページです。 #B.php 入力確認ページ  A.phpで入力された内容をプログラムで入力チェックし、エラーがあった場合はエラーページへリダイレクト。 #index.php トップページ http://example.com と言う基本的なページなのですが、 A.php から B.phpへ遷移した際に、IE8の一部の環境(?)でエラーと判断されてエラーページにリダイレクトされてしまいます。 入力項目に不備は無く、よくよく調べていくと、A.phpで格納したはずのセッションパラメータが消えてしまっていました。 直接B.phpが呼ばれたのかと考え、アクセスログを確認したところ、正常の遷移でした。 そこでアクセスログを確認していたところ、 A.phpを開いた際に、何故か同一のクライアントからindex.phpへのアクセスが入っている様でした。 つまり、  url: A.php?id=xxxxx 接続   ↓  セッション格納   ↓  HTML出力   ↓  終了 これが正常の動きなのですが、 出力されたHTMLの中で、index.phpへ勝手にアクセスが発生していました。  url: A.php?id=xxxxx 接続   ↓  セッション格納   ↓  HTML出力   ↓ → index.phpへアクセス  終了 このindex.phpの中では不要なセッションを削除する処理が動いている為、削除されてしまっている為に、 A.phpの表示は正常だが、次にB.phpへ遷移した時にパラメータが不正の為、エラーとなっている。 と言う状況だと思われます。 最初クッキーが無効になっていないとか、JSとかも疑いましたが、そこはクリアでした。 ページ内で画像タグ等でindex.phpへのurlが記載されていないか確認しましたが、その様な記述はありませんでした。 一箇所だけトップページへのリンクが記述されているだけでした。 これが怪しいとは思いますが・・・・ 一番厄介なのが、この症状はIE8であれば全員出るかと言ったら違う様で、 殆の人が正常に機能しています。 極一部の方だけ発生している様です。 このサイトは15万人以上の会員を抱えていて、現在運用中のサイトで、この症状はそのサイトのお客様に発生しています。 その為、電話越しに一つ一つ確認する事も出来ず・・・・ 社内の人間や、知人等にもお手伝い願ったのですが、再現せずに困っております。 最初一人だけだったのですが、二人目の方からも電話がコールセンターに来てしまっており、 一人目の人には散々待たせてしまっているので、若干ご立腹状態らしく・・・ 二人の環境は  OS XP IE8  OS 7 IE8 です。 共通項はIE8となります。 何らかの設定が悪さしているのかとも考えていますが、社内のPCで設定をいじりまくっても再現せずです。 もう一つの共通項として、ふたりともOSって何?と言うレベルの方たちなので、設定をいじっているとも思えません。 息子さんか誰かがいじっているのかもしれませんが・・・・ http://d.hatena.ne.jp/chiheisen/20090831/1251733258 ここに書かれている内容が微妙に近いので、探したのですが、 baseタグは特に使用しておりません。 ただ、この辺りだろうなとは考えていますが、いかんせん再現させる事が出来なく・・・・ そしてお客さんに聞く事も出来ず・・・・ お手上げ状態です。 何方か御存知の方おられましたらご教授頂けますと助かります。 また、これ以上に必要な情報等御座いましたら出せる範囲となってしまいますが、お出しします。 ※サイトが特定されかねないので、すみません;; 以上何卒宜しくお願い致します。

  • プログラムの挙動が・・・

    orderform1.php→orderform2.php(form action="confirm_form2.php")→orderform3.php→complete.phpという流れの、ショッピングカート的なものを作っています。 そこで問題が起こっているのですが、 1,orderform2.php→orderform3.phpに遷移する時、入力したはずの$_SESSION['family']が表示されない。(同じ手順を踏んでいる他の$_SESSION['']は表示される) 2,orderform3.phpはいわゆる確認ページなのですが、そのページのリンクからorderform1.phpに戻り、手順に従って再びorderform2.phpにアクセスすると内容が表示されない(orderform3.phpからorderform2.phpに戻った場合は表示される) 3,テキストボックスの内容はsessionで表示させられるが、オプションボタン・チェックボックス・プルダウンメニューを入力時の状態に保持することができない(分からない) 1は恐らく、orderform2.phpかconfirm_form2.phpどちらかが原因だと思うのですが・・・ ▼confirm_form2.php session_start(); $_SESSION['error']=""; $family=$_POST['family']; $name=$_POST['name']; $huri_fami=$_POST['huri_fami']; $huri_fir=$_POST['huri_fir']; $zip=$_POST['zip']; $pref=$_POST['pref']; $add1=$_POST['add1']; $add2=$_POST['add2']; if($_POST['add3']==""){ $add3=""; }else{ $add3=$_POST['add3']; } $tel=$_POST['tel']; $email=$_POST['email']; $time=$_POST['time']; if(isset($family)){ $_SESSION['family']=$family; } if(isset($name)){ $_SESSION['name']=$name; } if(isset($huri_fami)){ $_SESSION['furi_fami']=$huri_fami; } if(isset($huri_fir)){ $_SESSION['huri_fir']=$huri_fir; } if(isset($zip)){ $_SESSION['zip']=$zip; } if(isset($pref)){ $_SESSION['pref']=$pref; } if(isset($add1)){ $_SESSION['add1']=$add1; } if(isset($add2)){ $_SESSION['add2']=$add2; } if(isset($add3)){ $_SESSION['add3']=$add3; } if(isset($tel)){ $_SESSION['tel']=$tel; } if(isset($email)){ $_SESSION['email']=$email; } if(isset($time)){ $_SESSION['time']=$time; } if($_SESSION['family']=="" && $_SESSION['name']==""){ $error.= "名字、名前が入力されていません。<br>"; }else if($_SESSION['family']==""){ $error.= "名字が入力されていません。<br>"; }else if($_SESSION['name']==""){ $error.= "名前が入力されていません。<br>"; } if($_SESSION['huri_fami']=="" && $_SESSION['huri_fir']==""){ $error.= "名字、名前のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fami']==""){ $error.= "名字のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fir']==""){ $error.= "名前のフリガナが入力されていません。<br>"; } if(!eregi('[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]', $_SESSION['zip'])){ $error.= "郵便番号が正しく入力されていません。<br>"; } if($_SESSION['add1']==""){ $error.= "市区町村が入力されていません。<br>"; } if($_SESSION['add2']==""){ $error.= "番地が入力されていません。<br>"; } if($_SESSION['pref']==""){ $error.= "都道府県が選択されていません。<br>"; } if(!eregi('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', $_SESSION['tel'])){ $error.= "電話番号が正しく入力されていません。<br>"; } if(!eregi('[a-z0-9._\-]+', $_SESSION['email'])){ $error.= "メールアドレスが正しく入力されていません。<br>"; } if($_SESSION['time']==""){ $error.= "時間帯指定が選択されていません。<br>"; } if(isset($_SESSION['error'])){ $_SESSION['error']=""; $_SESSION['error']=$error; }else{ $_SESSION['error']=$error; } header("Location: orderform2.php"); if(!$family=="" && !$name=="" && !$huri_fami=="" && !$huri_fir=="" && !$zip=="" && !$pref=="" && !$add1=="" && !$add2=="" && !$tel=="" && !$email=="" && !$time==""){ header("Location: orderform3.php"); }  長くて申し訳ないですが、少しでも分かる方、どなたか知恵をお貸しください。  他のPHPのソースは載せきれないので、補足要求があれば載せます。

    • 締切済み
    • PHP
  • php初心者です。セッションについて

    php初心者です。セッションをはじめて扱ってみているのですが、上手く行かずに困っています。 HP1でセッションに文字や数値を入れて表示、HP2でも表示というごく単純なものでセッションを試して見ているのですが上手く行かずにいます。 何か初歩的な間違いだとも思うのですが、どうにも上手くゆかず質問させていただきました。何に問題があるかアドバイスやご助言をいただければと思います。 よろしくお願いします。 ---------------------- HP1 ---------------------- <?php session_start(); //セッション開始 $_SESSION["str"] = "aiueo あいうえお"; $_SESSION["num"] = 1; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <title>session01</title> </head> <body> <p>page1</p> <?php print $_SESSION["str"]."<br />"; print $_SESSION["num"]."<br />"; ?> <p><a href="session02.php">page2へ</a></p> <?php ?> </body> </html> ---------------------- HP2 ---------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> <title>session01</title> </head> <body> <p>page1</p> <?php print $_SESSION["str"]."<br />"; print $_SESSION["num"]."<br />"; ?> <p><a href="session01.php">page1へ</a></p> <?php ?> </body> </html>

    • 締切済み
    • PHP
  • 改行コードの<BR>への変換がうまくいきません。

    はじめまして よろしくお願いします。 仕事でPHPを触れはじめたところです。 textarea タグで入力されたものをMysqlに保管し、 また表示するというようなものを作ろうとしています。 困っているのは Mysqlがどうのではなくその登録前に 改行コードを <br>タグ に変換をかけておこうというところで躓いています。 セッションを開始しておいてFormタグからの値を 次のページで受け取っています。 ここの過去ログ等を参考にしてみたのですが... $_SESSION['e_biko'] = htmlspecialchars($_POST['biko'] , ENT_QUOTES) ; $tmp_biko = ""; $tmp_biko = str_replace("\r\n", "\r", $_SESSION['e_biko']); $tmp_biko = str_replace("\r", "\n", $tmp_biko); $_SESSION['e_biko'] = str_replace("\n", "<br>", $tmp_biko); このあとでechoを使って$_SESSION['e_biko'] を表示させています。 しかし改行しないんです。<BR>タグへの変換ができておらず、表示されたHTMLのソースコードを見ると改行コードがそのまま出力されています。 HTML及びPHPの文字コードはEUCで記述しています。 開発及び確認はWindows・IE6で行っています。 何か考えられる原因、あるいはバグかあるでしょうか? ちなみに下記でも駄目でした。 $_SESSION['e_biko'] = preg_replace("/\r\n|\r|\n/", "<br>", $_SESSION['e_biko']); お分かりになられる方おられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • WMP11の挙動が色々とおかしくなりました・・・

    WMP11の挙動が色々とおかしくなり困っています ローカルに保存したMP3やWeb上のasxなど、WMPで再生されるものを踏むとWMPの画面が出ないまま再生が始まります 動画ファイルでも同じ動作をするのでわざわざタスクバーのアイコンを押さなければならなくなりました また、ローカルのMP3を再生している時にインターネットで新しいページを開いたりすると何故かノイズが入るようになってしまいます たしかFFDShow、GOMプレイヤーを入れてからそうなったような気がするんですが原因らしい設定を見つけることが出来ませんでした 違うものが原因の可能性もありますが、どなたか解決方法をご教授下さい。。。。

  • phpでCSVファイルの中身を多次元配列にしたい

    PHPを学習中です。CSVを多次元化して最後はセッションに格納し、自由に他のページでもそのセッションを読み込めるようにしたいです。 CSVの中身はコード名、商品名、値段、在庫数になっています。 while(!eof($f_pt)){  $data=fgets($f_pt);  $data=rtrim($data);  $str=explode(",",$data);  $str[0]=array($str[1],$str[2],$str[3]); } こんな風にひとまずコードに格納してwhileで回せばいいのかな??っと苦戦しています。 そしてセッションにしたあとforeachでどうやって配列で表示すればいいかわかりません。。。 アドバイス等頂けたら幸いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • sessionうまくいかない

    sessionの勉強のためにphpで簡単なページを作ってみたのですが、 sessionIDが次のページに送れてないみたいで、うまくいきません。 1ページ目 @session_start(); print session_id(); $_SESSION["ID"]=session_id(); 2ページ目 @session_start(); print session_id(); sessionの記述はこのようにしています。 環境は Windows Vista IE7 PHP5 Apache2.2 です。 よろしくお願いします。

    • 締切済み
    • PHP
  • webページの容量の調べ方。

    webページの容量の調べ方。 ページの容量はどのように調べるのでしょうか? 従量課金のモバイル接続などの際に参考にしたいです。 今はgoogleのトップページを一度表示させると何kbになるのか、と、 検索後、一覧表示したページが何kbなのか、知りたいです。 その他、開いたページごとに何kbなのかわかるととっても助かるのです。 一度googleのトップページを「名前をつけてページを保存」して、 htmlファイルの大きさと、保存された画像の大きさをすべて足してみたのですが(26kbになりました)、これだけで全てなのかなぁと、スッキリしません。 方法がありましたら、ご教示お願いいたします!!

  • IE9でセッションが保持できないのは?

    お世話になります。 現在会員サイトでindex.phpというファイルにアクセスする際にSESSION["id"]が空欄の場合、エラーページへ飛ばすというプログラムがあります。 ■index.php内のソース $headerLink = ""; if($_SESSION["id"] == ""){ $headerLink = "../error.php"; header("location:".$headerLink); } var_dump($_SESSION["id"] ); IE9の場合のみ上記でエラーページに飛ばされてしまい、その他のブラウザ(FireFox、Chrome、IE8以下)ではエラーが表示されないのですが、IE9では何か特別なSESSIONへの条件などがあるのでしょうか? var_dumpを確認してもいずれも値が入っていました。 (ちなみに上記のエラーページに飛んでしまうのは「IE9を開いて初回ログイン(index.php)にアクセスした場合のみです。エラーページにジャンプ後、再度ログインをしindex.phpにアクセスするとエラーはでなくなります)

    • ベストアンサー
    • PHP

専門家に質問してみよう