{"id":650,"date":"2012-10-15T10:00:42","date_gmt":"2012-10-15T08:00:42","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=650"},"modified":"2012-10-14T20:32:53","modified_gmt":"2012-10-14T18:32:53","slug":"streams","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/streams\/","title":{"rendered":"Streams"},"content":{"rendered":"<p>Kleine Zusammenstellung, was man mit PHP-Streams f\u00fcr feine Sachen anstellen kann. Streams werden total zu unrecht noch sehr stiefm\u00fctterlich behandelt, deswegen hier mal ein paar &#8222;Schmankerl&#8220;.<\/p>\n<h3>Temor\u00e4re Dateien mit Streams<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$fp = fopen(&quot;php:\/\/temp\/maxmemory:&quot; . (2 * 1024 * 1024), &#039;r+&#039;);\r\nfputs($fp, &quot;hello\\n&quot;);\r\nrewind($fp);\r\necho stream_get_contents($fp);\r\n<\/pre>\n<p>Hier wird 2 MB im Speicher reserviert. Sollte der zu speichernde Inhalt gr\u00f6\u00dfer als diese 2 MB werden (was im \u00fcbrigen auch der Default-Wert ist, wenn man <i>\/maxmemory:<\/i> weglassen w\u00fcrde), wird eine tempor\u00e4re Datei in <a href=\"http:\/\/php.net\/manual\/de\/function.sys-get-temp-dir.php\">sys_get_temp_dir<\/a> angelegt. Damit sind coole Sachen m\u00f6glich, bspw. mittels <a href=\"http:\/\/php.net\/manual\/de\/function.fputcsv.php\">fputcsv<\/a> in eine Variable schreiben &#8211; <a href=\"http:\/\/stackoverflow.com\/a\/417866\">siehe hier<\/a>. Alternativ existiert auch noch <i>php:\/\/temp<\/i>, was direkt in eine tempor\u00e4re Datei schreibt. <\/p>\n<h3>Normaler Output mit Filtern<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$fp = fopen(&#039;php:\/\/output&#039;, &#039;w&#039;);\r\nstream_filter_append($fp, &#039;convert.base64-encode&#039;);\r\nfwrite($fp, &quot;Base 64 encoded!&quot;);\r\n<\/pre>\n<p>Direkter Zugriff auf den Output-Stream, \u00e4hnlich wie mit echo und print. Befriedigt in der hier gezeigten Form zugegeben eher akademische Bed\u00fcrfnisse. Die zur Verf\u00fcgung stehenden <a href=\"http:\/\/php.net\/manual\/de\/filters.php\">Filter<\/a> k\u00f6nnen benutzt werden.<\/p>\n<h3>Streams filtern<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nreadfile(&quot;php:\/\/filter\/read=string.toupper|string.rot13\/resource=https:\/\/d-mueller.de&quot;);\r\n<\/pre>\n<p>Stream (in diesem Fall diese Webseite) einlesen und mit den Filtern <a href=\"http:\/\/php.net\/manual\/de\/function.str-rot13.php\">rot13<\/a> und strtoupper bearbeiten.<\/p>\n<p>Alternativ geht das auch mit Dateien und schreibend:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nfile_put_contents(&quot;php:\/\/filter\/write=string.rot13\/resource=samplefile.htm&quot;, &quot;&lt;o&gt;Bold and rotated!&lt;\/o&gt;&quot;);\r\n<\/pre>\n<\/p>\n<h3>CURL Ersatz<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nini_set(&#039;user_agent&#039;, &quot;Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.1 (KHTML, like Gecko) Chrome\/21.0.1180.89 Safari\/537.1 phpyeah!&quot;);\r\n$fp = fopen(&#039;http:\/\/local\/streams\/bar.php&#039;, &#039;r&#039;);\r\n<\/pre>\n<p>User-Agent setzen leicht gemacht. Aber da geht noch mehr:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$options = array(&#039;http&#039; =&gt; array\r\n(\r\n    &#039;content&#039; =&gt; &#039;foo=bar&amp;baz=1234&#039;,\r\n\t&#039;method&#039;  =&gt; &#039;POST&#039;,\r\n    &#039;timeout&#039; =&gt; 3,\r\n\t&#039;header&#039; =&gt; &quot;Content-Type: application\/x-www-form-urlencoded\\r\\nCookie: test=xy\\r\\n&quot;\r\n));\r\n\r\n$context = stream_context_create($options);\r\necho file_get_contents(&quot;http:\/\/local\/streams\/bar.php&quot;, 0, $context);\r\n<\/pre>\n<p>Ist ohnehin sehr sch\u00f6n, dass file_get_contents mit dem Stream-Kontext klarkommt. L\u00e4sst sich auch vorz\u00fcglich testen, indem wir in der <i>bar.php<\/i>-Datei einfach folgendes unterbringen:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nprint_r($_COOKIE);\r\nprint_r($_POST);\r\n<\/pre>\n<h3>Data-Stream<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$str = &quot;Das ist ein Test&quot;;\r\n$decoded = file_get_contents(&quot;data:\/\/text\/plain;base64,&quot; . base64_encode($str));\r\nvar_dump($str === $decoded); \/\/bool(true)\r\n<\/pre>\n<h3>Meta-Informationen<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$soundstream = fopen(&quot;Barcardi Feeling - The Orginal Song Of Bacardi Rum.mp3&quot;, &quot;r&quot;);\r\n$meta = stream_get_meta_data($soundstream);\r\nprint_r($meta);\r\n\/*\r\nArray\r\n(\r\n    [wrapper_type] =&gt; plainfile\r\n    [stream_type] =&gt; STDIO\r\n    [mode] =&gt; r\r\n    [unread_bytes] =&gt; 0\r\n    [seekable] =&gt; 1\r\n    [uri] =&gt; Barcardi Feeling - The Orginal Song Of Bacardi Rum.mp3\r\n    [timed_out] =&gt; \r\n    [blocked] =&gt; 1\r\n    [eof] =&gt; \r\n)\r\n*\/\r\n<\/pre>\n<p>Ist auch bei URLs <a href=\"http:\/\/php.net\/manual\/en\/function.stream-get-meta-data.php\">recht gespr\u00e4chig<\/a>.<\/p>\n<h3>Zip-Dateien lesen<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$fp = fopen(&#039;zip:\/\/&#039; . dirname(__FILE__) . &#039;\/file.zip#content.txt&#039;, &#039;r&#039;);\r\necho fread($fp, 1024);\r\nfclose($fp);\r\n<\/pre>\n<p>Liest die Datei &#8222;content.txt&#8220; aus dem Archiv &#8222;file.zip&#8220;.<\/p>\n<h3>FTP-Handling<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$creds = array\r\n(\r\n\t&quot;host&quot; =&gt; &#039;ftp.d-mueller.de&#039;,\r\n\t&quot;user&quot; =&gt; &#039;nutzername&#039;,\r\n\t&quot;password&quot; =&gt; &#039;daspasswort&#039;\r\n);\r\n\r\n$stream = stream_context_create(array(&#039;ftp&#039; =&gt; array(&#039;overwrite&#039; =&gt; true)));\r\n$filename = &quot;testfile.txt&quot;;\r\n\r\n$uri = sprintf(&#039;ftp:\/\/%s:%s@%s\/%s&#039;, $creds[&#039;user&#039;], $creds[&#039;password&#039;], $creds[&#039;host&#039;], $filename);\r\nfile_put_contents($uri, &quot;write me!&quot;, 0, $stream);\r\n<\/pre>\n<p>Entliehen von <a href=\"http:\/\/blog.ebene7.com\/2011\/01\/07\/einfacher-ftp-upload-mit-php\/\">ebene7<\/a>, wo der Schnippsel urspr\u00fcnglich geposted wurde.<\/p>\n<p>Funktioniert selbstredend auch lesend:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$creds = array\r\n(\r\n\t&quot;host&quot; =&gt; &#039;ftp.d-mueller.de&#039;,\r\n\t&quot;user&quot; =&gt; &#039;nutzername&#039;,\r\n\t&quot;password&quot; =&gt; &#039;daspasswort&#039;\r\n);\r\n\r\n$stream = stream_context_create(array(&#039;ftp&#039; =&gt; array(&#039;overwrite&#039; =&gt; true)));\r\n$filename = &quot;robots.txt&quot;;\r\n\r\n$uri = sprintf(&#039;ftp:\/\/%s:%s@%s\/%s&#039;, $creds[&#039;user&#039;], $creds[&#039;password&#039;], $creds[&#039;host&#039;], $filename);\r\necho file_get_contents($uri, 0, $stream);\r\n<\/pre>\n<h3>&#8230;und noch viel mehr!<\/h3>\n<p>Dar\u00fcberhinaus gibt es &#8211; entsprechend kompiliertes PHP vorausgesetzt &#8211; noch Streams f\u00fcr das Handling von <a href=\"http:\/\/php.net\/manual\/de\/wrappers.audio.php\">Audiodateien (ogg-Files)<\/a> oder direkten <a href=\"http:\/\/php.net\/manual\/de\/wrappers.ssh2.php\">SSH-Zugriff<\/a>. Streams sollte man immer auf der Rechnung haben!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kleine Zusammenstellung, was man mit PHP-Streams f\u00fcr feine Sachen anstellen kann. Streams werden total zu unrecht noch sehr stiefm\u00fctterlich behandelt, deswegen hier mal ein paar &#8222;Schmankerl&#8220;. Temor\u00e4re Dateien mit Streams $fp = fopen(&quot;php:\/\/temp\/maxmemory:&quot; . (2 * 1024 * 1024), &#039;r+&#039;); &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/streams\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,8,3],"tags":[],"class_list":["post-650","post","type-post","status-publish","format-standard","hentry","category-php","category-quicktips","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=650"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/650\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}