ホームページ >バックエンド開発 >PHPチュートリアル >セッション中の配列の読み取りで問題が発生しました

セッション中の配列の読み取りで問題が発生しました

WBOY
WBOYオリジナル
2016-06-23 14:40:121800ブラウズ

この投稿は、zl2727 によって 2013-12-26 16:50:24 に最終編集されました

$query ="select * from #@__arctype where isbaike=1";        $this->dsql->Execute("bkarry",$query);		$bkarry=array();		session_start();		if(!session_is_registered("bkarry")){								while($row2 = $this->dsql->GetArray("bkarry"))        	{				$bkarry[]=$row2;			}			$bkarry2=serialize($bkarry);			$_SESSION['bkarry']=$bkarry2;								}else{					$bkarry=unserialize($_SESSION['bkarry']);		}		//unset($_SESSION['bkarry']);   		//var_dump($bkarry);		    while($row = $bkarry)        {	var_dump($row);			        }		exit();

セッションから配列を取り出した後、ループできず、メモリ不足が報告されます
致命的なエラー: 許可されたメモリ サイズは 134217728 バイトです疲れました (1176 バイトを割り当てようとしました)

問題がどこにあるのか、またはもっと簡単に書く方法を教えてください

クエリデータが 3000 個を超えていることを確認するには遅すぎます。そのため、セッションに保存して毎回呼び出したいと考えています。
ディスカッションに返信 (解決策)

メモリが不足しています

使用可能なメモリを変更するには 2 つの方法があります:

1. 直接変更します。 php.ini
memory_limit=128M
2. エントリファイルに
@ini_set('memory_limit' , '128M'); を追加します


では、セッションに保存する必要があるデータとは正確には何でしょうか? 、コードはセッションに 1 つのレコードしか保存しません。メモリが不足しています。データベースの確立に問題がありますか?
セッションはこのようにはなりません。
のデータは KEY-VALUE データベースに配置する必要があります。

問題はセッションアクセスではなく、読み込み後の処理です!
これは無限ループです

while($row = $bkarry) {  var_dump($row);}

ただし、これによってメモリ不足が発生するわけではありません

session_start();$query ="select * from #@__arctype where isbaike=1";if(! isset($_SESSION['bkarry'])) {  $this->dsql->Execute("bkarry",$query);  while($row2 = $this->dsql->GetArray("bkarry"))  {    $_SESSION['bkarry'][] = $row2;  }}$bkarry =& $_SESSION['bkarry'];

セッション自体はシリアル化されているため、自分でシリアル化する必要はありません。そして、セッションのシリアル化された文字列は、serialize の文字列よりもはるかに短いです
$bkarry を $_SESSION['bkarry'] の参照にすると、メモリを半分に減らすことができます


クエリが遅すぎるため、クエリを最適化できますSQLを作成してセッションに書き込む前に値をシリアル化できます。

foreach($bkarry as $k=>$row){} 
このように読んでください 返信してくれたモデレーターに感謝します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。