<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[php] fread nach select blockiert]]></title><description><![CDATA[<p>Hey, ich versuch ein Video on the fly zu codieren und die Eingabe und Ausgabe durch php zu leiten und dann über Netzwerk zu verschicken.<br />
Damit das Script nirgends hängenbleibt frage ich mit stream_select die Streams ab, die ohne zu blocken gelesen und/oder geschrieben werden können.</p>
<p>$mencoder[ 'input' ] ist stdin von ffmpeg, mencoder\[ 'output' \] ist stdout, beide über proc_open bekommen...  
client ist ein socket, das mit stream_socket_accept akzeptiert wurde...</p>
<pre><code class="language-php">$input = fopen( &quot;/data1/bla/film.avi&quot;, &quot;rb&quot; ),
$buffer_input = array();
		$buffer_output = array();

		$run = true;
		$error = 0;
		while( $input &amp;&amp; $run &amp;&amp; $error &lt; 3 ) {
			$read = array();

			#adding read fd if we need data
			if( sizeof( $buffer_input ) &lt; 1024 )
				$read[] = $input;

			if( sizeof( $buffer_output ) &lt; 1024 )
				$read[] = $mencoder[ 'output' ];

			# adding write fd if we have data
			$write = array();

			if( sizeof( $buffer_output ) )
				$write[] = $client;

			if( sizeof( $buffer_input ) )
				$write[] = $mencoder[ 'input' ];

			#select
			$rc = stream_select( $read, $write, $ex = NULL, 5, 0 );
			if( $rc === false ) {
				echo &quot;error doing select\n&quot;;
				break;
			}
			if( $rc === 0 ) {
				echo &quot;no data in 5 seconds, try again&quot;;
				$error++;
				continue;
			}

			$error = 0;
			foreach( array_merge( $read, $write ) as $socket ) {
				if( $socket == $input ) {
					echo &quot;read input from source...\n&quot;;
					$buffer_input[] = fread( $input, 4096 );
				}

				if( $socket == $mencoder[ 'output' ] ) {
					echo &quot;read data from encoder...\n&quot;;

					$block = fread( $mencoder[ 'output' ], 4096 );
					$buffer_output[] = fread( $mencoder[ 'output' ], 4096 );
				}

				if( $socket == $client ) {
					echo &quot;write data to the client\n&quot;;
					fwrite( $client, array_shift( $buffer_output ) );
				}

				if( $socket == $mencoder[ 'input' ] ) {
					echo &quot;write data to encoder...\n&quot;;
					fwrite( $mencoder[ 'input' ], array_shift( $buffer_input ) );
				}
			}

		}
</code></pre>
<p>das problem ist jetzt jedoch folgendes: er blockiert trotzdem!<br />
nach einigen sekunden umwandeln kommt:</p>
<pre><code>...
read input from source...
write data to encoder...
read input from source...
read data from encoder...
write data to encoder...
read input from source...
read data from encoder...
</code></pre>
<p>das heißt, erhängt beim fread vom $mencoder[ 'output' ]... das düfte er jedoch nicht, da durch das stream_select sichergestellt sein sollte, dass er ohne zu blockieren lesen kann... (das passiert übrigens nach etwa 800kb)<br />
Das script läuft unter Linux und mit php5.2.0-8+etch4 aus der konsole<br />
Hat vielleicht irgendwer eine Ahnung, woran das liegen könnte?</p>
<p>Gruß, Olli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186802/php-fread-nach-select-blockiert</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 17:34:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186802.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Jul 2007 13:42:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 13:42:04 GMT]]></title><description><![CDATA[<p>Hey, ich versuch ein Video on the fly zu codieren und die Eingabe und Ausgabe durch php zu leiten und dann über Netzwerk zu verschicken.<br />
Damit das Script nirgends hängenbleibt frage ich mit stream_select die Streams ab, die ohne zu blocken gelesen und/oder geschrieben werden können.</p>
<p>$mencoder[ 'input' ] ist stdin von ffmpeg, mencoder\[ 'output' \] ist stdout, beide über proc_open bekommen...  
client ist ein socket, das mit stream_socket_accept akzeptiert wurde...</p>
<pre><code class="language-php">$input = fopen( &quot;/data1/bla/film.avi&quot;, &quot;rb&quot; ),
$buffer_input = array();
		$buffer_output = array();

		$run = true;
		$error = 0;
		while( $input &amp;&amp; $run &amp;&amp; $error &lt; 3 ) {
			$read = array();

			#adding read fd if we need data
			if( sizeof( $buffer_input ) &lt; 1024 )
				$read[] = $input;

			if( sizeof( $buffer_output ) &lt; 1024 )
				$read[] = $mencoder[ 'output' ];

			# adding write fd if we have data
			$write = array();

			if( sizeof( $buffer_output ) )
				$write[] = $client;

			if( sizeof( $buffer_input ) )
				$write[] = $mencoder[ 'input' ];

			#select
			$rc = stream_select( $read, $write, $ex = NULL, 5, 0 );
			if( $rc === false ) {
				echo &quot;error doing select\n&quot;;
				break;
			}
			if( $rc === 0 ) {
				echo &quot;no data in 5 seconds, try again&quot;;
				$error++;
				continue;
			}

			$error = 0;
			foreach( array_merge( $read, $write ) as $socket ) {
				if( $socket == $input ) {
					echo &quot;read input from source...\n&quot;;
					$buffer_input[] = fread( $input, 4096 );
				}

				if( $socket == $mencoder[ 'output' ] ) {
					echo &quot;read data from encoder...\n&quot;;

					$block = fread( $mencoder[ 'output' ], 4096 );
					$buffer_output[] = fread( $mencoder[ 'output' ], 4096 );
				}

				if( $socket == $client ) {
					echo &quot;write data to the client\n&quot;;
					fwrite( $client, array_shift( $buffer_output ) );
				}

				if( $socket == $mencoder[ 'input' ] ) {
					echo &quot;write data to encoder...\n&quot;;
					fwrite( $mencoder[ 'input' ], array_shift( $buffer_input ) );
				}
			}

		}
</code></pre>
<p>das problem ist jetzt jedoch folgendes: er blockiert trotzdem!<br />
nach einigen sekunden umwandeln kommt:</p>
<pre><code>...
read input from source...
write data to encoder...
read input from source...
read data from encoder...
write data to encoder...
read input from source...
read data from encoder...
</code></pre>
<p>das heißt, erhängt beim fread vom $mencoder[ 'output' ]... das düfte er jedoch nicht, da durch das stream_select sichergestellt sein sollte, dass er ohne zu blockieren lesen kann... (das passiert übrigens nach etwa 800kb)<br />
Das script läuft unter Linux und mit php5.2.0-8+etch4 aus der konsole<br />
Hat vielleicht irgendwer eine Ahnung, woran das liegen könnte?</p>
<p>Gruß, Olli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1323903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1323903</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Thu, 12 Jul 2007 13:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 14:06:44 GMT]]></title><description><![CDATA[<p>kleiner fehler, statt</p>
<pre><code class="language-php">$block = fread( $mencoder[ 'output' ], 4096 );
					$buffer_output[] = fread( $mencoder[ 'output' ], 4096 );
</code></pre>
<p>natrlich nur die zweite zeile. aber das ändert leider nichts daran...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1323924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1323924</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Thu, 12 Jul 2007 14:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 15:44:15 GMT]]></title><description><![CDATA[<p>Ich habe das ganze nochmal 1:1 nach Python portiert, in der Hoffnung, dass der Fehler in PHP zu finden ist... doch Pustekuchen, er blockiert einfach, obwohl er das nicht dürfte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324004</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Thu, 12 Jul 2007 15:44:15 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 15:48:24 GMT]]></title><description><![CDATA[<p>musst ja noch in den non-blocking modus schalten, ich glaube mit ioctl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324007</guid><dc:creator><![CDATA[..........]]></dc:creator><pubDate>Thu, 12 Jul 2007 15:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 22:13:55 GMT]]></title><description><![CDATA[<p>Nein nein, erstmal ist das php, da gibts kein ioctl, und zweitens ist es durch das select ja prinzipiell ausgeschlossen, dass ein read/write blocken kann.<br />
Nichts destotrotz habe ich das bereits mal in den non-blocking Modus gestellt, dann kehrt der Aufruf erwartungsgemäß sofort zurück, jedoch gibt fread/fwrite dann 0 zurück und tut nichts...<br />
Das Problem ist ja, dass sowas nicht vorkommen &quot;kann&quot;... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324211</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Thu, 12 Jul 2007 22:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Thu, 12 Jul 2007 22:29:06 GMT]]></title><description><![CDATA[<blockquote>
<p>und zweitens ist es durch das select ja prinzipiell ausgeschlossen, dass ein read/write blocken kann.</p>
</blockquote>
<p>quatsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324217</guid><dc:creator><![CDATA[..........]]></dc:creator><pubDate>Thu, 12 Jul 2007 22:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Fri, 13 Jul 2007 14:58:39 GMT]]></title><description><![CDATA[<blockquote>
<p>select() and pselect() allow a program to monitor multiple file<br />
descriptors, waiting until one or more of the file descriptors become<br />
<strong>&quot;ready&quot;</strong> for some class of I/O operation (e.g., input possible). A file<br />
descriptor is considered <strong>ready if it is possible</strong> to perform the corre‐<br />
sponding I/O operation (e.g., read(2)) <strong>without blocking</strong>.</p>
</blockquote>
<p><a href="http://man.cx/select(2)" rel="nofollow">http://man.cx/select(2)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324755</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Fri, 13 Jul 2007 14:58:39 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Sat, 14 Jul 2007 01:15:40 GMT]]></title><description><![CDATA[<p>wenn das select durchgeht heisst das dass du sicher 1 byte lesen kannst. niemand garantiert dir dass du 4096 bytes lesen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1325081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1325081</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 14 Jul 2007 01:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to [php] fread nach select blockiert on Sat, 14 Jul 2007 01:31:52 GMT]]></title><description><![CDATA[<p>Soweit ich weiß heißt dass dann aber nicht, dass er blockiert, sobald er mehr anfordert als er lesen kann:</p>
<blockquote>
<p>It is not an<br />
error if this number is smaller than the number of bytes requested;<br />
this may happen for example because fewer bytes are actually available<br />
right now (maybe because we were close to end-of-file, or because we<br />
are reading from a pipe, or from a terminal), or because read() was<br />
interrupted by a signal.</p>
</blockquote>
<p>Dann ließt er halt nur das eine von den 4096 bytes und gibt 1 zurück...</p>
<p><a href="http://man.cx/read(2)" rel="nofollow">http://man.cx/read(2)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1325086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1325086</guid><dc:creator><![CDATA[Only-Olli]]></dc:creator><pubDate>Sat, 14 Jul 2007 01:31:52 GMT</pubDate></item></channel></rss>