Afficher un message
Vieux 13/02/2008, 21h02   #5
Rik Wasmus
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: proc_open problem: \n translates to Windows-style line return \r\n

On Wed, 13 Feb 2008 18:47:51 +0100, Daniel Klein
<danielk@featherbrain.net> wrote:
> Here's the original (corrected) post:
>
> ===============================================
> Without getting into a lot of unnecessary detail, I'm working on a
> project
> to allow PHP to communicate with a proprietary database.
>
> The IPC mechanism I'm using is 'proc_open'; there is a server-side
> component
> (written in C) that 'listens' for PHP requests (via its stdin) and spits
> out
> the appropriate response (via its stdout). Conversely, the PHP side uses
> fwrite() to send to the component's stdin and fread() to read from the
> component's stdout.
>
> Ok so far?
>
> What happens is that there is a situation where the C component will
> send a
> a string with an embedded chr(10) via stdout to PHP's stdin. On Windows
> this
> is getting converted to chr(13).chr(10).
>
> So the problem is that if I send a n byte string ( with an embedded
> chr(10)
> ) then fread() gets an n+1 byte string ( with the addition of the
> chr(13) ).
>
> I've already tried using the 'binary_pipes' in the 'other_options' array.


I assume you don't have PHP6, or did the secretly implement this allready?

> I've also tried adding a 'b' as a 'pipe' option (see code below) but PHP
> doesn't like it.
>
> Here's simplified PHP code to illustrate the problem :
>
> $descriptorspec = array(
> 0 => array("pipe", "r"),
> 1 => array("pipe", "w"), //tried doing "wb"
> 2 => array("pipe", "r"));


Shouldn't STDERR be 'w'?


> $process = proc_open('C:\sandbox\bin\cprog.exe', $descriptorspec,
> $pipes);
>
> if (is_resource($process)) {
> $rtnval = fread($pipes[1], 1024);
> $a = str_split($rtnval);
> foreach ($a as $character) {
> echo ord($character)."<br />";
> }
> }
>
> If the C program sends the string 'LINE1'.chr(10).'LINE2' then PHP
> responds
> with:
>


> 76
> 73
> 78
> 69
> 49
> 13 <---this is being added in by PHP
> 10


> Is there some 'switch' that I can use to turn this off? Or am I going to
> have to filter this out myself?


Hmmz, I tried this under windows:
'program with output' test.php:
<?php
echo "foo\nbar\n";
?>
Actual code:
<?php
$h = proc_open('C:\PHP\php.exe
G:\Personal\echo.php',array(0=>array('pipe','r'),1 =>array('pipe','w'),2=>array('pipe','w')),$pipes) ;
//,NULL,NULL,array('bypass_shell',true)); <- tried, not needed
if (is_resource($h)) {
$rtnval = fread($pipes[1], 1024);
echo "$rtnval \n";
echo strlen($rtnval)."\n\n";

$a = str_split($rtnval);
foreach ($a as $character) {
echo ord($character)."\n";
}

fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($h);
}
?>
Output:
foo
bar

8

102
111
111
10
98
97
114
10

So, it's your C(++?) program. See for instance
<http://www.velocityreviews.com/forums/t281073-tricky-cout-with-0x0a-value.html>.
Make sure you output in binary instead of text mode, or oh so convenient
translation is done for you...
--
Rik Wasmus
  Réponse avec citation
 
Page generated in 0,06070 seconds with 9 queries