On Thu, May 5, 2011 at 2:30 AM, Ferenc Kovacs <i...@tyrael.hu> wrote:
>
>
> On Sat, Apr 30, 2011 at 5:23 PM, Ferenc Kovacs <i...@tyrael.hu> wrote:
>>>
>>> I actually did consider adding support for an extended form of php://fd
>>> where one would specify the desired file descriptor: php://fd/<orig fd>/<new
>>> fd>. It would call dup2 instead of dup.
>>>
>>> However, I got into some trouble on shutdown because this could cause
>>> stdout to be closed ahead of time and then the output subsystem would cause
>>> either a segfault or a memory leak (can't recall). I didn't spend more than
>>> 20 minutes on this as it was not the problem I was trying to solve, so
>>> there's probably an easy solution. If you want to work on this, extending
>>> php://fd would likely be a good place.
>>>
>>> --
>>> Gustavo Lopes
>>>
>>> --
>>> PHP Internals - PHP Runtime Development Mailing List
>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>
>>
>> thanks Gustavo.
>> as you check my mail, I also mentioned using dup2 instead of dup, for
>> obvious reasons.
>> adding dup2 support for the php://fd stream would be better than the
>> current situation, but I can't see why are we trying to force everything
>> into that.
>> I mean everything on the http://www.php.net/manual/en/wrappers.php can be
>> achived through a function also.
>> there are some case when you can save a couple of lines of code with the
>> wrappers and with http://www.php.net/manual/en/context.http.php but there is
>> no method for opening FDs or the dup2 that you mentioned.
>> I think that it would be more consistent with the rest of the language,
>> and one would more likely to find fdopen than fopen('php://fd/1'); in the
>> documentation.
>> closing the stdout without reopening also caused problems for me in case
>> of an error happens, but this shouldn't happen if you properly reopen it, so
>> I would be interested what exactly happened there.
>> Tyrael
>
> I put together the fileno, fdopen, dup2, fclose stuff as a pecl
> extension(called fildes), the sourcecode available here:
> https://github.com/Tyrael/php-fildes
> with this, you can do something like this:
> <?php
> $stdout_fd_orig = fildes_fileno(STDOUT);
> fclose(STDOUT);
> $stdout = fopen("out.log", "a");
> $fd_tmp = fildes_fileno($stdout);
> $stdout_fd = fildes_dup2($fd_tmp, $stdout_fd_orig);
> if($stdout_fd != $fd_tmp){
>         fildes_close($fd_tmp);
> }
> echo "Hello world!"; // this goes to out.log
> I'm really a novice in C, so any feedback welcome.
> particularly
> here https://github.com/Tyrael/php-fildes/blob/master/fildes.c#L211
> Tyrael

as somebody pointed out, the example could be simplified as:
<?php
$stdout = fopen("out.log", "a");
$tmp_fd = fildes_fileno($stdout);
if($tmp_fd, fildes_fileno(STDOUT))<0){
    fwrite(STDERR, "dup2 failed");
    exit;
}
fildes_close($tmp_fd);
echo "Hello world!"; // this goes to out.log

Could somebody review the source? as I mentioned in my previous email
I had some problem here:
https://github.com/Tyrael/php-fildes/blob/master/fildes.c#L211

if I define the second argument as int, the first argument will be always 0.
I have no idea whats going there.

Tyrael

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to