<?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>Martin Specht &#187; APC</title>
	<atom:link href="http://www.martin-specht.com/tag/apc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.martin-specht.com</link>
	<description>Multimedia-Producer</description>
	<lastBuildDate>Sun, 09 Oct 2011 21:35:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Progressbars in PHP-Projekten</title>
		<link>http://www.martin-specht.com/2008/10/14/progressbars-in-php-projekten/</link>
		<comments>http://www.martin-specht.com/2008/10/14/progressbars-in-php-projekten/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 12:45:58 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Installation]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Progressbar]]></category>
		<category><![CDATA[Status]]></category>
		<category><![CDATA[Statusanzeige]]></category>
		<category><![CDATA[Upload]]></category>

		<guid isPermaLink="false">http://www.martin-specht.com/?p=63</guid>
		<description><![CDATA[Progressbars sind mittlerweile ein g&#228;ngiges Mittel, um Statusanzeigen zu realisieren. Seit 2003 nutze ich diese in verschiedenen Projekten, jedoch waren die Mittel, diese zu regeln, in der Vergangenheit eher holperig, unkomfortabel oder instabil gel&#246;st. Musste in Projekt umziehen oder gab es neue Browser oder auch Flash-Versionen, begann die Konfiguration und das R&#228;tselraten von neuem. CGI und Flash oder per Output-Buffer gesteuerte Javascript-Bars waren immer instabil und hielten selten l&#228;nger als ein Jahr in einem Projekt aus.]]></description>
			<content:encoded><![CDATA[<h2>Einf&#252;hrung</h2>
<p>Progressbars sind mittlerweile ein g&#228;ngiges Mittel, um Statusanzeigen zu realisieren. Seit 2003 nutze ich diese in verschiedenen Projekten, jedoch waren die Mittel, diese zu regeln, in der Vergangenheit eher holperig, unkomfortabel oder instabil gel&#246;st. Musste in Projekt umziehen oder gab es neue Browser oder auch Flash-Versionen, begann die Konfiguration und das R&#228;tselraten von neuem. CGI und Flash oder per Output-Buffer gesteuerte Javascript-Bars waren immer instabil und hielten selten l&#228;nger als ein Jahr in einem Projekt aus.</p>
<p>Dank der &#8220;Erfindung&#8221; von Ajax war man daraufhin in der Lage, f&#252;r Prozesse, die nach einem Request durchgef&#252;hrt wurden, bereits gute und fl&#252;ssige Prozessanzeigen zu realisieren. In verschiedenen Projekten habe ich beispielsweise Datensammlungen oder das Erstellen von ZIP-Archiven visuell dargestellt.</p>
<p>Mit der PHP-Version 5.2 l&#228;sst sich nun auch &#252;ber die Extension APC ein Upload mit einer Progress-Anzeige sinnvoll l&#246;sen, denn im Wesentlichen ver&#228;ndert sich nichts. Um dieses Feature zu nutzen, sind jedoch ein paar Vorbereitungen n&#246;tig:</p>
<h2>1. Installation von APC</h2>
<p>Ben&#246;tigt werden:</p>
<ul>
<li>Root-Zugriff auf die Kommandozeile</li>
<li>ein installiertes und auf Kommandozeilenebene funktionsf&#228;higes PEAR bzw. PECL</li>
<li>Internet-Zugriff</li>
</ul>
<p>Zun&#228;chst einmal wird APC mittels PECL installiert:</p>
<blockquote><p>testserver:~# pecl install apc</p></blockquote>
<p>Bei der darauffolgenden Frage die Option APCX &#228;ndern auf &#8220;NO&#8221;</p>
<blockquote><p>Use apxs to set compile flags (if using APC with Apache)? [yes] : no</p></blockquote>
<p>Nun folgen etliche Zeilen Kompilierung und Installation. Abh&#228;ngig vom System (in meiner Debian-Testumgebung ist es zwingend notwendig) muss in die php.ini bzw. im Debian in eine separate Datei</p>
<blockquote><p>extension=apc.so</p></blockquote>
<p>eingetragen werden.</p>
<div id="attachment_64" class="wp-caption alignleft" style="width: 310px"><a href="http://www.martin-specht.com/wp-content/uploads/2008/10/apc.gif"><img class="size-medium wp-image-64" title="APC-Eintrag" src="http://www.martin-specht.com/wp-content/uploads/2008/10/apc-300x100.gif" alt="AUsschnitt aus der PHP-Info zum APC-Eintrag" width="300" height="100" /></a><p class="wp-caption-text">Ausschnitt aus der PHP-Info zum APC-Eintrag</p></div>
<p>Ein Neustart des Webservers sollte nun &#8211; oh Wunder &#8211; die Extension geladen haben. Dies l&#228;sst sich am einfachsten &#220;ber eine Ausgabe der phpinfo(); pr&#252;fen, hier sollte es einen neuen Eintrag zu APC geben. Sofern APC-Support &#8220;enabled&#8221; ist, kann es weitergehen mit dem PHP-Teil der Installation. Sollte das Modul noch nicht aktiviert sein, hilft in der Regel ein Basiseintrag in der php.ini:</p>
<blockquote><p>[APC]<br />
apc.enable_cli=0<br />
apc.enabled=1<br />
apc.num_files_hint=1024<br />
apc.optimization=0<br />
apc.rfc1867=1<br />
apc.shm_segments=1<br />
apc.shm_size=128<br />
apc.ttl=7200<br />
apc.user_ttl=7200</p></blockquote>
<h2>2. PHP-Dateien und deren Funktionsweise</h2>
<p>Grunds&#228;tzlich funktioniert das Uploaden nun in der Weise, dass PHP in der Lage ist, einen weiteren Request aus der gleichen Quelle parallel zum laufenden Request zu beantworten. Dies bedeutet, dass man eigentlich nur daf&#252;r sorgen muss, dass PHP w&#228;hrend des Uploads brav antwortet, wieviel Upload statt fand. Hierf&#252;r sind folgende Codeschnipsel notwendig:</p>
<h3>Das Formular in der HTML-Datei:</h3>
<p><code>&lt;form action="upload.php" method="post" target="uploadFrame" enctype="multipart/form-data"&gt;<br />
</code></p>
<p><code> &lt;input type="file" name="upload" /&gt;<br />
&lt;input type="hidden" name="APC_UPLOAD_PROGRESS" value="&lt;?php echo </code><code> md5(uniqid(rand(), true)); ?&gt;" /&gt;</code><code><br />
&lt;button type="submit" onclick="this.disabled=true;   setTimeout('requestStatus(\''+this.form.APC_UPLOAD_PROGRESS.value+'\')', 1000);"&gt;Abschicken&lt;/button&gt;<br />
&lt;/form&gt;</code></p>
<p>Zu beachten ist, dass APC mit dem versteckten Feld APC_UPLOAD_PROGRESS mitgeteilt wird, wie die eindeutige Id f&#252;r diesen Upload lautet. Der Bezeichner muss mit der Angabe apc.rfc1867_name in der PHP-Konfiguration &#252;berein stimmen.</p>
<p>Zus&#228;tzlich muss in den HTML-Code ein IFrame eingebaut werden, an welches die Upload-Datei geschickt wird. Dies wird notwendig, weil alle g&#228;ngigen Browser durch das Abschicken des Formulars im gleichen Fenster die Seite blockieren w&#252;rde und &#196;nderungen im HTML-Code dann nicht mehr m&#246;glich sind.</p>
<p><code>&lt;iframe src="blank.html" name="uploadFrame" style="display:none"&gt;&lt;/iframe&gt;</code></p>
<p>Zus&#228;tzlich sollte fehlt nat&#252;rlich noch ein Platz, um den Upload-Status anzuzeigen. Hier sind mehrere Varianten denkbar, f&#252;r einen ersten Test reicht zun&#228;chst erst einmal ein leeres DIV.</p>
<p><code>&lt;div id="divStatus"&gt;&lt;/div&gt;</code></p>
<h3>Die Datei f&#252;r den Empfang des Uploads (upload.php)</h3>
<p>An dieser simplen Funktion &#228;ndert sich genau nichts, der Upload funktioniert hier genau gleich:</p>
<p><code><br />
&lt;?php<br />
if (isset($_FILES['upload'])) {<br />
move_uploaded_file($_FILES['upload']['tmp_name'], 'upload/'.$_FILES['upload']['name']);<br />
}<br />
?&gt;<br />
</code></p>
<p>Nat&#252;rlich muss man hier selbst f&#252;r Sicherheit etc. sorgen, aber im Grundsatz ist der Upload identisch.</p>
<h3>Die Datei f&#252;r die Statusmeldung (status.php)</h3>
<p>Ihre einzige Aufgabe ist es, den Upload anhand der eindeutigen Id zu identifizieren und mit Hilfe der Funktion apc_fetch() den aktuellen Status auszulesen. Dieser muss dann nur noch entsprechend aufbereitet werden, um im richtigen Format an die HTML-Seite &#252;bermittelt zu werden:</p>
<p><code>&lt;?php<br />
$arr_status = apc_fetch('upload_'.$_GET['</code><code>str_apcId</code><code>']);<br />
printf("&lt;pre&gt;%s&lt;/pre&gt;", print_r($arr_status, true));<br />
?&gt;</code></p>
<h3>Der Javascript-Teil</h3>
<p><code>function requestStatus(str_apcId)' {</code></p>
<p>var request = new Request({<br />
url: &#8216;/status.php?apcId=&#8217;+str_apcId,<br />
onComplete: function(responseText) {<br />
$(&#8216;uploadStatus&#8217;).innerHTML = responseText;<br />
}<br />
}).send();<br />
}</p>
<p>Der Javascript-Part sollte hier sehr individuell ausfallen, dies ist insbesondere abh&#228;ngig vom genutzten Javascript-Framework, von der Art, den Status anzuzeigen sowie den technischen M&#246;glichkeiten. Das gezeigte Beispiel w&#228;re eine M&#246;glichkeit in MooTools, aber auch hier gilt, dass sowohl die Schnittstelle zum Server als auch das Javascript abgesichter sein sollten gegen einen Fremdzugriff.</p>
<p>Quellen:</p>
<p><a title="Debian BLOG" href="http://www.debianblogs.com/debian_apc_alternative_php_cache" target="_blank">http://www.debianblogs.com/debian_apc_alternative_php_cache</a></p>
<p><a title="Coder Wiki" href="http://www.coder-wiki.de/HowTos/PHP-AJAX-Upload-Fortschritt" target="_blank">http://www.coder-wiki.de/HowTos/PHP-AJAX-Upload-Fortschritt</a></p>
<p><a title="MooTools Request-Objekt" href="http://mootools.net/docs/Request/Request" target="_blank">http://mootools.net/docs/Request/Request</a></p>
<h2>Update:</h2>
<p>Wer Probleme bei der Installation mit PECL bekommt, sollte &#252;berpr&#252;fen, ob folgende Pakete installiert und verf&#252;gbar sind:<br />
<code>php5-dev<br />
apache2-dev<br />
build-essentials</code></p>
<p>Die Namen der Pakete sind zwischen den Distributionen unterschiedlich, wichtig ist, dass sowohl von PHP als auch vom installierten Apache die Development-Pakete zur Verf&#252;gung stehen und alle notwendigen Bibliotheken installiert sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martin-specht.com/2008/10/14/progressbars-in-php-projekten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

