簡體   English   中英

$ _SESSION的最大大小是多少?

[英]What can be the maximum size for the $_SESSION?

我正在導入一個包含超過5,000條記錄的csv文件。 我目前正在做的是,將所有文件內容作為一個數組並逐個保存到數據庫中。 但是在腳本失敗的情況下,整個過程將再次運行,如果我再次開始逐個檢查它們,它會使用大量查詢,所以我想暫時將導入的值保存在會話中。

在會話中保留那么多記錄是一種好習慣。 或者還有其他方法嗎?

謝謝。

如果你必須分階段完成這個任務(並且這里有一些建議來改進你在一次通過中做事的方式),不要在$ _SESSION中保存csv文件......這是毫無意義的開銷,因為你已經無論如何都有磁盤上的csv文件,它只是在編寫會話數據時為進程添加了大量的序列化/反序列化開銷。

您正在一次處理一個CSV記錄,因此請計算您在$ _SESSION中成功處理的數量。 如果腳本超時或barfs,則重新啟動並讀取已處理的數量,以便知道文件在何處重新啟動。

$ _SESSION的最大大小是多少?

會話在運行時加載到內存中 - 因此受php.ini中的memory_limit限制

在會話中保留那么多記錄是一種好習慣

不 - 由於您描述的原因 - 它也會對性能產生重大影響。

或者還有其他方法嗎?

這取決於你想要實現的目標。 大多數數據庫可以直接導入CSV文件,或者提供工具,這些工具比PHP代碼更快,更有效。

C。

這不是一個好主意,因為會話數據將針對每個頁面請求進行序列化/反序列化,即使它們與您正在執行的操作無關。

我建議使用以下解決方案:

  1. 保持CSV文件位於某處
  2. 開始交易
  3. 運行插入
  4. 完成所有插入后提交
  5. 交易結束

鏈接: MySQL事務語法

如果某些操作失敗,插入將被回滾,因此您知道可以安全地重做插入而不必擔心重復數據。

回答實際問題(有人剛問了一個副本,但刪除了它有利於這個問題)

默認會話數據處理程序將其數據存儲在臨時文件中。 理論上,這些文件可以與文件系統允許的一樣大。

但是,正如@symcbean指出的那樣,會話初始化時會話數據會自動加載到腳本的內存中。 這會嚴重限制您應在會話數據中存儲的最大大小。 此外,加載大量數據會對性能產生巨大影響。

如果您需要存儲大量數據連接到會話,我建議使用您按當前會話ID命名的臨時文件。 然后,您可以根據需要處理這些文件,並盡可能在腳本的memory_limit

它取決於操作系統文件大小,無論會話大小如何,每頁默認為128 MB。

如果您正在使用Postgresql,您可以使用單個查詢將它們全部插入到pg_copy_from。,或者您可以使用pg_put_line,如示例中所示(從stdin復制),我發現在導入大量數據時非常有用。

如果使用MySql,則必須執行多次插入。 請記住使用事務,這樣如果您使用事務,如果您的查詢失敗,它將被取消,您可以重新開始。 請注意,5000行不是那么大! 但是你應該知道max_execution_time約束,它會在幾秒鍾后終止你的腳本。

對於SESSION而言,我相信你受到腳本可以使用的最大內存量的限制(php.ini中的memory_limit)。 會話數據保存在文件中,因此如果連接了許多客戶端,還應考慮磁盤空間使用情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM