Re: adding low level file handling stuff
| From: | Ferenc Kovacs | Date: | Thu, 05 May 2011 00:30:41 +0000 |
| Subject: | Re: adding low level file handling stuff | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-52131@lists.php.net to get a copy of this message | ||
On Sat, Apr 30, 2011 at 5:23 PM, Ferenc Kovacs <info@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