Summary: I'm writing a custom stream to wrap around regular fopen/close functions (the actual stream will have more, but this is the part I'm having an issue with). The stream_open() method creates a class variable holding a file handle created with fopen().
$this->fp = fopen($path,$mode);
A var_dump() of $this->fp shows a valid stream resource. However, if I try to use that resource during stream_read, stream_close, stream_eof, etc, it's no longer valid and has been converted to a bool(true) value.
However, another class variable created in the stream_open method retains it's value throughout the other methods. Is this some kind of serialization/sleep/??? issue?
That's the summary, here's the code:
This is the file that defines the custom stream and some of the implementation. Not all methods are implemented, but I don't think that matters to this issue.
--------------------
Custom Stream Class:
<?php
stream_wrapper_register('cache','CacheStream');
class CacheStream { public $fp = FALSE; public $foo = FALSE;
function stream_open($path, $mode, $options='', &$opened_path='') { $path = substr($path,8); $this->fp = fopen($path,$mode); $this->foo = ' Test String '; var_dump($this->fp); var_dump($this->foo); return $this->fp; }
function stream_close() { var_dump($this->fp); var_dump($this->foo); return fclose($this->fp); }
function stream_read($bytes) { var_dump($this->fp); var_dump($this->foo); return fread($this->fp,$bytes); }
function stream_eof() { var_dump($this->fp); var_dump($this->foo); if(feof($this->fp)) { return TRUE; } else { return FALSE; } } }
?> --------------------
This is the test file that implements the custom stream. It first starts with the regular fopen/close functions to show it works with the test.rss file, then moves on to the custom stream.
--------------------
Test.php
<?php
error_reporting(E_ALL);
include('streamtest.php');
if($fp1 = fopen('test.rss','r')) { echo 'File1 open<br />'; } if($c = fread($fp1,20)) { echo 'Content1: ' . htmlentities($c) . '<br />'; } if(fclose($fp1)) { echo 'File1 closed<br />'; }
if($fp2 = fopen('cache://test.rss','r')) { echo 'File2 open<br />'; } if($c = fread($fp2,20)) { echo 'Content2: ' . htmlentities($c); } if(fclose($fp2)) { echo 'File2 closed<br />'; }
?> --------------------
This is the result: -------------------- File1 open Content1: <?xml version="1.0" File1 closed
resource(6) of type (stream) string(13) " Test String " File2 open
bool(true) string(13) " Test String "
Warning: fread(): supplied argument is not a valid stream resource in c:\program files\apache group\Apache\htdocs\zorin\streamtest.php on line 31
bool(true) string(13) " Test String "
Warning: feof(): supplied argument is not a valid stream resource in c:\program files\apache group\Apache\htdocs\zorin\streamtest.php on line 38
bool(true) string(13) " Test String "
Warning: fclose(): supplied argument is not a valid stream resource in c:\program files\apache group\Apache\htdocs\zorin\streamtest.php on line 24
File2 closed
--------------------
--
---John Holmes...
Amazon Wishlist: www.amazon.com/o/registry/3BEXC84AB3A5E/
php|architect: The Magazine for PHP Professionals – www.phparch.com
-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php