<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php &#8211; MuLus Blog</title>
	<atom:link href="https://blog.mulu.at/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.mulu.at</link>
	<description></description>
	<lastBuildDate>Tue, 18 Apr 2017 20:27:00 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>mod_xsendfile mit Symlinks emulieren</title>
		<link>https://blog.mulu.at/2017/04/18/mod_xsendfile-mit-symlinks-emulieren/</link>
					<comments>https://blog.mulu.at/2017/04/18/mod_xsendfile-mit-symlinks-emulieren/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 18 Apr 2017 20:27:00 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mod_xsendfile]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symlink]]></category>
		<category><![CDATA[wordpres]]></category>
		<guid isPermaLink="false">https://blog.muellerlukas.de/?p=234</guid>

					<description><![CDATA[Moin zusammen, heute mal wieder ein Blogpost mit hoffentlich praktischem Nutzen. Jeder, der ein bisschen in der Webentwicklung tätig war, wird früher oder später auf ein Problem stoßen, wenn er große Dateien einer bestimmten Nutzergruppe zur Verfügung stellen muss. Da gibt es mehrere Möglichkeiten mit mehr oder weniger großen Nachteilen. &#8211; Per Scriptsprache ausliefern: Kann [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Moin zusammen,</p>
<p>heute mal wieder ein Blogpost mit hoffentlich praktischem Nutzen.<br />
Jeder, der ein bisschen in der Webentwicklung tätig war, wird früher oder später auf ein Problem stoßen, wenn er große Dateien einer bestimmten Nutzergruppe zur Verfügung stellen muss. Da gibt es mehrere Möglichkeiten mit mehr oder weniger großen Nachteilen.<br />
&#8211; Per Scriptsprache ausliefern: Kann man machen, aber irgendwann greift ggf. ein eingerichtetes Laufzeitlimit. Für größere Dateien also ungeeignet.<br />
&#8211; Dateipfad kryptisch benennen: Naja, Linkweitergabe, auch nicht sonderlich toll.<br />
&#8211; Per Webserver-Modul ausliefern: Damit wären wir beim Thema mod_xsendfile. Man sagt dem Modul mit einem Header welche Datei ausgeliefert werden soll. Vorher kann man dann die Rechte prüfen, Downloads zählen, &#8230; Nachteil: Das Modul muss installiert sein.<br />
Will der Hoster das Modul nicht installieren ist das natürlich suboptimal. Da das bei mir der Fall war hatte ich vor einigen Jahren mal eine Lösung mit temporären Symlinks entwickelt. Die funktioniert zwar, aber war recht schnell &#8211; Entschuldigung &#8211; hingerotzt.<br />
Da auch andere Leute an der Lösung interessiert waren, habe ich mich noch mal ein Wochenende hingesetzt und das als PHP-Klasse und WordPress-Plugin neu angefangen. Das Ergebnis und Nutzung stelle ich in diesem Post mal vor.<br />
<span id="more-234"></span>tl;dr: Die Klasse Plugin findet ihr aktuell nur in einem Github-Repo: <a href="https://github.com/muellerlukas/simulatesendfile">https://github.com/muellerlukas/simulatesendfile</a><br />
Oder auch direkt als WordPress-Plugin: <a href="https://github.com/muellerlukas/simulatesendfile_wordpress">https://github.com/muellerlukas/simulatesendfile_wordpress</a></p>
<p>Die generelle Funktionsweise von mod_xsendfile ist in etwa so:<br />
1) Der User will eine Datei runterladen und ruft einen Link auf.<br />
2) Das entsprechende Script prüft ggf. die Berechtigung des Downloads, zählt den Download, &#8230;<br />
3) Wenn das Script die Datei aufruft schickt es einen Header (je nach Webserver &#8222;<span class="pl-s1"><span class="pl-s">X-Sendfil</span></span>e&#8220;, &#8222;<span class="pl-s1"><span class="pl-s">X-Accel-Redirect</span></span>&#8220; oder &#8222;<span class="pl-s1"><span class="pl-s">X-Lighttpd-Sendfil</span></span>e&#8220;) mit dem Pfad zur Datei und beendet die Verarbeitung.<br />
4) Das Modul fängt diesen Header ab und liefert die Datei selbst aus.<br />
5) Somit spielt die Scriptlaufzeit keine Rolle mehr und auch große Dateien können ausgeliefert werden.<br />
Das ist natürlich schön weil man so seine üblichen Prüfroutinen beibehalten kann.</p>
<p>Da mein Hoster dieses Modul nicht installieren wollte, ich aber von der Scriptlaufzeit unabhängig sein wollte, wurde also eine Lösung (zumindest für PHP-Systeme) entwickelt: Die ganz grobe Funktionsweise versuche ich mal zu erläutern.<br />
1) Eine Methode wird als shutdown-Funktion bei PHP registriert, rennt also sobald das Script beendet wird &#8211; und damit kurz bevor die Kontrolle an den Webserver zurück geht.<br />
2) Sollte keiner der Header vorhanden sein, dann gibt es nichts zu tun.<br />
3) Ansonsten wird für die Datei ein Ordner mit Zufallswert + Symlink zu der Datei angelegt. Warum nicht direkt ein Symlink mit Zufallsnamen? Easy: So kriegt der Nutzer auch den Dateinamen direkt vorgegeben.<br />
4) Die entsprechenden Header werden nun entfernt und stattdessen eine Weiterleitung zum Symlink vorgenommen. Die Kontrolle ist wieder beim Webserver und der Nutzer kann runterladen.<br />
5) Zusätzlich gibt es einen Garbage-Collector der Symlinks + Ordner älter als 1 Stunde (standardmäßig, änderbar) löscht und somit weiteren Download verhindert</p>
<p>Leider gibt es Software (wie z.B. WooCommerce) mit Prüfung ob das Modul im Apache aktiviert ist. Ist das nicht der Fall wird weiterhin über PHP selbst aufgeliefert. Bei jedem Update patchen war mir zu blöd, also hat sich dafür dann auch ein ziemlich dreckiger Hack entwickelt. Eine Datei die ins Template eingebunden werden muss (&#8222;dirtyhacks.php&#8220;) erstellt die Funktion apache_get_modules() wenn sie nicht existiert und behauptet einfach: &#8222;mod_xsendfile ist installiert.&#8220;<br />
Das funktioniert so lange wie PHP nicht selbst als Modul installiert ist (was bei den meisten Sharehostern auch nicht der Fall ist). Als Modul gibt es die Funktion und kann somit nicht einfach überschrieben werden. (Okay, mit einer PECL-Extension. Aber wenn ich die installieren kann, dann kann ich auch das Modul installieren.)</p>
<p>Das war&#8217;s eigentlich an sich auch schon. Im Repo ist auch eine kurze Readme enthalten mit einem kleinen Beispiel zur Verwendung.<br />
Dazu muss ich allerdings noch sagen: Sowohl die Klasse udn auch das WordPress-Plugin sind aktuell noch in einem sehr frühen Stadium. So gab es noch keine genauen Tests mit Windows-Systemen (ja, da gibt es wieder Unterschiede bei den Symlinks), PHP &lt;7 und nginx &amp; Lighty.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.mulu.at/2017/04/18/mod_xsendfile-mit-symlinks-emulieren/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>PHP DTAUS-Klasse</title>
		<link>https://blog.mulu.at/2010/01/10/php-dtaus-klasse/</link>
					<comments>https://blog.mulu.at/2010/01/10/php-dtaus-klasse/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 10 Jan 2010 17:18:01 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[dtaus]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sourceforge]]></category>
		<guid isPermaLink="false">http://blog.muellerlukas.de/?p=82</guid>

					<description><![CDATA[Beim Arbeiten an einer Vereinsverwaltung kam irgendwann der Punkt, an dem die Mitgliedsbeiträge halbautomatisch eingezogen werden sollten.
Deutsche Banken haben für solche Fälle (Massenlastschriften und -überweisungen) ihr eigenes Format entwickelt.]]></description>
										<content:encoded><![CDATA[<p>Beim Arbeiten an einer Vereinsverwaltung kam irgendwann der Punkt, an dem die Mitgliedsbeiträge halbautomatisch eingezogen werden sollten.<br />
Deutsche Banken haben für solche Fälle (Massenlastschriften und -überweisungen) ihr eigenes Format entwickelt.</p>
<p><span id="more-82"></span></p>
<p>Simpel gesagt besteht eine DTAUS-Datei aus 3 Teilen: A-, C- und E-Satz.<br />
Der A-Satz enthält allgemeine Infos wie Typ, Sender, Referenznummer und Ausführungsdatum.<br />
Der E-Satz enthält Checksummen aus Kontonummern, Bankleitzahlen und Betrag.</p>
<p>Das nervigste überhaupt ist der C-Satz, der mehrfach vorkommen kann. Jeder Satz steht für einen Datensatz.<br />
Name und Verwendungszeck besitzen ihr eigenes Feld, das aber max. 27 Zeichen lang sein darf.<br />
Da durchaus &#8218;mal ein längere Satz vorkommen kann, gibt es sog. &#8222;Erweiterungssätze&#8220;. Maximal 15 an der Zahl.<br />
Ein Erweiterungssatz besteht aus einer ID + 27 Zeichen. Gesamt kann also ein Name oder Verwendungszweck 432 Zeichen lang sein: 27 + 15 * 27</p>
<p>Allerdings teilen sich Name Sender, Name Empfänger, Verwendungszweck die Sätze. Damit steht z.B. folgende Möglichkeit zur Verfügung: Sendername von 54, Empfängername von 81 und Verwendungszweck von 297 Zeichen.<br />
Mehr ist einfach nicht drin.<br />
Das klingt ja an sich gar nicht mal so schlecht, wäre da nicht noch ein Haken: Es gibt 5 Blöcke in denen die Erweiterungssätze untergebracht werden.<br />
1. Block: Max. 2 Sätze<br />
3. bis 5. Block: Max. 4 Sätze<br />
6. Block: Max. 1 Satz<br />
Dabei muss allerdings jeder Block 128 Zeichen lang sein. Im Klartext: Auffüllen wenn&#8217;s nicht passt. Yay!</p>
<p>Naja, nachdem ich an diesem &#8222;Ding&#8220; mehre Tage saß, bin ich nun so weit, es als Alpha zu bezeichnen.<br />
Es muss zwar noch ein wenig dran geschraubt werden und ein Beispiel ist auch noch nötig, aber &#8222;soweit, so gut&#8220;: <a title="http://phpdtaus.sourceforge.net/" href="http://phpdtaus.sourceforge.net/">http://phpdtaus.sourceforge.net/</a></p>
<p>Viel Spaß!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.mulu.at/2010/01/10/php-dtaus-klasse/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
