Afficher un message
Vieux 13/02/2008, 18h47   #4
Daniel Klein
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 16:54:54 +0100, "Rik Wasmus"
<luiheidsgoeroe@hotmail.com> wrote:

>On Wed, 13 Feb 2008 16:40:58 +0100, Daniel Klein
><danielk@featherbrain.net> wrote:
>
>> On Mon, 11 Feb 2008 14:50:54 -0500, Daniel Klein
>> <danielk@featherbrain.net>
>> wrote:
>>
>> Ok, I'm missing a ;. The line should read:
>>
>> echo "$rtnval <br />";
>>
>> That's what I get for changing the script in my newsreader instead of in
>> my
>> IDE (phpDesigner, which would have caugth this pronto) :-(
>>
>> ***
>>
>> Anyway, it's been 2 days with no response; does this mean that I have
>> found
>> a 'buglet'?

>
>Depends, I cannot find you original post on my nntp server, it doesn't
>ring a bell, and you haven't quoted yourself, so I have no idea what
>you're writing about. Care to restate the problem for me?


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'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"));

$process = proc_open('C:\sandbox\bin\cprog.exe', $descriptorspec, $pipes);

if (is_resource($process)) {
$rtnval = fread($pipes[1], 1024);

echo "$rtnval <br />";
echo strlen($rtnval)."<br /><br />";

$a = str_split($rtnval);
foreach ($a as $character) {
echo ord($character)."<br />";
}

fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}

If the C program sends the string 'LINE1'.chr(10).'LINE2' then PHP responds
with:

LINE1 LINE2
12

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


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

Daniel Klein
  Réponse avec citation
 
Page generated in 0,08254 seconds with 9 queries