Ben kullanıcıların avatar gibi görüntüler ve bu yüzden PHP ve MySQL kullanarak upload depolamak için en iyi yolu nedir merak ediyorum? Ben Nereden başlanmalı? Ve bu iyi bir makale var mı?
"En iyi" Amacınız ne bağlıdır.
Kullanıcı tarafından yüklenen görüntü saklama başlıca iki yolu ya bir BLOB olarak veritabanına ikili içeriği koyarak, ya da bir yere sürücüye görüntüleri depolamak ve nereye ait hangi görüntü belirten veritabanına bir girdi sokmaktadırlar.
Veritabanında görüntüleri yerleştirerek web sunucusu üzerinde dosya sistemi izinleri her türlü gerektirmeyen bir avantaja sahiptir ve birden webserver'lerin kapalı site hizmet eğer sorunlarını senkronize her türlü kaldırır. Ancak, zaman içinde bu veritabanı çok büyük yapar, ve doğru tablolar tasarım yoksa, kesinlikle performans ve ölçeklenebilirlik öldürebilir.
Websunucu statik dosyaları hizmet çok iyi, çünkü dosya sistemi üzerinde dosya olarak görüntüleri saklamak, geri alma, son derece hızlı ve verimli yapma avantajına sahiptir.
Edited to add
Eğer veritabanında dosya içeriğini saklamak için karar verirseniz, kesinlikle hızlı bir şekilde erişilebilir gereken bir tablo koymayın. Örneğin, neredeyse her sayfa gösterimi üzerinde aranır bir "kullanıcılar" tablo var, varsa, o tablo not dosya içeriğini koymak için yer. Bunun yerine, dosyayı ve ilgili meta bilgileri içeren ayrı bir "görüntü" ya da "dosya" bir tablo oluşturun.
Bir tabloya satır başına bayt bir sürü koyarak çalışmak için bu tablo çok yavaş yapar. Sen yoğun kullanımını görmek tablolarda bu tür şeyler istemiyorum.
Görüntüler gerçekten nedenlerle bir çift için dosya sistemi üzerinde saklanmalıdır:
Sizin için HTTP başlıklarını yana-If-Modified ve 304 yanıt dönmek ve alabileceğiniz en iyi performansı hakkında Proxying and If-Modified-Since web requests: Apache işleyebilir. ISS'ler adresinde yayınlanan Ters Kalamar vekiller ve vekiller bu yararlanmak için çalışacaktır.
Virus scanning: herhangi bir dosya yüklenenler, gerizekalı onlar sitenizi büstü görmek için korkutucu şeyler denemek ve upload olacaktır izin verirseniz. Bu sorun ayakta olup olmadığını görmek için kullanıcı yüklenenler karşı ClamAV veya benzeri çalıştırmak istediğiniz mantıksız değil. Eğer kötü amaçlı yazılım için kayıtları taramak istedim eğer veritabanı bağlamak istemem.
Eğer dosya yükleme izin verirseniz Schema simplicity:, ayrıca konum MIME tipi, dosya boyutu, yükseklik ve genişlik hakkında meta veri eklemek gerekir. Dosyanın kendisi tablosunda MIME-türünü uymazsa, o zaman tablosundan seçin kod ve /usr/bin/file
içine akışı gerekir. Bu shell_exec( "/usr/bin/file /path/to/mumble" )
çok daha kolay olabilir.
Thumb-nailing: kullanıcı görüntü yüklenenler başparmak-çivilenmiş olması gerekir muhtemeldir, ve bu sık sık gerçek web isteği için yapılan asenkron çok daha kolaydır. Bazı iyi niyetli kullanıcı kendi profesyonel fotoğrafçı dostum tarafından kendilerine verilen bir 150MB photoshop dosya yüklemek için çalışır, ve web işçinin bellek alanında ImageMagick kitaplığı yüklenemedi çalışırken apache örneği OOM gittiğinde gerçekten eğlenceli değil. Bu gerçekten apache işçiler için ölçek değil. Bu işi işlemek için Apache dışında bir iş sırası / cron işi oluşturun.
Table corruption: Vay, sen gerçekten MySQL dizin dosyası borked alırsa tüm kullanıcı avatarlarını sakat istemiyorum ve bu tabloda bir çevrimdışı tablo onarım yapmak gerekir.
Backup and restore: Gerçekten mysqldump büyük bir tablo kilitlemek istemiyorum. Rsync size zaman tasarrufu ve size çok daha fazla esneklik verir. Tablolar genellikle bir bütün tablo bir zaman restore - tablolar genellikle küçük parçalara yedeklenen değildir.
Ben, adı gibi ilk ismi kullanıcı verilerini depolamak nerede bir tablo olan öneririz. Bu tabloda, dosya başvurusu saklayabileceğiniz "Avatar" gibi bir şey denilen bir alan oluşturabilirsiniz.
Assuming your user avatars are stored in: htdocs/images/avatars/ And user apikot has the avatar "avatar.jpg" stored agains it's user in the database, you could then compile the following url when generating an image tag: "/htdocs/images/avatars/avatar.jpg".
İşte bir example MySQL veritabanı üzerinde ikili görüntüyü depolama bulunuyor. Bunu için herhangi bir avantaj ya da varsa çok emin değilim. Ben yorum yapmak başkası için terk edeceğiz.
Bunu yapabileceği başka bir yolu sütunda görüntünün konumunu saklamak ve başvuru için bunu sorgulamak değildir.
Ben olsaydım, ben sadece siteler dizininde yerde görüntü kaydetmek ve daha sonra MySQL görüntüye bağlantı kaydetmek, gerçekten bir veritabanına kaydetmek istiyorsanız, ben bir dizeye okumak ve sonra base64_encode olur (olur) o ve veritabanına kaydetmek.
Bir veritabanında saklayarak karşıya gelecek ufak sorunlar her türlü vardır, vb onları geri yankı komut dosyaları oluşturmak zorunda olacak ve sunucu ve veritabanı yük büyük ölçüde artacaktır. Ben olsaydım, ben sadece referans olarak saklamak istiyorum.