PHP minimalisieren

Hallöchen,

für xenos 32k Wettkampf habe ich mir mal ein kleines PHP Script gebaut, das einen Dateinamen als Parameter übergeben bekommt (der name ist 'f'). Diese Datei ist eine mit bzip2 komprimierte HTML Datei, bzw. ein Teil davon. Dieses Script entpackt also die Datei, deren Namen es übergeben bekommen hat und gibt diese Datei dann aus, wobei allerdings vorher noch ein (ebenfalls komprimierter) Header, danach ein Footer und zwischendrin für alle Seiten gemeinsames CSS sowie das Ende des Headers eingeflochten werden. Das Script sieht im Moment so aus:
Code:
<? b(a);b($_GET[f]);b(c);function b($f){if(!$f)$f=m;$h=bzopen($f,r);while($l=fgets($h)){if($l=="<!>
")b(e);($l=="<>
")?b(d):print$l;}}

was aufgerollt so aussieht:
Code:
<?
b(a);
b($_GET[f]);
b(c);

function b($f)
{	if(!$f)
		$f=m;
	
	$h=bzopen($f,r);
	
	while($l=fgets($h))
	{	if($l=="<!>\n")
			b(e);
		($l=="<>\n") ? b(d) : print $l;
	}
}

Dabei ist "a" der gemeinsame Header, "c" ist der gemeinsame Footer, "e" ist das Ende des Headers und "d" ist das gemeinsame CSS. Das Ende des Headers und der Punkt, an dem das CSS eingebunden werden muss, werden durch zwei Tags in den komprimierten HTML Daten markiert, <!> steht dabei für "hier endet der Header" und <> steht für "Hier muss das CSS hin". "m" steht für eine Defaultseite, die geöffnet wird, wenn kein Parameter übergeben wurde.

In der gepackten Form mit so wenig Whitespaces und Linebreaks wie möglich nimmt das Script 135 Byte ein. Sieht jemand eine Möglichkeit, mit der ich noch etwas mehr Platz sparen kann? Die Konformität an reguläres PHP ist mir dabei weniger wichtig als die Funktion des Scriptes, die so erhalten bleiben soll (auf bzclose($h), php und ?> und "" um die meisten Strings hab ich ja schon verzichtet, wie man sehen kann), wichtig ist allerdings, dass das Script weiterhin Standardkonformes HTML 4.01 Strict ausspuckt (also der : beim trinity operator erhalten bleibt)

mfG, farhaven
 
"echo" ist kürzer als "print" und die runden Klammern beim Ternary-Operator kannst du weglassen:

Code:
echo $l=="<>\n" ? b(d) : $l;

Du könntest auch noch damit rumspielen, die IF-Statements durch logische Operatoren zu ersetzen.

Code:
if ( $a ) $b = $c;

// ist dasselbe wie

$a && $b = $c
 
Platz sparen könntest du eventuell auch noch, indem du alle deine Projektdateien zusammen in einer Datei komprimierst und du dann immer nur einen bestimmten Bereich einliest.
 
Code:
if(!$f)$f=m;
12 Zeichen.

Code:
!$f?$f=m:'';
12 Zeichen

Edit:
Habs grad ausprobiert, funktioniert, ist aber durch die '' nicht kuerzer. Hab gedacht man koennte sie weglassen, vergiss meine Idee :)

Syntax:
Code:
(exp1) ? (exp2) : (exp3) ;

entspricht:

Code:
if (exp1)
    (exp2);
else
    (exp3);
 
Heyho und danke schonmal für die Antworten, ich habe das Script mittlerweile auf atemberaubende 123 Byte runtergedrückt, aber ich habe irgendwie das Gefühl, dass da noch mehr geht :)

So sieht das ganze im Moment aus:
Code:
<?b(a);b($_GET[f]);b(c);function b($f){$h=bzopen($f?$f:m,r);while($l=fgets($h)){$l=="<!>
"?b(e):0;echo$l=="<>
"?b(d):$l;}}

entrollt käme das dabei raus:
Code:
<? 	b(a);
	b($_GET[f]);
	b(c);
	
	function b($f)
	{	$h = bzopen($f ? $f : m,r);
		while($l = fgets($h))
		{	$l == "<!>\n" ? b(e) : 0;
			echo $l == "<>\n" ? b(d) : $l;
		}
	}

Wie ihr sehen könnt, habe ich mal wieder den Ternary-Operator missbraucht, das Ding ist verflucht mächtig :D

Falls jemandem noch etwas einfällt, wie ich das Script noch kleiner bekomme: Ich bin für alle Vorschläge offen

farhaven
 
Ich bin mir nicht ganz sicher, wie das mit den register_globals war.
Wenn ich mich nicht taeusche, kann man $_GET['x'] auch per $x abrufen, wenn register_globals on ist. Das ist natuerlich eine Sicherheitsluecke in Scheunentordimensionen, aber es wuerde den Code nochmal um 6 Zeichen druecken.
 
Original von snoggo
Ich bin mir nicht ganz sicher, wie das mit den register_globals war.
Wenn ich mich nicht taeusche, kann man $_GET['x'] auch per $x abrufen, wenn register_globals on ist.
das ist soweit richtig...
Original von snoggo
Das ist natuerlich eine Sicherheitsluecke in Scheunentordimensionen, aber es wuerde den Code nochmal um 6 Zeichen druecken.
ich hab's noch nicht ausprobiert, da ich bis jetzt keine Zeit dafür hatte, aber ich glaub kaum, dass xeno derartige Scheunentore leichtsinnig drin hat, nur damit Code gekürzt werden kann...
 
Original von beavisbee
Original von snoggo
Das ist natuerlich eine Sicherheitsluecke in Scheunentordimensionen, aber es wuerde den Code nochmal um 6 Zeichen druecken.
ich hab's noch nicht ausprobiert, da ich bis jetzt keine Zeit dafür hatte, aber ich glaub kaum, dass xeno derartige Scheunentore leichtsinnig drin hat, nur damit Code gekürzt werden kann...

ganz bestimmt nicht ;)
 
von Sicherheitslücken wollen wir bei deinem Script ja besser gar nicht sprechen... und ob $_GET[x] oder $x spielt der Sicherheit wegen keine Rolle.
Eine Möglichkeit, die du noch hast ist alles direkt in PHP einzubauen oder zumindest einige Sachen wie den Typ function durch f zu ersetzen und echo durch e und while durch w, etc.
!$f?$f=m:''; sind 12 Zeichen, aber $f?'':$f=m; sind 11 ;)

PS: Wenn du bzopen benötigst benötigst du doch normalerweise auch bzread, sonst macht bzopen doch kein Sinn, nicht?
 
Wenn du bzopen benötigst benötigst du doch normalerweise auch bzread, sonst macht bzopen doch kein Sinn, nicht?

Meinem ursprünglichen Verständnis nach ja, aber bzread hat nur Mist ausgespuckt. Als ich dann mal testweise fgets anstatt bzread benutzt habe, ging es mirakulöserweise.

Das mit dem Ersetzen durch Kurzformen werde ich gleich mal ausprobieren, genauso wie den Tipp mit dem Umordnen des Ternary Operators
 
Zurück
Oben