Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

PHP minimalisieren

Diskussion: PHP minimalisieren im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hallöchen, für xenos 32k Wettkampf habe ich mir mal ein kleines PHP Script gebaut, das einen Dateinamen als Parameter ...

Antwort
Alt 04.06.08, 17:09   #1 (permalink)
 
Registriert seit: 22.10.05
farhaven Leistung: Z3
Likes: 3
Standard PHP minimalisieren

Anzeige

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
farhaven ist offline   Mit Zitat antworten
Alt 04.06.08, 18:04   #2 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

"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
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 04.06.08, 21:22   #3 (permalink)
 
Registriert seit: 23.03.05
xblax Leistung: 8086
Likes: 22
Standard

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.
xblax ist offline   Mit Zitat antworten
Alt 05.06.08, 00:14   #4 (permalink)
 
Registriert seit: 11.06.05
snoggo Leistung: Facit NTK
Likes: 0
Standard

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);
snoggo ist offline   Mit Zitat antworten
Alt 22.06.08, 22:26   #5 (permalink)
Themenstarter
 
Registriert seit: 22.10.05
farhaven Leistung: Z3
Likes: 3
Standard

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

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

farhaven
farhaven ist offline   Mit Zitat antworten
Alt 22.06.08, 23:48   #6 (permalink)
 
Registriert seit: 11.06.05
snoggo Leistung: Facit NTK
Likes: 0
Standard

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.
snoggo ist offline   Mit Zitat antworten
Alt 23.06.08, 10:42   #7 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

Zitat:
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...
Zitat:
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...
beavisbee ist offline   Mit Zitat antworten
Alt 23.06.08, 10:51   #8 (permalink)
Moderator
 
Benutzerbild von xeno
 
Registriert seit: 09.09.04
xeno Leistung: Pentium Ixeno Leistung: Pentium I
xeno eine Nachricht über ICQ schicken
Likes: 76
Standard

Zitat:
Original von beavisbee
Zitat:
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
xeno ist offline   Mit Zitat antworten
Alt 23.06.08, 11:16   #9 (permalink)
jmc
 
Registriert seit: 16.06.08
jmc Leistung: Facit NTK
Likes: 0
Standard

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?
jmc ist offline   Mit Zitat antworten
Alt 23.06.08, 17:04   #10 (permalink)
Themenstarter
 
Registriert seit: 22.10.05
farhaven Leistung: Z3
Likes: 3
Standard

Zitat:
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
farhaven ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » PHP minimalisieren
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61