webForumDet fria alternativet

Bästa filtyp för file_get_contents

PHP

8 svar · 588 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Jag ska läsa in ett antal relativt små filer till en sträng. Tänkte använda funktionen file_get_contents då den tycks vara snabbast.

Vilken filtyp är bäst att välja? Alltså vilken öppnas snabbast?

file_get_contents(fil.txt)

vs

file_get_contents(fil.php)

etc...

Tack på förhand! :)

Medlem sedan mars 20007 896 inlägg
#2

Det spelar ingen roll.

Medlem sedan aug. 20039 340 inlägg
#3

Spelar ingen som helst roll. Den enda skllinaden med .php är att filen dessutom kan köras i webbläsaren om besökaren skriver in namnet (och filen innehåller körbar kod.)

Jag vet iofs inte vad du vill åstadkomma men kan nästan säkert säga att du skulle ha fördel av att köra med en databas istället.

Medlem sedan feb. 20034 441 inlägg
#4

Nackdelen med textfilen är ju att innehållet skrivs ut direkt i browsern om man går till den direkt. Dåligt om du har känslig data i den, men det bör du aldrig, aldrig, aldrig ha ändå, så det kvittar.

Medlem sedan juni 20014 290 inlägg
#5

Sätt en extension som lite talar om vad filen innehåller.

.txt för text filer
.php för php filer
...

Och eftersom php script kan läsa utanför webroten så kan du lägga dom filerna var du vill så länge webservern kan lösa dom.

Medlem sedan jan. 20051 130 inlägg
#6

Så här ligger det till...

Jag har en del config-filer i yml-format. Dessa parsas mha sfYaml (symfony component). När dessa filer är laddade "cachar" jag dem för att, enligt mina förhoppningar, spara på serverns resurser. För visst borde det gå snabbare att köra file_get_contents på mina cache-filer istället för att vid varje request ladda yml?

Exempel 1 (file_get_contents):

// Create cache file
function createCache($array)
{
	$cache_file = 'cache/config.txt';
	$cache_file = fopen($cache_file, 'w');
			
	$content = serialize($array);
			
	fwrite($cache_file, $content);
	fclose($cache_file);
}

// Get cache
// Returns config array
function getCache($file)
{
	$content = file_get_contents($file);

	return unserialize($content);
}

En annan lösning är ju att skapa cache-filerna innehållande php-arrayer som sedan laddas mha include().

Exempel 2 (include array):

// Create cache file
function createCache()
{
	$cache_file = 'cache/config.php';
	$cache_file = fopen($cache_file, 'w');
			
	$content = '$cache = ' . arrayToString($value) . ';';
			
	fwrite($cache_file, $content);
	fclose($cache_file);
}

// Get cache
// Returns config array
function getCache($file)
{
	$cache = array();
	include($file);
	return $cache;
}

// Create string of array for cache-fil
function arrayToString($array, $str = null)
{
	$str = 'array(';
		
	foreach ($array as $key => $value)
	{
		$str .= is_numeric($key) ? $key : '"$key"';
		$str .= " => ";
		$str .= is_array($value) ? arrayToString($value, $value) : '"$value"';
		$str .= ',';
	}
		
	$str .= ')';
		
	return $str;
}

Jag tror mest på alternativ 1. Vad tycker ni? Är funktionen serialize() långsam?

Tack

Medlem sedan mars 20007 896 inlägg
#7

Alternativ två är bättre. Att serialisera tar mer prestanda än att inkludera en fil med include() eller require().

Medlem sedan jan. 20051 130 inlägg
#8

Aha, ok. Tack för ditt svar.

Tycker du kodexemplet ser vettigt ut? Något du skulle förbättra?

Vissa config-arrayer kan bli ganska omfattande, säg 2-3 tusen keys minst. Ser du något problem med det?

Medlem sedan mars 20007 896 inlägg
#9

Kodexemplet ser OK ut, för jag gissar på att skrivningar av config-filen inte sker speciellt ofta.

2k-3k värden i arrayen bör inte vara något problem att hantera för PHP, men kanske skulle du kolla på någon cache som lagrar data i minnet? Om det är ofta som denna information används alltså. T.ex. memcache eller APC kan vara alternativ, men dom kräver att du har koll på din hosting-miljö, de flesta webhotell tillhandahåller inte dessa minnes-funktioner/-klasser tyvärr.

259 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)