<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.fread">
 <refnamediv>
  <refname>fread</refname>
  <refpurpose>Binary-safe file read</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>string</type><methodname>fread</methodname>
   <methodparam><type>resource</type><parameter>handle</parameter></methodparam>
   <methodparam><type>int</type><parameter>length</parameter></methodparam>
  </methodsynopsis>
  <para>
   <function>fread</function> reads up to
   <parameter>length</parameter> bytes from the file pointer
   referenced by <parameter>handle</parameter>. Reading stops as soon as one
   of the following conditions is met:
   <itemizedlist>
    <listitem>
     <simpara>
      <parameter>length</parameter> bytes have been read
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      EOF (end of file) is reached
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      a packet becomes available or the <link linkend="function.socket-set-timeout">
      socket timeout</link> occurs (for network streams)
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      if the stream is read buffered and it does not represent a plain file, at
      most one read of up to a number of bytes equal to the chunk size (usually
      8192) is made; depending on the previously buffered data, the size of the
      returned data may be larger than the chunk size.
     </simpara>
    </listitem>
   </itemizedlist>
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>handle</parameter></term>
     <listitem>
      &fs.file.pointer;
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>length</parameter></term>
     <listitem>
      <para>
       Up to <parameter>length</parameter> number of bytes read.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns the read string &return.falseforfailure;.
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>A simple <function>fread</function> example</title>
    <programlisting role="php">
<![CDATA[
<?php
// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title>Binary <function>fread</function> example</title>
    <warning>
     <para>
      On systems which differentiate between binary and text files
      (i.e. Windows) the file must be opened with 'b' included in
      <function>fopen</function> mode parameter.
     </para>
    </warning>
    <programlisting role="php">
<![CDATA[
<?php
$filename = "c:\\files\\somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title>Remote <function>fread</function> examples</title>
    <warning>
     <para>
      When reading from anything that is not a regular local file, such as
      streams returned when
      reading <link linkend="features.remote-files">remote files</link> or from
      <function>popen</function> and <function>fsockopen</function>, reading
      will stop after a packet is available.  This means that you should
      collect the data together in chunks as shown in the examples below.
     </para>
    </warning>
    <programlisting role="php">
<![CDATA[
<?php
// For PHP 5 and up
$handle = fopen("http://www.example.com/", "rb");
$contents = stream_get_contents($handle);
fclose($handle);
?>
]]>
    </programlisting>
    <programlisting role="php">
<![CDATA[
<?php
$handle = fopen("http://www.example.com/", "rb");
if (FALSE === $handle) {
    exit("Failed to open stream to URL");
}

$contents = '';

while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}
fclose($handle);
?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>

<refsect1 role="notes">
  &reftitle.notes;
  <note>
   <para>
    If you just want to get the contents of a file into a string, use
    <function>file_get_contents</function> as it has much better performance
    than the code above.
   </para>
  </note>
  <note>
   <para>
    Note that <function>fread</function> reads from the current position of 
    the file pointer. Use <function>ftell</function> to find the current 
    position of the pointer and <function>rewind</function> to rewind the 
    pointer position.
   </para>
  </note>
 </refsect1>

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>fwrite</function></member>
    <member><function>fopen</function></member>
    <member><function>fsockopen</function></member>
    <member><function>popen</function></member>
    <member><function>fgets</function></member>
    <member><function>fgetss</function></member>
    <member><function>fscanf</function></member>
    <member><function>file</function></member>
    <member><function>fpassthru</function></member>
    <member><function>ftell</function></member>
    <member><function>rewind</function></member>
    <member><function>unpack</function></member>
   </simplelist>
  </para>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->