簡體   English   中英

使用PHP和MySQL存儲用戶圖像的最佳方法是什么?

[英]What is the best way to store users images using PHP and MySQL?

我想知道使用PHP和MySQL存儲用戶上傳圖像的最佳方式是什么,如avatar等? 我應該從哪里開始? 有沒有關於此的好文章?

“最好”取決於你的目標。

存儲用戶上傳圖像的兩種主要方式是將二進制內容作為BLOB放入數據庫,或者將圖像存儲到驅動器的某個位置,並在數據庫中放入一個條目,指示哪個圖像屬於哪里。

將圖像放在數據庫中的優點是不需要在Web服務器上使用任何類型的文件系統權限,並且如果您從多個Web服務器提供站點,則會刪除任何類型的同步問題。 但是,隨着時間的推移,它會使您的數據庫變得龐大,如果您沒有正確設計表,那么它絕對會損害您的性能和可伸縮性。

將圖像作為文件存儲在文件系統上具有額外的優點,使得檢索非常快速和有效,因為Web服務器非常擅長提供靜態文件。

編輯添加

如果您決定將文件內容存儲在數據庫中,則絕對不要將其放在需要快速訪問的表中。 例如,如果您在幾乎每個網頁瀏覽中都搜索了“用戶”表,那么該表就不是放置文件內容的地方。 而是創建一個單獨的“圖像”或“文件”表,其中包含文件和相關的元信息。

將每行的大量字節放入表中會使該表使用起來非常慢。 你不希望看到大量使用的表格中的那種東西。

圖像應該存儲在文件系統中,原因有兩個:

  • 代理和If-Modified-自Web請求: Apache可以為您處理If-Modified-Since HTTP標頭並返回304響應,這就是您可以獲得的最佳性能。 在ISP發布的反向Squid代理和代理將嘗試利用這一點。

  • 病毒掃描:如果您允許任何文件上傳,那么混蛋會嘗試上傳可怕的內容,看看它們是否會破壞您的網站。 想要針對用戶上傳運行ClamAV等來查看是否存在問題並非沒有道理。 如果要掃描記錄中的惡意軟件,則不希望占用數據庫。

  • 架構簡單性:如果允許文件上載,則還需要添加有關MIME類型,文件大小,高度和寬度的元數據。 如果文件本身與表中的MIME類型不匹配,則需要對表中的select進行編碼並將其流式傳輸到/usr/bin/file shell_exec( "/usr/bin/file /path/to/mumble" )可以簡化得多。

  • 縮略圖:用戶圖像上傳可能需要用拇指釘,這通常比實際的Web請求更容易完成。 當一些有意義的用戶嘗試上傳由他們的專業攝影師伙伴給他們的150MB photoshop文件時,真的不是很有趣,並且當你試圖在Web工作者的內存空間中加載ImageMagick庫時,你的apache實例會轉到OOM。 對於apache worker來說,這真的無法擴展。 在Apache之外創建一個工作隊列/ cron作業來處理這項工作。

  • 表損壞:哇,如果您的MySQL索引文件被破壞並且您需要在該表上執行脫機表修復,那么您並不真的想要削弱所有用戶頭像。

  • 備份和恢復:你真的不想用mysqldump鎖定一個大表。 使用rsync將為您節省大量時間並為您提供更大的靈活性。 表通常會在整個表中恢復一次 - 表通常不會以較小的塊備份。

在服務器上為每個用戶創建一個新目錄,其用戶ID是目錄的名稱,並將用戶的圖像保存在其中。 每當您想要顯示用戶的圖像時:

<img src="<path>/users_images/<user_id>/thumb.gif" />

如果我是你,我只是將圖像保存在你的站點目錄中的某個地方,然后將鏈接保存到MySQL中的圖像,如果你真的想將它保存在數據庫中,我會把它讀成一個字符串,然后是base64_encode()然后將其保存在數據庫中。

通過將它們存儲在數據庫中,您將面臨各種各樣的小問題,您將不得不創建腳本來回顯它們,並且服務器和數據庫負載將大大增加。 如果我是你,我只會存儲參考。

我建議你有一個表存儲用戶數據的表,如用戶名,名字。 在該表中創建一個名為“avatar”的字段,您可以在其中存儲文件引用。

假設您的用戶頭像存儲在:htdocs / images / avatars /並且用戶apikot將頭像“avatar.jpg”再次存儲在數據庫中,則可以在生成圖像標記時編譯以下URL:“/ htdocs /圖片/化身/ avatar.jpg”。

以下是將圖像以二進制形式存儲在MySQL數據庫中的示例 我不太確定是否有任何優勢。 我會留給別人發表評論。

另一種方法是將圖像的位置存儲在列中並查詢它以進行引用。

創建一個BLOB類型字段,並插入file_get_contents($ ImageFile)的結果

暫無
暫無

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

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