v2.5.2
Giriş yap

php dizisini sayfada kullanmak için nasıl saklarım.

kartal
795 defa görüntülendi

Merhaba kimseler görmeden sayfaya getirdiğim php dizim var :)

Şaka bi yana..

Ürün sayfamda ürün ve varyantları var.

Sorgudan gelen varyant bilgilerinin olduğu dizi :
$vary_info; // array

ÜRÜN ADI X

Ürün fiyatı xx

Renk
Siyah - Beyaz

Matterial
Cotton - Keten

Varyant seçtiğimde fiyat ve ürün adınıda varyanta göre değişmesini istiyorum

$vary_info içinde varyant id var ve varyant seçtiğimde seçtirmek için kullanacağım id
hazır oluyor ama sorunum

$vary_info dizisini nerede tutacağım form içinde
araştırmama göre sorgudan gelen diziyi tutamıyorum.

Ajax kullansam kullanıcı sürekli varyantlarla oynadığında sürekli sorgu atılacak

Acaba local storage kullansam sayfa açıldığında varyant bilgilerini saklamak için bunu nasıl yapıyorlar

ebykdrms
698 gün önce

hepsiburada'nın attığı sık istekler de büyük ihtimalle sunucu taraflı tutulan cache mekanizmasından yanıt alıyordur. Siz de benzeri şekilde cache mekanizmasını sunucu taraflı kurabilirsiniz.
Diyelim ki select elementinin her change olayında newdata.php dosyasına get isteği atıyorsunuz.

/newdata.php?productid=123&value=1
Normalde newdata.php bu isteğe şöyle bir kurguyla cevap verir:
1) Bu istekle gelen parametreleri al.
2) Güvenlik için parametrelerin doğru formatta gelip gelmediğini kontrol et.
3) Veritabanına bağlanıp gerekli SELECT sorgusunu yapıp cevap al.
4) Veritabanından gelen verileri istemciye göndermek üzere organize edip json'a dönüştür.
5) Verileri istemciye gönder.

Burada veritabanından direkt sorgulama yaptığınız için en güncel veriye ulaşmış oluyorsunuz.
Bir de cache mekanizmalı bir kurgu belirleyelim ve aynı istek newdata.php'ye atılmış olsun:
1) Bu istekle gelen parametreleri al.
2) Güvenlik için parametrelerin doğru formatta gelip gelmediğini kontrol et.
3) Bu isteğe karşılık gelen bir cache dosyası oluşturulmuşsa bu dosyanın içeriğini direkt gönder ve işlemi sonlandır.
4) Cache dosyası elimizde olmadığı için veritabanına bağlanıp gerekli SELECT sorgusunu yapıp cevabı al.
5) Veritabanından gelen verileri istemciye göndermek üzere organize edip json'a dönüştür.
6) Json'a dönüştürdüğün bu verileri bir cache dosyasına yazıp kaydet.
7) Verileri istemciye gönder.

Bu kurguda da eğer sunucuda cache'lenmiş bir dosya varsa sunucu o veriyi gönderir ve 3 adımda işlemi bitirir. Hem veritabanını hem kendini çok yormamış olur.
Cache'lenmiş bir dosya yoksa normal kurgusundaki gibi verileri oluşturur ve istemciye göndermeden önce cache dosyasını da oluşturur. Böylece sonraki isteklerde bu kadar uğraşmaz.
Cache dosyalarını nasıl isimlendireceğiniz size kalmış. Birbiriyle çakışması mümkün olmayacak ve sizin de manuel aradığınızda belli bir dosyası kolayca bulabileceğiniz dosya adları tercih etmeniz güzel olur.
Örneğin: /cache/active/product~id-1234~color-buz mavisi~beden-34.json gibi bir dosya adı hem göz yordamıyla aradığınızda bile kolayca bulabileceğiniz, hem ~ karakterlerinden explode etmenin kolay olması, hem de belli bir istek için benzersiz olması açısından güzel görünüyor. Ama bu sefer de dosya adı çok uzayabilir veya Türkçe karakter sorunları yaşayabilirsiniz. Verilerinizi nasıl bir dosya adıyla saklayacağınız tamamen size kalmış. İlle de göz yordamıyla bulmanın kolay olması gerekmiyor tabi. Belli bir şifreleme yöntemiyle benzersiz bir dosya adı da oluşturabilirsiniz. O zaman da dosyanın adı product-asdf123abc.json gibi bi'şey olur mesela.

İyi ama bu cache dosyaları bir kez oluştuktan sonra sunucu artık hep cache dosyalarının yanıtlarını döndürecekse veritabanında sonradan meydana gelen bir değişiklik olduğunda nasıl yeni veri istemciye iletilecek?
Bunun için cache dosyalarını silen bir mekanizmamız olması gerekiyor. Yani veritabanında bu cache dosyalarını etkileyecek bir güncelleme yapıldığında cache dosyaları sistemden silinecek. Böylece istemcilerin yaptıkları ilk istekte yeni cache dosyaları oluşturulmuş olacak.
Cache dosyalarını silen mekanizma da 2 türlü yapılabilir:
1) Yönetim panelinden veritabanında bir değişiklik yapıldığında, mesela bir ürünün fiyatı değiştiğinde, ilgili ürünle ilgili bütün cache dosyaları silinebilir. Yani bu UPDATE sorgusundan sonra bir de ilgili cache dosyalarını bulup silecek kodlar eklenir.
2) Yönetim paneline bir buton: "Cache Sil". Benim favorim bu. Sistenin tüm cache dosyalarını silen bir buton da olabilir, ürün ürün veya sayfa sayfa silen birkaç silme butonu da olabilir. Ama başlangıç için tüm siteyi temizleyen buton iyidir. Bu butona basmak yönetim panelindeki kullanıcının sorumluluğundadır. Panelde yapacağı tüm değişiklikleri yaptıktan sonra Cache Sil butonuna basar ve bütün cache dosyalarının silinmesini sağlar. Sonra siteye giren ilk istemciler yavaş cevap alsa da sonraki istemciler cache'ten cevap alacakları için hızlı yanıt alırlar.

Back-end tarafında böyle bir cache mekanizması kurarsanız sunucunuz çok yorulmaz. Veritabanınız da normalde yorulduğundan çook çok daha az yorulur. Veritabanına yapılan istekler azaldığı için sunucu maliyetleriniz de düşer.

Back-end taraflı bu önlemleri aldıktan sonra bir de üstüne front-end temelli önlemlerinizi alır, PHP'ye hiç istek atmadan döndürülebilecek verileri de istemci harafında dönebilirseniz (verileri tarayıcının ram'inde tutma yöntemiyle) iyiden iyiye hem çok performanslı hem de mininum sunucu maliyetli bir sistem geliştirmiş olursunuz.

Elbette back-end tarafında tüm bu işlemleri yaparken kendinize ayrı bir php dosyasında fonksiyonlar hazırlamalısınız. Kod tekrarına düşmemelisiniz.
Mesela addCache($key, $value) adında bir fonksiyon ile cache eklemelisiniz. Burada $key dediğim değişken, json uzantılı cache dosyanızın adı, $value da bu json dosyasına yazacağınız içeriktir.
removeCache($key) adında bir fonksiyonunuz da olmalı ve bir cache dosyasını sileceğiniz zaman hep bu fonksiyonu kullanmalısınız. Fonksiyonunuz, $key adıyla aldığı dosya adını cache dosyaları içinde bulup silecek.
Bu arada bir cache silme işleminde tabii ki cache dosyasını ille de silmek zorunda değilsiniz. Onun yerine silinecek dosyayı dosyayı mesela cache/archive/2022-06-21 09:35:32/ adlı bir klasöre de taşıyabilirsiniz. Böylece bir hata durumunda mesela undoLastCache() gibi bir fonksiyonunuz olur ve son arşivlenen cache dosyalarını bulup geri yükleme şansınız olur. Başlangıçta gerekmese de ilerleyen zamanlarda böyle tedbirler kriz yönetimi açısından iyidir.
Tabii getCache($key) gibi bir fonksiyon ile cache dosyasının içeriğini alabileceğiniz fonksiyonunuz da olmalı.
Bunun haricinde bir cache dosyasının oluşturulup oluşturulmadığını kontrol edebileceğiniz bir issetCache($key) fonksiyonunuz da olsa pek hoş olur.
Eğer bir json dosyasını cache'lerken json içine dosyanın oluşturulduğu tarihi de eklerseniz sunucu üzerinde bir cron tanımlayıp belli zamanlarda removeOutOfDateCaches() gibi bir fonksiyonla tarihi geçmiş cache dosyalarının silinmesini sağlayabilirsiniz. Veya bir cache dosyasını okuduğunuzda isCasheOutOfDate($cacheData) gibi bir fonksiyonla tarih kontrolü yapıp tarihi geçmiş bir cache dosyasının kullanıcıya gösterilmesini engelleyebilirsiniz. Örneğin bir kampanya tanımlanmıştır ve bu kampanya 3 gün geçerli olacaktır. Bu durumda bu kampanyadan etkilenen ürünlerin cache dosyaları 3 gün sonra sıfırlanmalı ve yeni cache dosyaları oluşturulmalıdır.
Muhakkak düşündükçe pek çok senaryoya göre pek çok yeni fonksiyona ihtiyaç olduğu görünecektir ama başlangıç için sadece ekleme-silme-okuma işlemleriyle başlamak uygun olur.
Yani bir cache.php dosyanız olmalı ve içinde cache klasörünüzü yönetebileceğiniz fonksiyonlarınız olmalı.

Gibi gibi şeyler...