Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-24 Thread Marten Lehmann

Hello,


dan...@daniel-laptop:~$ php test.php  /dev/null
Error 1
Error 2
dan...@daniel-laptop:~$ ./src/php-5.2.12/sapi/cli/php test.php  /dev/null
Error 1
Error 2


well, using php-cli instead of php-cgi, this finally worked:

?
fwrite(STDERR, test\n);
fclose(STDERR);
?

But why doesn't it work with php-cgi? That's a binary that is called 
with the php-file is parameter the same way as php-cli. So both come 
with STDIN/STDOUT/STDERR contrary to scripts running through mod_php.


What is the real difference between php-cli and php-cgi? This 
fclose(STDERR); is really important for one customer, because this is 
seems to be the only way to suppress later output to STDERR in the same 
script by external commands and functions that are too hard to change. 
But I don't want to break things for all other customers just to make 
one happier.


Can the STDERR constands be enable somehow at compile-time for php-cgi?

Regards
Marten

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-24 Thread Daniel Egeberg
On Wed, Mar 24, 2010 at 14:12, Marten Lehmann lehm...@cnm.de wrote:
 Hello,

 dan...@daniel-laptop:~$ php test.php  /dev/null
 Error 1
 Error 2
 dan...@daniel-laptop:~$ ./src/php-5.2.12/sapi/cli/php test.php  /dev/null
 Error 1
 Error 2

 well, using php-cli instead of php-cgi, this finally worked:

 ?
 fwrite(STDERR, test\n);
 fclose(STDERR);
 ?

 But why doesn't it work with php-cgi? That's a binary that is called with
 the php-file is parameter the same way as php-cli. So both come with
 STDIN/STDOUT/STDERR contrary to scripts running through mod_php.

 What is the real difference between php-cli and php-cgi? This
 fclose(STDERR); is really important for one customer, because this is
 seems to be the only way to suppress later output to STDERR in the same
 script by external commands and functions that are too hard to change. But I
 don't want to break things for all other customers just to make one happier.

 Can the STDERR constands be enable somehow at compile-time for php-cgi?

 Regards
 Marten

You can see how the CLI SAPI differs from the other SAPIs here:
http://php.net/manual/en/features.commandline.differences.php

-- 
Daniel Egeberg

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-24 Thread Jan G.B.
2010/3/24 Marten Lehmann lehm...@cnm.de

 Hello,


  dan...@daniel-laptop:~$ php test.php  /dev/null
 Error 1
 Error 2
 dan...@daniel-laptop:~$ ./src/php-5.2.12/sapi/cli/php test.php
  /dev/null
 Error 1
 Error 2


 well, using php-cli instead of php-cgi, this finally worked:

 ?
 fwrite(STDERR, test\n);
 fclose(STDERR);
 ?


Weird, this does not work with the Ubuntu Version I'm using.
As reported in my previous email, I only can print out to STDERR when I
properly use php://stderr with fopen() - no matter if I use read or write
mode in fopen(). So be cautious when developing for different systems. Here
are some examples:

*** WORKS:
$ php
?php $x = fopen('php://stderr', 'w'); fwrite($x, 'Foo'); fclose($x); ?
Foo

*** FAILURE:
##
$ php
?
fwrite(STDERR, test);
?
Warning: fwrite(): supplied argument is not a valid stream resource in
/home/user/- on line 2

###
$ php
?php $x = fopen('php://stderr', 'w'); fwrite($x, 'Foo');
fwrite(STDERR, 'Bar');
fclose($x); ?
Foo
Warning: fwrite(): supplied argument is not a valid stream resource in
/home/user/- on line 2

###
$ php
?php $x = fopen(STDERR, 'w'); fwrite($x, 'Foo'); fclose($x); ?
// Nothing happens, no warning, no error and no Foo




But why doesn't it work with php-cgi? That's a binary that is called with
 the php-file is parameter the same way as php-cli. So both come with
 STDIN/STDOUT/STDERR contrary to scripts running through mod_php.

 What is the real difference between php-cli and php-cgi? This
 fclose(STDERR); is really important for one customer, because this is
 seems to be the only way to suppress later output to STDERR in the same
 script by external commands and functions that are too hard to change. But I
 don't want to break things for all other customers just to make one happier.


Well, see this..
$ php
? var_dump(STDERR); ?
string(6) STDERR

:-(


 Can the STDERR constands be enable somehow at compile-time for php-cgi?

 Regards
 Marten


 --
 PHP General Mailing List (http://www.php.net/)
 To unsubscribe, visit: http://www.php.net/unsub.php




[PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-23 Thread Marten Lehmann

Hello,

I found different code examples like this, which use the file handle 
STDERR just like this:


?php
fwrite(STDERR, hello\n);
?

Also, the PHP documentation of input/output streams 
(http://php.net/manual/de/wrappers.php.php) says:


It is recommended that you simply use the constants STDIN, STDOUT  and 
STDERR instead of manually opening streams using these wrappers.


I don't want to use the php://stderr wrapper, because this just 
creates a duplicate of the original STDERR handler and if I'm closing 
php://stderr, the original STDERR still would exist.


When I'm using this code, I only get:

bNotice/b:  Use of undefined constant STDERR - assumed 'STDERR' in 
b/test.php/b on line b4/bbr /

br /
bWarning/b:  fwrite(): supplied argument is not a valid stream 
resource in b/test.php/b on line b4/bbr /


How can I access the original STDERR handle? The constant should be 
there, but does not exist.


regards
Marten

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-23 Thread Jan G.B.
2010/3/23 Marten Lehmann lehm...@cnm.de

 Hello,

 I found different code examples like this, which use the file handle STDERR
 just like this:

 ?php
 fwrite(STDERR, hello\n);
 ?

 Also, the PHP documentation of input/output streams (
 http://php.net/manual/de/wrappers.php.php) says:

 It is recommended that you simply use the constants STDIN, STDOUT  and
 STDERR instead of manually opening streams using these wrappers.

 I don't want to use the php://stderr wrapper, because this just creates a
 duplicate of the original STDERR handler and if I'm closing php://stderr,
 the original STDERR still would exist.

 When I'm using this code, I only get:

 bNotice/b:  Use of undefined constant STDERR - assumed 'STDERR' in
 b/test.php/b on line b4/bbr /
 br /
 bWarning/b:  fwrite(): supplied argument is not a valid stream resource
 in b/test.php/b on line b4/bbr /

 How can I access the original STDERR handle? The constant should be there,
 but does not exist.

 regards
 Marten


Hi,

I can reproduce it with some differences. Check this out:

 $ php --version
PHP 5.2.10-2ubuntu6.4 with Suhosin-Patch 0.9.7 (cli) (built: Jan  6 2010
22:56:44)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

$ php 1/dev/null # note that the PHP error messages are
displayed on STDOUT - I don't show them with 1/dev/null
?
$x = fopen('php://stderr', 'r'); fwrite($x, test\n); fclose($x);
$x = fopen(STDERR, 'r'); fwrite($x, test2\n); fclose($x); ?

?
fwrite(STDERR, test3\n);
fwrite ('php://stderr', test4);
?
---

Result:

test




So my assumption is, that the quoted recommendation is outdated / wrong.

Regards


PS: PHP reports this when giving the constant STDERR:
  Warning: fopen(STDERR): failed to open stream: No such file or directory
  Warning: fwrite(): supplied argument is not a valid stream resource


Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-23 Thread Daniel Egeberg
On Tue, Mar 23, 2010 at 11:47, Marten Lehmann lehm...@cnm.de wrote:
 Hello,

 I found different code examples like this, which use the file handle STDERR
 just like this:

 ?php
 fwrite(STDERR, hello\n);
 ?

 Also, the PHP documentation of input/output streams
 (http://php.net/manual/de/wrappers.php.php) says:

 It is recommended that you simply use the constants STDIN, STDOUT  and
 STDERR instead of manually opening streams using these wrappers.

 I don't want to use the php://stderr wrapper, because this just creates a
 duplicate of the original STDERR handler and if I'm closing php://stderr,
 the original STDERR still would exist.

 When I'm using this code, I only get:

 bNotice/b:  Use of undefined constant STDERR - assumed 'STDERR' in
 b/test.php/b on line b4/bbr /
 br /
 bWarning/b:  fwrite(): supplied argument is not a valid stream resource
 in b/test.php/b on line b4/bbr /

 How can I access the original STDERR handle? The constant should be there,
 but does not exist.

 regards
 Marten

These I/O streams are only present in the CLI SAPI.

-- 
Daniel Egeberg

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-23 Thread Jan G.B.
2010/3/23 Daniel Egeberg degeb...@php.net

 On Tue, Mar 23, 2010 at 11:47, Marten Lehmann lehm...@cnm.de wrote:
  Hello,
 
  I found different code examples like this, which use the file handle
 STDERR
  just like this:
 
  ?php
  fwrite(STDERR, hello\n);
  ?
 
  Also, the PHP documentation of input/output streams
  (http://php.net/manual/de/wrappers.php.php) says:
 
  It is recommended that you simply use the constants STDIN, STDOUT  and
  STDERR instead of manually opening streams using these wrappers.
 
  I don't want to use the php://stderr wrapper, because this just creates
 a
  duplicate of the original STDERR handler and if I'm closing
 php://stderr,
  the original STDERR still would exist.
 
  When I'm using this code, I only get:
 
  bNotice/b:  Use of undefined constant STDERR - assumed 'STDERR' in
  b/test.php/b on line b4/bbr /
  br /
  bWarning/b:  fwrite(): supplied argument is not a valid stream
 resource
  in b/test.php/b on line b4/bbr /
 
  How can I access the original STDERR handle? The constant should be
 there,
  but does not exist.
 
  regards
  Marten

 These I/O streams are only present in the CLI SAPI.

 --
 Daniel Egeberg

 Please confirm that the code of my previous replay on this topic (executed
via php-cli) does not print out test2 or test3. The constant is present
but doesn't work as supposed.

Regards


Re: [PHP] constants STDOUT, STDERR, STDIN not working in 5.2.x?

2010-03-23 Thread Daniel Egeberg
On Tue, Mar 23, 2010 at 15:50, Jan G.B. ro0ot.w...@googlemail.com wrote:


 2010/3/23 Daniel Egeberg degeb...@php.net

 On Tue, Mar 23, 2010 at 11:47, Marten Lehmann lehm...@cnm.de wrote:
  Hello,
 
  I found different code examples like this, which use the file handle
  STDERR
  just like this:
 
  ?php
  fwrite(STDERR, hello\n);
  ?
 
  Also, the PHP documentation of input/output streams
  (http://php.net/manual/de/wrappers.php.php) says:
 
  It is recommended that you simply use the constants STDIN, STDOUT  and
  STDERR instead of manually opening streams using these wrappers.
 
  I don't want to use the php://stderr wrapper, because this just
  creates a
  duplicate of the original STDERR handler and if I'm closing
  php://stderr,
  the original STDERR still would exist.
 
  When I'm using this code, I only get:
 
  bNotice/b:  Use of undefined constant STDERR - assumed 'STDERR' in
  b/test.php/b on line b4/bbr /
  br /
  bWarning/b:  fwrite(): supplied argument is not a valid stream
  resource
  in b/test.php/b on line b4/bbr /
 
  How can I access the original STDERR handle? The constant should be
  there,
  but does not exist.
 
  regards
  Marten

 These I/O streams are only present in the CLI SAPI.

 --
 Daniel Egeberg

 Please confirm that the code of my previous replay on this topic (executed
 via php-cli) does not print out test2 or test3. The constant is present
 but doesn't work as supposed.
 Regards



You are making a number of errors there:
1) You are trying to open php://stderr in read mode, but that stream
is write only (I'm not sure why it outputs regardless).
2) You are trying to open STDERR, but that constant holds a stream
resource while fopen() expects a string.
3) You are trying to write to 'php://stderr'. That's not possible. You
cannot pass a string as stream.

The following should work:

dan...@daniel-laptop:~$ cat test.php
?php
$stderr = fopen('php://stderr', 'w');
fwrite($stderr, 'Error 1' . PHP_EOL);
fwrite(STDERR, 'Error 2' . PHP_EOL);
echo 'Normal echo';
dan...@daniel-laptop:~$ php test.php  /dev/null
Error 1
Error 2
dan...@daniel-laptop:~$ ./src/php-5.2.12/sapi/cli/php test.php  /dev/null
Error 1
Error 2

-- 
Daniel Egeberg

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php