PHP (PHP ASP Uygulama değişkenleri taklit nasıl Ayrıca) dosya izinleri ile karışıklık olmadan Önbellekleme

6 Cevap php

Ben web barındıran çeşitli kullanarak, oldukça teknik olmayan kullanıcılar tarafından dağıtılan edilecek birçok farklı müşteri / siteler, dışarı gidecek bir PHP komut dosyası önbelleğe çeşit uygulamak çalışıyorum. Nedeniyle kullanıcıların teknik olmayan doğası, ben dosya izinlerini çimdik onları soran önlemek istiyorum. Önbelleğe alma oturumları arasında olması gerekiyor, bu yüzden oturum değişkenleri kullanarak çıktı. Ben ASP bu kodlama eğer ben uygulama değişkenlerini kullanmak istiyorum, ama onlar (benim gördüğüm kadarıyla) PHP yoktur

Herkes bu başarmak konusunda herhangi bir öneriniz var mı?

İşte kabul ettik bazı olasılıklar vardır, bunlar üzerinde herhangi bir yorum yararlı olacaktır:

  • Sistem geçici klasörlerdeki dosyaları yoluyla Caching - Ben böyle bir klasör bulmak için (PHP4 benzer işlevi haddelenmiş ya da bazı ev) sys_get_temp_dir () kullanabilirsiniz. Burada dezavantaj, muhtemelen openbase_dir kısıtlama kullanarak bilgisayarlar üzerinde çalışmak olmaz edilir
  • Ben baktım bazı web sitesi de tüm kullanıcı oturumları böylece oturum değişkenleri gibi davranmaya oturum değişkenleri zorlayarak aynı oturum durumu paylaşmak yapma içine kandırma PHP bahsetti. Tabii ki şimdi ... Bu zaten korkutucu görünüyor yazı bulamıyorum. (Ben tekrar bulmak kez ben bu mesaja bağlantı ile bu soruyu güncelleme olacak)
  • Overkill gibi görünüyor - Amazon Simple Storage Service gibi bir üçüncü taraf veri deposunu kullanın
  • Ben kontrol bir sunucuda verileri önbelleğe ve müşterinin her hit oradan yeni veri indirmek var.

Bir kez daha, bu fikirleri veya herhangi yenileri üzerinde herhangi bir yorum mutluluk duyacağız.

UPDATE: paylaşılan bir oturum durumunu kullanmak için () session_id kullanarak çalıştı, ama çalışmıyor. Her oturum, herhangi bir fikir kendi "GlobalCache" korumak neden?:

// This code doesn't work, but the similar code in my answer does!

function test() {
	if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
	$_SESSION['session_count']++;


	$count = get_cache( 'count' );

	print "pre application count: $count<br>";

	if ( !$count )
		$count = 0;

	$count++;

	print "session_id: " . session_id() . "<br>";
	print "post application count: $count<br>";
	print "session_count: " . $_SESSION['session_count'] . "<br>";

	set_cache('count', $count);
}


function set_cache( $name, $value ) {
	$old_session = session_id();
	print "old_session (set): $old_session<br>";

	session_id("GlobalCache");
	print "new_session (set): " . session_id() .  "<br>";

	$_SESSION[$name] = $value;
	session_id( $old_session );
}

function get_cache( $name ) {
	$old_session = session_id();
	print "old_session (get): $old_session<br>";

	session_id("GlobalCache");
	print "new_session (get): " . session_id() .  "<br>";

	$value = $_SESSION[$name];
	session_id( $old_session );
	return $value;
}

session_start();
test();

UPDATE: , bazı aslında bazıları için mükemmel bir çözümdür memcached kullanarak önerdi, ama ben uç sunucu ortamı üzerinde kontrol yok çünkü bir seçenek değildir. Fikir insanlar sadece kutunun dışında çalışan bir hosting hesabı kadar sadece FTP yapabilirsiniz komut dosyası sahip olmaktır.

UPDATE: birisi komut ile kendi cache klasör oluşturarak önerdi, ama ben zaten yazma izinleri olan bir klasörün içinde böyle bir klasör oluşturmak için gerek değil mi?

UPDATE, SOLUTION FOUND: Ben global oturum komut sorunları bulmaktan sona erdi ve bu yönde kendi cevap attılar. Yardım için herkese teşekkürler.

6 Cevap

Tamam, paylaşılan / global oturum durumunu kullanarak ASP tarzı uygulama değişkenleri özenerek bunu nasıl anladım. İlgili güncelleme benim çalışmayan kod iki önemli değişiklikler:

  1. Oturum durumunu değiştirmek için, biz bunu başlatmak sonra, yeni bir geçiş, mevcut oturumu sona ermelidir. I) (switch_session bu işlem kapsüllü

  2. Biz oturum tanımlama çok yakında gönderilmez böylece () / ob_end_flush () ob_start kullanarak sayfanın çıktısını tampon zorunda etrafında biz oturum kimlikleri geçiş beri.

Tam çalışma kodu (çok temizledim!) Izler. Bu kolay bir IE ve Firefox penceresinde sayfa yüklenirken, ve sayaçlar yükselmeye izlemek için her birkaç kez yeniden test edilebilir:

<?php
function test() {

	// Do a regular session count
	print "session_id: " . session_id() . "<br>";
	if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
	$_SESSION['session_count']++;
	print "session count: " . $_SESSION['session_count'] . "<br>";


	// Do an application count
	$count = get_cache( 'count' );
	if ( !$count ) $count = 0;
	$count++;
	print "application count: $count<br>";
	set_cache('count', $count);
}


function set_cache( $name, $value ) {
	$old_session = switch_session("GlobalCache");
	$_SESSION[$name] = $value;
	switch_session( $old_session );
}

function get_cache( $name ) {
	$old_session = switch_session("GlobalCache");
	$value = $_SESSION[$name];
	switch_session( $old_session );
	return $value;
}

function switch_session( $session_id ) {

	// switch the session and return the original
	$old_id = session_id();

	session_write_close();
	session_id($session_id);
	session_start();
	return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

Eğer sabit bir oturum anahtarı ile oturumları kullanabilirsiniz.

http://de.php.net/manual/en/function.session-id.php:

session_id([id]) is used to get or set the session id for the current session. If id is specified, it will replace the current session id. session_id() needs to be called before session_start() for that purpose.

Uygulamanızın dir kendi önbellek dir kullanın. Çeşitli sunucu ve / veya PHP ayarları ile mücadele ve iyi taşınabilirlik almak zorunda değilsiniz oluyorlar.

"Ben kontrol bir sunucuda verileri saklar ve müşterinin her hit oradan yeni veri indirmek zorunda." Ben oy

Diğer tüm yolları bazı deliliğe yol açar.

Için memcached Çıkış php-gerçekten iyi çalışıyor.

http://www.php.net/memcache

Ben yüksek yük bekliyordum çünkü ben basit bir veritabanı sorgu sonucu önbelleğe için bir yol olarak yazar tarafından güncellenmiş işlevi kullanılır. Ben sayfa yerine sadece önbelleğe alınan değer alarak daha veritabanı sonucu yenilemek ne kadar sıklıkta tanımlayabilirsiniz ki ben de bir zaman damgası saklanır.

Ben bu önbellek fonksiyonları her isteği veritabanı için düz giderek daha çok çok çok daha kötü bir performans olduğunu söyleyebilirim. Aslında sunucu öldürdü. Ben sadece sunucu tam hız kalktı ve oldukça büyük yük bile fark edildi veritabanı sorgulama geri anahtarlamalı kez.