wez             Sun Jan 19 05:11:24 2003 EDT

  Modified files:              
    /phpdoc/en/chapters streams.dir.xml streams.structs.xml streams.xml 
  Log:
  Check in these docs that have been lying around for a while.
  By no means complete, but better than not having them.
  
  
Index: phpdoc/en/chapters/streams.dir.xml
diff -u phpdoc/en/chapters/streams.dir.xml:1.1 phpdoc/en/chapters/streams.dir.xml:1.2
--- phpdoc/en/chapters/streams.dir.xml:1.1      Sat Aug 10 19:38:41 2002
+++ phpdoc/en/chapters/streams.dir.xml  Sun Jan 19 05:11:23 2003
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.1 $ -->
+<!-- $Revision: 1.2 $ -->
 <!-- Author: Wez Furlong <[EMAIL PROTECTED]>
   Please contact me before making any major amendments to the
   content of this section.  Splitting/Merging are fine if they are
@@ -53,6 +53,8 @@
      from <parameter>dirstream</parameter> and stores it into 
<parameter>ent</parameter>.
      If the function succeeds, the return value is <parameter>ent</parameter>.
      If the function fails, the return value is NULL.
+     See <link linkend="streams.struct-php-stream-dirent">php_stream_dirent</link> 
+for more
+     details about the information returned for each directory entry.
      </para>
    </refsect1>
   </refentry>
Index: phpdoc/en/chapters/streams.structs.xml
diff -u phpdoc/en/chapters/streams.structs.xml:1.1 
phpdoc/en/chapters/streams.structs.xml:1.2
--- phpdoc/en/chapters/streams.structs.xml:1.1  Sat Aug 10 19:38:41 2002
+++ phpdoc/en/chapters/streams.structs.xml      Sun Jan 19 05:11:24 2003
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.1 $ -->
+<!-- $Revision: 1.2 $ -->
 <!-- Author: Wez Furlong <[EMAIL PROTECTED]>
   Please contact me before making any major amendments to the
   content of this section.  Splitting/Merging are fine if they are
@@ -45,6 +45,33 @@
    </refsect1>
   </refentry>
  
+  <refentry id="streams.struct-php-stream-ops">
+    <refnamediv>
+        <refname>struct php_stream_ops</refname>
+        <refpurpose>Holds member functions for a stream implementation</refpurpose>
+    </refnamediv>
+    <refsect1>
+     <title>Description</title>
+     <programlisting role="c">
+        typedef struct _php_stream_ops {
+             /* all streams MUST implement these operations */
+             size_t (*write)(php_stream *stream, const char *buf, size_t count 
+TSRMLS_DC);
+             size_t (*read)(php_stream *stream, char *buf, size_t count TSRMLS_DC);
+             int (*close)(php_stream *stream, int close_handle TSRMLS_DC);
+             int (*flush)(php_stream *stream TSRMLS_DC);
+             
+             const char *label; /* name describing this class of stream */
+             
+             /* these operations are optional, and may be set to NULL if the stream 
+does not
+              * support a particular operation */
+            int (*seek)(php_stream *stream, off_t offset, int whence TSRMLS_DC);
+            char *(*gets)(php_stream *stream, char *buf, size_t size TSRMLS_DC);
+            int (*cast)(php_stream *stream, int castas, void **ret TSRMLS_DC);
+            int (*stat)(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC);
+        } php_stream_ops;
+     </programlisting>
+    </refsect1>
+  </refentry>
 
 
  </sect1>
Index: phpdoc/en/chapters/streams.xml
diff -u phpdoc/en/chapters/streams.xml:1.2 phpdoc/en/chapters/streams.xml:1.3
--- phpdoc/en/chapters/streams.xml:1.2  Fri Sep  6 05:12:32 2002
+++ phpdoc/en/chapters/streams.xml      Sun Jan 19 05:11:24 2003
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.2 $ -->
+<!-- $Revision: 1.3 $ -->
 <!-- Author: Wez Furlong <[EMAIL PROTECTED]>
   Please contact me before making any major amendments to the
   content of this section.  Splitting/Merging are fine if they are
@@ -179,6 +179,96 @@
    
   </para>
  </sect1>
+
+ <sect1 id="streams.resources">
+  <title>Streams as Resources</title>
+  <para>
+   All streams are registered as resources when they are created.  This ensures
+   that they will be properly cleaned up even if there is some fatal error.
+   All of the filesystem functions in PHP operate on streams resources - that
+   means that your extensions can accept regular PHP file pointers as
+   parameters to, and return streams from their functions.
+   The streams API makes this process as painless as possible:
+  </para>
+  <para>
+     <example>
+      <title>How to accept a stream as a parameter</title>
+      <programlisting role="c">
+<![CDATA[
+PHP_FUNCTION(example_write_hello)
+{
+    zval *zstream;
+    php_stream *stream;
+    
+    if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream))
+        return;
+    
+    php_stream_from_zval(stream, &zstream);
+
+    /* you can now use the stream.  However, you do not "own" the
+        stream, the script does.  That means you MUST NOT close the
+        stream, because it will cause PHP to crash! */
+
+    php_stream_write(stream, "hello\n");
+        
+    RETURN_TRUE();
+}
+]]>
+      </programlisting>
+     </example>
+  </para>
+  <para>
+     <example>
+      <title>How to return a stream from a function</title>
+      <programlisting role="c">
+<![CDATA[
+PHP_FUNCTION(example_open_php_home_page)
+{
+    php_stream *stream;
+    
+    stream = php_stream_open_wrapper("http://www.php.net";, "rb", REPORT_ERRORS, NULL);
+    
+    php_stream_to_zval(stream, return_value);
+
+    /* after this point, the stream is "owned" by the script.
+        If you close it now, you will crash PHP! */
+}
+]]>
+      </programlisting>
+     </example>
+  </para>
+  <para>
+   Since streams are automatically cleaned up, it's tempting to think that we can get
+   away with being sloppy programmers and not bother to close the streams when we
+   are done with them.  Although such an approach might work, it is not a good idea
+   for a number of reasons: streams hold locks on system resources while they are
+   open, so leaving a file open after you have finished with it could prevent other
+   processes from accessing it.  If a script deals with a large number of files,
+   the accumulation of the resources used, both in terms of memory and the
+   sheer number of open files, can cause web server requests to fail.  Sounds
+   bad, doesn't it?  The streams API includes some magic that helps you to
+   keep your code clean - if a stream is not closed by your code when it should
+   be, you will find some helpful debugging information in you web server error
+   log.
+  </para>
+  <note>
+   <simpara>
+    Always use a debug build of PHP when developing an extension
+    (<option>--enable-debug</option> when running configure), as a lot of
+    effort has been made to warn you about memory and stream leaks.
+   </simpara>
+  </note>
+  <para>
+   In some cases, it is useful to keep a stream open for the duration of a request,
+   to act as a log or trace file for example.  Writing the code to safely clean up
+   such a stream is not difficult, but it's several lines of code that are not
+   strictly needed.  To save yourself the touble of writing the code, you
+   can mark a stream as being OK for auto cleanup.  What this means is
+   that the streams API will not emit a warning when it is time to auto-cleanup
+   a stream.  To do this, you can use <function>php_stream_auto_cleanup</function>.
+  </para>
+ </sect1>
+
  
 &chapters.streams.common;
 &chapters.streams.dir;



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

Reply via email to