PHP referans veritabanı bağlantısı Passing

8 Cevap php

Bir veritabanı bağlantısı referans veya değer tarafından geçirilen olmalıdır eğer soru?

Benim için ben özellikle MySQL bağlantısı için bir PHP sorguluyor değilim, ama tüm veritabanları için geçerlidir düşünüyorum.

PHP bunu bellekte kopyalanan ve bu nedenle hemen iki kat daha fazla bellek kullanır ki, bir işlevi veya nesne bir değişken geçirdiğinizde duydum. Ben de değişiklikler (böyle bir diziden çıkarıldı eklenen bir anahtar / gibi) değerine yapılmıştır kez sadece kopyalanan duydum.

Bir veritabanı bağlantısı, ben sorgu son insert id veya num satırları gibi şeyleri değiştirebilir gibi işlev içinde değişti ediliyor düşünürdüm. (Bu başka bir soru sanırım:? Bağlantısı ya da gerçek bir çağrı içinde depolanan sayısı satır ve insert id gibi şeyler geri veritabanına yapılır edilmiştir)

Bağlantı başvurusu veya değeri tarafından geçirilir Yani, eğer bellek veya hızını akıllıca önemli? Bu 5 vs bir fark PHP 4 yapmak mı?

// $connection is resource
function DoSomething1(&$connection) { ... }
function DoSomething2($connection) { ... }

8 Cevap

PHP kaynak zaten başlı başına bir referans özel bir türüdür. Değere veya açıkça referans geçirmeden bir fark (yani, hala bir referans var) yapmaz. Sen PHP4 altında kendiniz için kontrol edebilirsiniz:

function get_connection() {
  $test = mysql_connect('localhost', 'user', 'password');
  mysql_select_db('db');
  return $test;
}

$conn1 = get_connection();
$conn2 = get_connection(); // "copied" resource under PHP4

$query = "INSERT INTO test_table (id, field) VALUES ('', 'test')";
mysql_query($query, $conn1);
print mysql_insert_id($conn1)."<br />"; // prints 1

mysql_query($query, $conn2);
print mysql_insert_id($conn2)."<br />"; // prints 2

print mysql_insert_id($conn1); // prints 2, would print 1 if this was not a reference

Sizinle ilgili olmalıdır hız, ancak bellek değil.

PHP 4, veritabanı bağlantıları ve resultsets gibi şeyler açıkça referans olarak kabul edilmelidir. PHP 5, bu otomatik olarak yapılır, o yüzden açık yapmak zorunda değilsiniz.

BTW, veritabanı oluşturmak için kolları Tekil yöntemler iyi bir fikir vardır: Eğer $db = & Database::Connection(); yapmak ve her zaman doğru tanıtıcı alabilirsiniz. Bu sizin için (otomatik açılması gibi) ekstra büyü yapabileceği bir küresel ve statik yöntemi kullanarak sizi kurtarır. Sadece uygulama, birden fazla veritabanı ihtiyacı olduğunu yeterince terazi ne zaman dikkatli olun: daha sonra sihirli bir işlev doğru olanı size geri teslim etmek nasıl bilmek gerekir. IME bu derece zor değildir; Bunu çözmek için temel yolu doğru bir sormak için bilmek DB kolu ihtiyacı kod katmanı içindir.

Çağrı-time pass-by-reference amortismana tabi ediliyor, bu yüzden yöntemini ilk tarif kullanmak olmaz. Ayrıca, genel olarak konuşursak, kaynaklar varsayılan PHP 5 içinde referans olarak geçirilir. Yani herhangi referanslar gerekli olmamalıdır sahip ve gerçekten ihtiyacınız olmadıkça, birden fazla veritabanı bağlantısını açmak asla.

Şahsen, benim veritabanı bağlantıları için bir tek fabrika sınıfını kullanın, ve ben bir veritabanı başvurusu gerektiğinde ben sadece Fabrikası :: veritabanı () diyoruz, bu şekilde birden çok bağlantı veya referans alma / geçen hakkında endişelenmenize gerek yok.

<?php
Class Factory
{
  private static $local_db;

/**
* Open new local database connection
*
* @return MySql
*/
public static function localDatabase() {
	if (!is_a(self::$local_db, "MySql")) {
		self::$local_db = new MySql(false);
		self::$local_db->connect(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
		self::$local_db->debugging = DEBUG;
	}
	return self::$local_db;
}
}
?>

Bir veritabanı connection aslında temel değerlerini tutmaz, bu yüzden bir işlev içinde yapılan atamaları kaybetme konusunda endişelenmenize gerek yok. "Tamam, DB Bağlantı 12 bir sorgu için kullanılacak temizlenir" - - Mecazi, bir pist sayı, demek gibi bir DB connection düşünebilirsiniz sorgu ve {[(2 set sonuç )]} bağlantısı ve bir süre için özel erişim gerekebilir, ancak bağlantı temel veri hakkında hiçbir şey bilmiyor.

Birkaç kişi PHP 5 için bu konuda endişelenmenize gerek yok dedi. Eğer tüm erişim için kullandığınız bir veritabanı nesnesi varsa, bu, yanlıştır. Bu durumda, aksi takdirde veritabanına yeni bir bağlantı oluşturur (genellikle) yeni bir DB nesnesi başlatır, referans geçmek gerekiyor.

Ben XDebug & kullanarak keşfetti Benim durumumda, bir halfdozen veya daha fazla veritabanı nesneleri - nazik tüm denilen olsun yıkıcı gösterir WinCacheGrind.

Açıklamak için: Ben bu işaret nedeni, bu yerine ham bağlantısı kaynak, veritabanı bağlantıları kullanarak ortak bir yol olmasıdır.

i gerçekten php için özel bir cevabım yok, ama genel olarak size bir değer tarafından geçen zaman performans sorunları karşılaşabilirsiniz açıkça emin değilseniz referans ile bu geçirmek isterim bana görünüyor.

Ben $ bağlantısı nedir veri türü emin değilim.

Bu bir PHP kaynak ise (örneğin ne () mysql_connect dönen olsun) bir dış kaynak için sadece bir referans olarak, o zaman fark yapmak gerekir.

O (bir adodb bağlantısı gibi) bir nesne ise, o zaman başka türlü nesne kopyalanan alabilir PHP4'te referans olarak geçmek gerekir. PHP5'ta o kadarıyla nesneler zaten referans tarafından tutulan olarak bildiğiniz gibi hiçbir fark yaratacak.

Genel olarak, referanslar PHP daha hızlı değildir. C aşina insanlar genellikle aynı şekilde çalışır varsayıyorum bu yüzden, C işaretçileri anlamsal benzer çünkü, ortak bir yanlış var. O kadar. Aslında (değişken bir nesne olmadığı sürece herhangi bir durumda, kötü tarzı hangisi) değişkene atamak sürece Aslında, referanslar, kopya daha küçük biraz yavaştır.

PHP gerekiyor önce bir değişken actually kopyalanamaz değil demektir copy-on-write denilen bir mekanizma vardır. Bir işleve büyük bir veri yapısı iletebilirsiniz; Sürece sadece ondan okur gibi, hiç fark etmez. Bir referans Ancak, iç kayıtlarında ek bir girişin olması gerekir, bu yüzden aslında (zar zor fark olsa da) bazı ekstra işleme alacaktı.