PHP bir kara karşı URL'leri test etmek için en iyi yöntemi nedir

4 Cevap php

Ben oldukça büyük bir listede sonuçlanan, çeşitli kaynaklardan URL'leri kazıma bir komut dosyası var. Şu anda Sadece ben istemiyorum siteleri filtrelemek için kullanıyorum ifadeler eğer bir koleksiyonu var. Bu tabii ki sürdürülebilir değildir, bu yüzden url maskeleri bir kara karşı filtreleme için hızlı ve güçlü bir çözüm bulmaya çalışıyorum.

Ben ile gelebilir en iyi şey Şablon bir dizi döngü ve maçları şey filtreleme. Bu gerçekten benim en iyi bahis veya daha iyi iş yapacağını başka bir yöntem var mı?

4 Cevap

Eğer alan adları, ya da hiç "değişken kısmını" olan bazı URL dışlamak istiyorsanız, bir çözüm sağ endeksi ile, sadece URL içeren bir tablo ile, bir veritabanı kullanmak ve hızlı bir maç yapmak için olabilir.

Bir dosya sığar bir SQLite DB, gibi basit olabilir ve farkeder olabilir - bir URL ele edilmemelidir olmadığını bulma sonra sadece bir konu ya da DB (which generally means "URL equals", or "URL starts with") için hızlı bir sorgu yapıyor olurdu 't bir additionnal sunucusu gerektirir.


The idea of a PHP array has one drawback : when your array will get bigger, it'll take more and more memory just to have it in memory -- and, one day or another, you'll take too much memory and will hit memory_limit ; if you have more than a couple thousands URLs, that solution might not be the best one.

Yine de, sadece URL'ler veya desen bir çift, bir PHP dizinin fikri, bunun üzerinde döngü, ve strpos (for "contains" or "starts with") veya {[(2)] ile her değeri karşılaştırarak varsa } (for regex) sadece iyi yapacak - ve uygulamak için en kolay biridir.


If you want to use some complex matching rule, using some kind of regex will probably be your only real way... Be it on the PHP side, with preg_match, or on a SQL server (MySQL, for instance, has support for regex, as far as I know -- no idea about the performances, though ; see 11.4.2. Regular Expressions for more informations)

Bir karma siteleri tutmak ve bunun gibi bakmak gerekir. basit ve şık:

	$excluded['www.google.com'] = true;
	$excluded['www.mapquest.com'] = true;
	$excluded['www.yahoo.com'] = true;

	$url = "http://www.google.com?q=barefoot+winery";

	$urlArray = parse_url($url)

	if (! isset($excluded[$urlArray['host']]))
	{
		scrape($url)
	}

Pascal bir süre sonra söylediğim gibi hafıza problemleri içine çalışacaktır. Ancak bu noktada adresler koruyarak daha büyük bir sorun olacaktır. Bu olduğu zaman, bir veritabanı için gidin.

Eğer regexes bir dizi döngü, desen belirtmek gerekiyor, muhtemelen gayet iyi.

Sadece kesin sonuç ve hiçbir desenleri görmek gerekiyorsa, sadece biraz daha hızlı olmalı düz bir dize maç yapmak için strpos veya kullanabilirsiniz.

Bellek öğelerin uzun bir liste her zaman yükleme olacak? Ben egrep veya grep iyi yöntem olacağını düşünüyorum. Linux üzerinde dosya dosya önbelleğinde kalır ve sonuçları çok hızlı olacak ve egrep dosyası aracılığıyla çalışacak beri, her apache iplik bellekte listenin bir kopyası olacak.