glace Sun Apr 8 03:02:07 2001 EDT
Added files:
/phpdoc/hk bookinfo.xml language-defs.ent make_chm_index_hk.html
preface.xml
/phpdoc/hk/chapters config.xml install.xml intro.xml security.xml
/phpdoc/hk/features connection-handling.xml cookies.xml
error-handling.xml file-upload.xml
http-auth.xml images.xml
persistent-connections.xml remote-files.xml
Log:
draft
Index: phpdoc/hk/bookinfo.xml
+++ phpdoc/hk/bookinfo.xml
<bookinfo id="bookinfo">
<authorgroup id="authors">
<author>
<firstname>Stig</firstname><surname>Sæther Bakken</surname>
</author>
<author>
<firstname>Alexander</firstname><surname>Aulbach</surname>
</author>
<author>
<firstname>Egon</firstname><surname>Schmid</surname>
</author>
<author>
<firstname>Jim</firstname><surname>Winstead</surname>
</author>
<author>
<firstname>Lars Torben</firstname><surname>Wilson</surname>
</author>
<author>
<firstname>Rasmus</firstname><surname>Lerdorf</surname>
</author>
<author>
<firstname>Zeev</firstname><surname>Suraski</surname>
</author>
<author>
<firstname>Andrei</firstname><surname>Zmievski</surname>
</author>
<author>
<firstname>Jouni</firstname><surname>Ahto</surname>
</author>
</authorgroup>
<pubdate>&php.build-date;</pubdate>
<authorgroup id="editors">
<editor>
<firstname>Stig</firstname><surname>Sæther Bakken</surname>
</editor>
<editor>
<firstname>Egon</firstname><surname>Schmid</surname>
</editor>
</authorgroup>
<copyright>
<year>1997</year>
<year>1998</year>
<year>1999</year>
<year>2000</year>
<year>2001</year>
<holder>the PHP ���m�� </holder>
</copyright>
<legalnotice id="copyright">
<title>���v</title>
<simpara>
����U�����v�� PHP ���m�p�թҫ����F 1997, 1998, 1999, 2000, 2001�C�p�զ����W��C��
<link linkend="authors">��U���Ĥ@��</link>.
</simpara>
<simpara>
����U���e�i�� Free Software Foundation �ҵo���� GNU General Public License
�������ڤ��o�C(�A�i��ܸ��H�ӱ��ڪ��� 2 ���ΥH�᪺�����C)
</simpara>
</legalnotice>
</bookinfo>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/language-defs.ent
+++ phpdoc/hk/language-defs.ent
<!ENTITY PHPManual "PHP ��U">
<!ENTITY Date "���:">
<!ENTITY GettingStarted "�J���g">
<!ENTITY LanguageReference "�y�k�g">
<!ENTITY Features "�y���S�x">
<!ENTITY FunctionReference "��ƥؿ�">
<!ENTITY Appendixes "����">
<!ENTITY PEAR "PEAR: PHP Extension and Application Repository">
<!ENTITY available "available in">
Index: phpdoc/hk/make_chm_index_hk.html
+++ phpdoc/hk/make_chm_index_hk.html
<HTML>
<HEAD>
<TITLE>PHP Manual</TITLE>
<META NAME="HTTP_EQUIV" CONTENT="text/html; charset=ISO-8859-1">
<LINK REL="STYLESHEET" HREF="style.css">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF"
TOPMARGIN="0" LEFTMARGIN="0">
<TABLE BORDER="0" WIDTH="100%" HEIGHT="100%" CELLSPACING="0" CELLPADDING="0">
<TR><TD COLSPAN="3"><DIV CLASS="NAVHEADER"><TABLE BGCOLOR="#CCCCFF" BORDER="0"
CELLPADDING="0" CELLSPACING="0" WIDTH="100%"><TR><TD><TABLE WIDTH="100%" BORDER="0"
CELLPADDING="3" CELLSPACING="0"><TR><TH COLSPAN="3">PHP Manual</TH></TR><TR><TD
COLSPAN="3" ALIGN="center"> </TD></TR></TABLE></TD></TR><TR BGCOLOR="#333366">
<TD><IMG SRC="spacer.gif" BORDER="0" WIDTH="1"
HEIGHT="1"><BR></TD></TR></TABLE></DIV></TD></TR>
<TR><TD><IMG SRC="spacer.gif" WIDTH="10" HEIGHT="1"></TD><TD HEIGHT="100%"
VALIGN="MIDDLE" WIDTH="100%"><BR>
<P><TABLE ALIGN="CENTER">
<TR><TD ALIGN="CENTER">
<H1 CLASS="title">PHP Manual</H1>
<DIV CLASS="author">Stig Sæther Bakken</DIV>
<DIV CLASS="author">Alexander Aulbach</DIV>
<DIV CLASS="author">Egon Schmid</DIV>
<DIV CLASS="author">Jim Winstead</DIV>
<DIV CLASS="author">Lars Torben Wilson</DIV>
<DIV CLASS="author">Rasmus Lerdorf</DIV>
<DIV CLASS="author">Zeev Suraski</DIV>
<DIV CLASS="author">Andrei Zmievski</DIV>
<DIV CLASS="author">Jouni Ahto</DIV>
<H4 CLASS="EDITEDBY">Edited by</H4>
<H3 CLASS="editor">Stig Sæther Bakken</H3>
<H3 CLASS="editor">Egon Schmid</H3>
</TD></TR></TABLE>
<BR><P ALIGN="CENTER">This file was generated: [GENTIME]<BR>
Go to <A HREF="http://www.php.net/docs.php">http://www.php.net/docs.php</A>
to get the actual version.</P>
<BR><P CLASS="copyright" ALIGN="CENTER"><A HREF="copyright.html">Copyright</A> ©
1997,
1998, 1999, 2000, 2001 the PHP Documentation Group</P>
</TD><TD><IMG SRC="spacer.gif" WIDTH="10" HEIGHT="1"></TD></TR>
<TR><TD COLSPAN="3"><DIV CLASS="NAVFOOTER"><TABLE BGCOLOR="#CCCCFF" BORDER="0"
CELLPADDING="0" CELLSPACING="0" WIDTH="100%"><TR BGCOLOR="#333366">
<TD><IMG SRC="spacer.gif" BORDER="0" WIDTH="1" HEIGHT="1"><BR></TD></TR>
<TR><TD><TABLE WIDTH="100%" BORDER="0" CELLPADDING="3" CELLSPACING="0">
<TR><TD COLSPAN="3"> </TD></TR><TR><TD COLSPAN="3" ALIGN="center"> </TD>
</TR></TABLE></TD></TR></TABLE></DIV></TD></TR></TABLE>
</BODY></HTML>
Index: phpdoc/hk/preface.xml
+++ phpdoc/hk/preface.xml
<preface id="preface">
<title>�e��</title>
<abstract>
<simpara>
<acronym>PHP</acronym>�D�� "PHP: Hypertext Preprocessor"�A �O�@�إ]�t�b HTML
���½Ķ���y���C ���ҥΪ��y�k�h�ƬO�ɥ� C, Java �M Perl
�t�[�W�@�ǥ��ۤv���W���S�x�C
�}�o�o�ػy�����ت��O�������u�{�v���֪��g�X��ھڻݭn�۰ʲ��� HTML �������{���C
</simpara>
</abstract>
<sect1 id="about">
<title>����U</title>
<para>
����U�ĥ� XML���һy���A �Q�� <ulink
url="&url.docbook.xml;">DocBook XML DTD</ulink>�@�s�g�u��A�èϥΤF<ulink
url="&url.dsssl;"><acronym>DSSSL</acronym></ulink> (Document
Style and Semantics Specification Language) �ӽs�Ƥ��e�C �g�@ HTML, TeX and RTF
�������n��O
<ulink url="&url.jclark;">James Clark</ulink> �Ҷ}�o��
<ulink url="&url.jade;">Jade</ulink> �H�� <ulink url="&url.nwalsh;">Norman
Walsh</ulink>�}�o��
<ulink url="&url.dbstyle;">The Modular DocBook Stylesheets</ulink>
�C ��� PHP ���m�������ج[�O�� &link.stig; �Ҿ�z�X�Ӫ��C
</para>
<para>
You can download the manual in various languages and formats,
including <acronym>PDF</acronym>, plain text, plain
<acronym>HTML</acronym>, WinHelp, and <acronym>RTF</acronym>
from <ulink url="&url.php.docs;">&url.php.docs;</ulink>.
</para>
<para>
Daily HTML snapshots of the manual, including translations, can be
found at <ulink
url="&url.php.snaps.manual;">&url.php.snaps.manual;</ulink>.
</para>
<para>
You can find more information about downloading the
<acronym>XML</acronym> source code of this documentation
at <ulink url="&url.php.cvs;">&url.php.cvs;</ulink>. The
documentation is stored in the <literal>phpdoc</literal> module.
</para>
</sect1>
</preface>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/chapters/config.xml
+++ phpdoc/hk/chapters/config.xml
<chapter id="configuration">
<title>Configuration</title>
<sect1 id="configuration.file">
<title>The configuration file</title>
<simpara>
The configuration file (called <filename>php3.ini</filename> in
PHP 3.0, and simply <filename>php.ini</filename> as of PHP 4.0)
is read when PHP starts up. For the server module versions of PHP,
this happens only once when the web server is started. For the
<acronym>CGI</acronym> version, it happens on every invocation.</simpara>
<simpara>
When using PHP as an Apache module, you can also change the
configuration settings using directives in Apache configuration
files and .htaccess files.</simpara>
<simpara>
With PHP 3.0, there are Apache directives that correspond to each
configuration setting in the <filename>php3.ini</filename> name,
except the name is prefixed by "php3_".</simpara>
<para>
With PHP 4.0, there are just a few Apache directives that allow you
to change the PHP configuration settings.
<variablelist>
<varlistentry>
<term>
<systemitem role="directive">php_value</systemitem>
<parameter>name</parameter>
<parameter>value</parameter>
</term>
<listitem>
<para>
This sets the value of the specified variable.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_flag</systemitem>
<parameter>name</parameter>
<parameter>on|off</parameter>
</term>
<listitem>
<para>
This is used to set a Boolean configuration option.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_admin_value</systemitem>
<parameter>name</parameter>
<parameter>value</parameter>
</term>
<listitem>
<para>
This sets the value of the specified variable. "Admin"
configuration settings can only be set from within the
main Apache configuration files, and not from .htaccess
files.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<systemitem role="directive">php_admin_flag</systemitem>
<parameter>name</parameter>
<parameter>on|off</parameter>
</term>
<listitem>
<para>
This is used to set a Boolean configuration option.</para>
</listitem>
</varlistentry>
</variablelist></para>
<simpara>
You can view the settings of the configuration values in
the output of <function>phpinfo</function>. You can also
access the values of individial configuration settings using
<function>get_cfg_var</function>.</simpara>
<sect2 id="ini.sect.general">
<title>General Configuration Directives</title>
<para>
<variablelist>
<varlistentry id="ini.allow-url-fopen">
<term>
<parameter>allow_url_fopen</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
This option enables the URL-aware fopen wrappers that enable accessing URL
object
like files. Default wrappers are provided for the access of
<link linkend="features.remote-files">remote files</link>
using the ftp or http protocol, some extensions like zlib may register
additional wrappers.
</para>
<note>
<para>
This option was introduced immediately after the release of version 4.0.3.
For versions up to and including 4.0.3 you can only disable this feature at
compile time by using the configuration switch
<link
linkend="install.configure.disable-url-fopen-wrapper"><parameter>--disable-url-fopen-wrapper</parameter></link>.
</para>
</note>
</listitem>
</varlistentry>
<varlistentry id="ini.asp-tags">
<term>
<parameter>asp_tags</parameter>
<type>boolean</type>
</term>
<listitem>
<simpara>
Enables the use of ASP-like <% %> tags in addition to
the usual <?php ?> tags. This includes the
variable-value printing shorthand of <%= $value %>. For
more information, see <link linkend="language.basic-syntax.phpmode">Escaping
from HTML</link>.
</simpara>
<note>
<para>Support for ASP-style tags was added in 3.0.4.</para>
</note>
</listitem>
</varlistentry>
<varlistentry id="ini.auto-append-file">
<term>
<parameter>auto_append_file</parameter>
<type>string</type>
</term>
<listitem>
<para>
Specifies the name of a file that is automatically parsed
after the main file. The file is included as if it was
called with the <function>include</function> function, so
<link linkend="ini.include-path">include_path</link> is used.</para>
<para>
The special value <systemitem class="constant">none</systemitem> disables
auto-appending.
<note>
<simpara>
If the script is terminated with <function>exit</function>,
auto-append will <emphasis>not</emphasis> occur.</simpara>
</note></para>
</listitem>
</varlistentry>
<varlistentry id="ini.auto-prepend-file">
<term>
<parameter>auto_prepend_file</parameter>
<type>string</type>
</term>
<listitem>
<para>
Specifies the name of a file that is automatically parsed
before the main file. The file is included as if it was
called with the <function>include</function> function, so
<link linkend="ini.include-path">include_path</link> is used.</para>
<para>
The special value <systemitem class="constant">none</systemitem> disables
auto-prepending.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.cgi-ext">
<term>
<parameter>cgi_ext</parameter>
<type>string</type>
</term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.display-errors">
<term>
<parameter>display_errors</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
This determines whether errors should be printed to the screen
as part of the HTML output or not.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.doc-root">
<term>
<parameter>doc_root</parameter>
<type>string</type>
</term>
<listitem>
<para>
PHP's "root directory" on the server. Only used if
non-empty. If PHP is configured with <link linkend="ini.safe-mode">safe
mode</link>, no files outside
this directory are served.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.engine">
<term>
<parameter>engine</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
This directive is really only useful in the Apache module
version of PHP. It is used by sites that would like to turn
PHP parsing on and off on a per-directory or per-virtual
server basis. By putting <userinput>engine
off</userinput> in the appropriate places in the
<filename>httpd.conf</filename> file, PHP can be enabled or
disabled.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.error-log">
<term>
<parameter>error_log</parameter>
<type>string</type>
</term>
<listitem>
<para>
Name of file where script errors should be logged. If the
special value <literal>syslog</literal> is used, the errors
are sent to the system logger instead. On UNIX, this means
syslog(3) and on Windows NT it means the event log. The
system logger is not supported on Windows 95.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.error-reporting">
<term>
<parameter>error_reporting</parameter>
<type>integer</type>
</term>
<listitem>
<para>
Set the error reporting level. The parameter is an integer
representing a bit field. Add the values of the error
reporting levels you want.
<table>
<title>Error Reporting Levels</title>
<tgroup cols="2">
<thead>
<row>
<entry>bit value</entry>
<entry>enabled reporting</entry>
</row>
</thead>
<tbody>
<row>
<entry>1</entry>
<entry>normal errors</entry>
</row>
<row>
<entry>2</entry>
<entry>normal warnings</entry>
</row>
<row>
<entry>4</entry>
<entry>parser errors</entry>
</row>
<row>
<entry>8</entry>
<entry>non-critical style-related warnings</entry>
</row>
</tbody>
</tgroup>
</table>
The default value for this directive is 7 (normal errors,
normal warnings and parser errors are shown).
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.open-basedir">
<term>
<parameter>open_basedir</parameter>
<type>string</type>
</term>
<listitem>
<para>
Limit the files that can be opened by PHP to the specified
directory-tree.
</para>
<para>
When a script tries to open a file with,
for example, fopen or gzopen, the location of the file is
checked. When the file is outside the specified directory-tree,
PHP will refuse to open it. All symbolic links are resolved,
so it's not possible to avoid this restriction with a symlink.
</para>
<para>
The special value <systemitem class="constant">.</systemitem>
indicates that the directory in which the script is stored will
be used as base-directory.
</para>
<para>
Under Windows, separate the directories with a semicolon. On all
other systems, separate the directories with a colon. As an Apache
module, open_basedir paths from parent directories are now
automatically inherited.
</para>
<note>
<para>Support for multiple directories was added in 3.0.7.</para>
</note>
<para>
The default is to allow all files to be opened.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.gpc-order">
<term>
<parameter>gpc_order</parameter>
<type>string</type>
</term>
<listitem>
<para>
Set the order of GET/POST/COOKIE variable parsing. The
default setting of this directive is "GPC". Setting this to
"GP", for example, will cause PHP to completely ignore cookies
and to overwrite any GET method variables with POST-method
variables of the same name.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ignore-user-abort">
<term>
<parameter>ignore_user_abort</parameter>
<type>string</type>
</term>
<listitem>
<para>
On by default. If changed to Off scripts will be terminated as
soon as they try to output something after a client has aborted
their connection.
<function>ignore_user_abort</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.include-path">
<term>
<parameter>include_path</parameter>
<type>string</type>
</term>
<listitem>
<para>
Specifies a list of directories where the
<function>require</function>, <function>include</function>
and <function>fopen_with_path</function> functions look for
files. The format is like the system's <envar>PATH</envar>
environment variable: a list of directories separated with a
colon in UNIX or semicolon in Windows.
<example>
<title>UNIX include_path</title>
<programlisting role="php3.ini">
include_path=.:/home/httpd/php-lib
</programlisting>
</example>
<example>
<title>Windows include_path</title>
<programlisting role="php3.ini">
include_path=".;c:\www\phplib"
</programlisting>
</example>
The default value for this directive is <literal>.</literal>
(only the current directory).</para>
</listitem>
</varlistentry>
<varlistentry id="ini.isapi-ext">
<term>
<parameter>isapi_ext</parameter>
<type>string</type>
</term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.log-errors">
<term>
<parameter>log_errors</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Tells whether script error messages should be logged to the
server's error log. This option is thus server-specific.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.magic-quotes-gpc">
<term>
<parameter>magic_quotes_gpc</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Sets the magic_quotes state for GPC (Get/Post/Cookie)
operations. When magic_quotes are on, all ' (single-quote),
" (double quote), \ (backslash) and NUL's are escaped
with a backslash automatically. If magic_quotes_sybase is
also on, a single-quote is escaped with a single-quote
instead of a backslash.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.magic-quotes-runtime">
<term>
<parameter>magic_quotes_runtime</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
If <parameter>magic_quotes_runtime</parameter> is enabled,
most functions that return data from any sort of external
source including databases and text files will have quotes
escaped with a backslash. If
<parameter>magic_quotes_sybase</parameter> is also on, a
single-quote is escaped with a single-quote instead of a
backslash.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.magic-quotes-sybase">
<term>
<parameter>magic_quotes_sybase</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
If <parameter>magic_quotes_sybase</parameter> is also on, a
single-quote is escaped with a single-quote instead of a
backslash if <parameter>magic_quotes_gpc</parameter> or
<parameter>magic_quotes_runtime</parameter> is enabled.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.max-execution-time">
<term>
<parameter>max_execution_time</parameter>
<type>integer</type>
</term>
<listitem>
<para>
This sets the maximum time in seconds a script is allowed to
take before it is terminated by the parser. This helps
prevent poorly written scripts from tying up the server. The
default setting is <literal>30</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.memory-limit">
<term>
<parameter>memory_limit</parameter>
<type>integer</type>
</term>
<listitem>
<para>
This sets the maximum amount of memory in bytes that a script
is allowed to allocate. This helps prevent poorly written
scripts for eating up all available memory on a server.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.nsapi-ext">
<term>
<parameter>nsapi_ext</parameter>
<type>string</type>
</term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.register-globals">
<term>
<parameter>register_globals</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Tells whether or not to register the EGPCS (Environment, GET,
POST, Cookie, Server) variables as global variables. You may
want to turn this off if you don't want to clutter your
scripts' global scope with user data. This makes the most
sense when coupled with <link
linkend="ini.track-vars">track_vars</link> - in which case
you can access all of the EGPCS variables through the
<varname>$HTTP_ENV_VARS</varname>,
<varname>$HTTP_GET_VARS</varname>,
<varname>$HTTP_POST_VARS</varname>,
<varname>$HTTP_COOKIE_VARS</varname>, and
<varname>$HTTP_SERVER_VARS</varname>
arrays in the global scope.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.short-open-tag">
<term>
<parameter>short_open_tag</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Tells whether the short form (<userinput><? ?></userinput>)
of PHP's open tag should be allowed. If you want to use PHP in
combination with XML, you have to disable this option. If
disabled, you must use the long form of the open tag
(<userinput><?php ?></userinput>).</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sql.safe-mode">
<term>
<parameter>sql.safe_mode</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.track-errors">
<term>
<parameter>track_errors</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
If enabled, the last error message will always be present in the
global variable <symbol>$php_errormsg</symbol>.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.track-vars">
<term>
<parameter>track_vars</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
If enabled, then Environment, GET, POST, Cookie, and Server
variables can be found in the global associative arrays
<varname>$HTTP_ENV_VARS</varname>,
<varname>$HTTP_GET_VARS</varname>,
<varname>$HTTP_POST_VARS</varname>,
<varname>$HTTP_COOKIE_VARS</varname>, and
<varname>$HTTP_SERVER_VARS</varname>.
</para>
<para>
Note that as of PHP 4.0.3, <systemitem
role="directive">track_vars</systemitem> is always turned on.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.upload-tmp-dir">
<term>
<parameter>upload_tmp_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
The temporary directory used for storing files when doing
file upload. Must be writable by whatever user PHP is
running as.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.user-dir">
<term>
<parameter>user_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
The base name of the directory used on a user's home
directory for PHP files, for example
<literal>public_html</literal>.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.warn-plus-overloading">
<term>
<parameter>warn_plus_overloading</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
If enabled, this option makes PHP output a warning when the
plus (<literal>+</literal>) operator is used on strings.
This is to make it easier to find scripts that need to be
rewritten to using the string concatenator instead
(<literal>.</literal>).</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect2>
<sect2 id="ini.sect.mail">
<title>Mail Configuration Directives</title>
<variablelist>
<varlistentry id="ini.smtp">
<term>
<parameter>SMTP</parameter>
<type>string</type>
</term>
<listitem>
<para>
DNS name or IP address of the SMTP server PHP under Windows
should use for mail sent with the <function>mail</function>
function.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sendmail-from">
<term>
<parameter>sendmail_from</parameter>
<type>string</type>
</term>
<listitem>
<para>
Which "From:" mail address should be used in mail sent from
PHP under Windows.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sendmail-path">
<term>
<parameter>sendmail_path</parameter>
<type>string</type>
</term>
<listitem>
<para>
Where the <command>sendmail</command> program can be found,
usually <filename>/usr/sbin/sendmail</filename> or
<filename>/usr/lib/sendmail</filename>
<command>configure</command> does an honest attempt of
locating this one for you and set a default, but if it fails,
you can set it here.</para>
<para>
Systems not using sendmail should set this directive to the
sendmail wrapper/replacement their mail system offers, if any.
For example, <ulink url="&url.qmail;">Qmail</ulink>
users can normally set it to
<filename>/var/qmail/bin/sendmail</filename>.</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.safe-mode">
<title>Safe Mode Configuration Directives</title>
<variablelist>
<varlistentry id="ini.safe-mode">
<term>
<parameter>safe_mode</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to enable PHP's safe mode. Read the <link linkend="security">Security
chapter</link> for more
more information.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.safe-mode-exec-dir">
<term>
<parameter>safe_mode_exec_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
If PHP is used in safe mode, <function>system</function> and
the other functions executing system programs refuse to start
programs that are not in this directory.</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.debugger">
<title>Debugger Configuration Directives</title>
<variablelist>
<varlistentry id="ini.debugger.host">
<term>
<parameter>debugger.host</parameter>
<type>string</type>
</term>
<listitem>
<para>
DNS name or IP address of host used by the debugger.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.debugger.port">
<term>
<parameter>debugger.port</parameter>
<type>string</type>
</term>
<listitem>
<para>
Port number used by the debugger.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.debugger.enabled">
<term>
<parameter>debugger.enabled</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether the debugger is enabled.</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.extension">
<title>Extension Loading Directives</title>
<variablelist>
<varlistentry id="ini.enable-dl">
<term>
<parameter>enable_dl</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
This directive is really only useful in the Apache module
version of PHP. You can turn dynamic loading of PHP
extensions with <function>dl</function> on and off per
virtual server or per directory.
</para>
<para>
The main reason for turning dynamic loading off is
security. With dynamic loading, it's possible to ignore all
the safe_mode and open_basedir restrictions.
</para>
<para>
The default is to allow dynamic loading, except when using
safe-mode. In safe-mode, it's always imposible to use
<function>dl</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.extension-dir">
<term>
<parameter>extension_dir</parameter>
<type>string</type>
</term>
<listitem>
<para>
In what directory PHP should look for dynamically loadable
extensions.</para>
</listitem>
</varlistentry>
<varlistentry id="ini.extension">
<term>
<parameter>extension</parameter>
<type>string</type>
</term>
<listitem>
<para>
Which dynamically loadable extensions to load when PHP starts
up.</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.mysql">
<title>MySQL Configuration Directives</title>
<variablelist>
<varlistentry id="ini.mysql.allow-persistent">
<term>
<parameter>mysql.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent MySQL connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.mysql.default-host">
<term>
<parameter>mysql.default_host</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default server host to use when connecting to the database
server if no other host is specified.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.mysql.default-user">
<term>
<parameter>mysql.default_user</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default user name to use when connecting to the database
server if no other name is specified.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.mysql.default-password">
<term>
<parameter>mysql.default_password</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default password to use when connecting to the database
server if no other password is specified.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.mysql.max-persistent">
<term>
<parameter>mysql.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent MySQL connections per
process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.mysql.max-links">
<term>
<parameter>mysql.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of MySQL connections per process, including
persistent connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.msql">
<title>mSQL Configuration Directives</title>
<variablelist>
<varlistentry id="ini.msql.allow-persistent">
<term>
<parameter>msql.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent mSQL connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.msql.max-persistent">
<term>
<parameter>msql.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent mSQL connections per process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.msql.max-links">
<term>
<parameter>msql.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of mSQL connections per process, including
persistent connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.pgsql">
<title>Postgres Configuration Directives</title>
<variablelist>
<varlistentry id="ini.pgsql.allow-persistent">
<term>
<parameter>pgsql.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent Postgres connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.pgsql.max-persistent">
<term>
<parameter>pgsql.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent Postgres connections per
process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.pgsql.max-links">
<term>
<parameter>pgsql.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of Postgres connections per process,
including persistent connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.sesam">
<title>SESAM Configuration Directives</title>
<variablelist>
<varlistentry id="ini.sesam-oml">
<term>
<parameter>sesam_oml</parameter>
<type>string</type>
</term>
<listitem>
<para>
Name of BS2000 PLAM library containing the loadable SESAM
driver modules. Required for using SESAM functions. The
BS2000 PLAM library must be set ACCESS=READ,SHARE=YES
because it must be readable by the apache server's user id.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sesam-configfile">
<term>
<parameter>sesam_configfile</parameter>
<type>string</type>
</term>
<listitem>
<para>
Name of SESAM application configuration file. Required for
using SESAM functions. The BS2000 file must be readable by
the apache server's user id.
</para>
<para>
The application configuration file will usually contain a
configuration like (see SESAM
reference manual):
<informalexample>
<programlisting role="bs2000">
CNF=B
NAM=K
NOTYPE</programlisting>
</informalexample>
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sesam-messagecatalog">
<term>
<parameter>sesam_messagecatalog</parameter>
<type>string</type>
</term>
<listitem>
<para>
Name of SESAM message catalog file. In most cases, this
directive is not neccessary. Only if the SESAM message file
is not installed in the system's BS2000 message file table,
it can be set with this directive.
</para>
<para>
The message catalog must be set ACCESS=READ,SHARE=YES because
it must be readable by the apache server's user id.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.sybase">
<title>Sybase Configuration Directives</title>
<variablelist>
<varlistentry id="ini.sybase.allow-persistent">
<term>
<parameter>sybase.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent Sybase connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybase.max-persistent">
<term>
<parameter>sybase.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent Sybase connections per
process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybase.max-links">
<term>
<parameter>sybase.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of Sybase connections per process,
including persistent connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.sybct">
<title>Sybase-CT Configuration Directives</title>
<variablelist>
<varlistentry id="ini.sybct.allow-persistent">
<term>
<parameter>sybct.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent Sybase-CT connections.
The default is on.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.max-persistent">
<term>
<parameter>sybct.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent Sybase-CT connections per
process. The default is -1 meaning unlimited.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.max-links">
<term>
<parameter>sybct.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of Sybase-CT connections per process,
including persistent connections. The default is -1 meaning
unlimited.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.min-server-severity">
<term>
<parameter>sybct.min_server_severity</parameter>
<type>integer</type>
</term>
<listitem>
<para>
Server messages with severity greater than or equal to
sybct.min_server_severity will be reported as warnings. This
value can also be set from a script by calling
<function>sybase_min_server_severity</function>. The default
is 10 which reports errors of information severity or greater.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.min-client-severity">
<term>
<parameter>sybct.min_client_severity</parameter>
<type>integer</type>
</term>
<listitem>
<para>
Client library messages with severity greater than or equal to
sybct.min_client_severity will be reported as warnings. This
value can also be set from a script by calling
<function>sybase_min_client_severity</function>. The default
is 10 which effectively disables reporting.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.login-timeout">
<term>
<parameter>sybct.login_timeout</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum time in seconds to wait for a connection attempt
to succeed before returning failure. Note that if
max_execution_time has been exceeded when a connection attempt
times out, your script will be terminated before it can take
action on failure. The default is one minute.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.timeout">
<term>
<parameter>sybct.timeout</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum time in seconds to wait for a select_db or query
operation to succeed before returning failure. Note that if
max_execution_time has been exceeded when am operation times
out, your script will be terminated before it can take action
on failure. The default is no limit.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.sybct.hostname">
<term>
<parameter>sybct.hostname</parameter>
<type>string</type>
</term>
<listitem>
<para>
The name of the host you claim to be connecting from, for
display by sp_who. The default is none.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.informix">
<title>Informix Configuration Directives</title>
<variablelist>
<varlistentry id="ini.ifx.allow-persistent">
<term>
<parameter>ifx.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent Informix connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.max-persistent">
<term>
<parameter>ifx.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent Informix connections per
process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.max-links">
<term>
<parameter>ifx.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of Informix connections per process, including
persistent connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.default-host">
<term>
<parameter>ifx.default_host</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default host to connect to when no host is specified
in <function>ifx_connect</function> or
<function>ifx_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.default-user">
<term>
<parameter>ifx.default_user</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default user id to use when none is specified
in <function>ifx_connect</function> or
<function>ifx_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.default-password">
<term>
<parameter>ifx.default_password</parameter>
<type>string</type>
</term>
<listitem>
<para>
The default password to use when none is specified
in <function>ifx_connect</function> or
<function>ifx_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.blobinfile">
<term>
<parameter>ifx.blobinfile</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Set to true if you want to return blob columns
in a file, false if you want them in memory. You can
override the setting at runtime
with <function>ifx_blobinfile_mode</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.textasvarchar">
<term>
<parameter>ifx.textasvarchar</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Set to true if you want to return TEXT columns
as normal strings in select statements,
false if you want to use blob id parameters. You can
override the setting at runtime with
<function>ifx_textasvarchar</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.byteasvarchar">
<term>
<parameter>ifx.byteasvarchar</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Set to true if you want to return BYTE columns
as normal strings in select queries,
false if you want to use blob id parameters. You can
override the setting at runtime with
<function>ifx_textasvarchar</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.charasvarchar">
<term>
<parameter>ifx.charasvarchar</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Set to true if you want to trim trailing spaces
from CHAR columns when fetching them.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.ifx.nullformat">
<term>
<parameter>ifx.nullformat</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Set to true if you want to return NULL columns
as the literal string "NULL", false if you want
them returned as the empty string "". You can
override this setting at runtime with
<function>ifx_nullformat</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.bcmath">
<title>BC Math Configuration Directives</title>
<variablelist>
<varlistentry id="ini.bcmath.scale">
<term>
<parameter>bcmath.scale</parameter>
<type>integer</type>
</term>
<listitem>
<para>
Number of decimal digits for all bcmath functions.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.browscap">
<title>Browser Capability Configuration Directives</title>
<variablelist>
<varlistentry id="ini.browscap">
<term>
<parameter>browscap</parameter>
<type>string</type>
</term>
<listitem>
<para>
Name of browser capabilities file. See also
<function>get_browser</function>.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="ini.sect.uodbc">
<title>Unified ODBC Configuration Directives</title>
<variablelist>
<varlistentry id="ini.uodbc.default-db">
<term>
<parameter>uodbc.default_db</parameter>
<type>string</type>
</term>
<listitem>
<para>
ODBC data source to use if none is specified in
<function>odbc_connect</function> or
<function>odbc_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.uodbc.default-user">
<term>
<parameter>uodbc.default_user</parameter>
<type>string</type>
</term>
<listitem>
<para>
User name to use if none is specified in
<function>odbc_connect</function> or
<function>odbc_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.uodbc.default-pw">
<term>
<parameter>uodbc.default_pw</parameter>
<type>string</type>
</term>
<listitem>
<para>
Password to use if none is specified in
<function>odbc_connect</function> or
<function>odbc_pconnect</function>.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.uodbc.allow-persistent">
<term>
<parameter>uodbc.allow_persistent</parameter>
<type>boolean</type>
</term>
<listitem>
<para>
Whether to allow persistent ODBC connections.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.uodbc.max-persistent">
<term>
<parameter>uodbc.max_persistent</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of persistent ODBC connections per process.
</para>
</listitem>
</varlistentry>
<varlistentry id="ini.uodbc.max-links">
<term>
<parameter>uodbc.max_links</parameter>
<type>integer</type>
</term>
<listitem>
<para>
The maximum number of ODBC connections per process, including
persistent connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/chapters/install.xml
+++ phpdoc/hk/chapters/install.xml
<chapter id="installation">
<title>Installation</title>
<sect1 id="install.downloading">
<title>Downloading the latest version</title>
<simpara>
The source code, and binary distributions for some platforms
(including Windows), can be found at <literal><ulink
url="&url.php;">&url.php;</ulink></literal>. We recommend
you to choose <ulink url="&url.mirrors;">mirror</ulink> nearest
to you for downloading the distributions.
</simpara>
</sect1>
<sect1 id="install.unix">
<title>Installation on UNIX systems</title>
<para>
This section will guide you through the general configuration and
installation of PHP on unix systems. Be sure to investigate any
sections specific to your platform or web server before you begin
the process.
</para>
<para>
Prerequisite knowledge and software:
<itemizedlist>
<listitem>
<simpara>
Basic UNIX skills (being able to operate "make" and a C
compiler, if compiling)
</simpara>
</listitem>
<listitem>
<simpara>
An ANSI C compiler (if compiling)
</simpara>
</listitem>
<listitem>
<simpara>
flex (for compiling)
</simpara>
</listitem>
<listitem>
<simpara>
bison (for compiling)
</simpara>
</listitem>
<listitem>
<simpara>
A web server
</simpara>
</listitem>
<listitem>
<simpara>
Any module specific components (such as gd, pdf libs, etc.)
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
There are several ways to install PHP for the Unix platform, either
with a compile and configure process, or through various
pre-packaged methods. This documentation is mainly focused around
the process of compiling and configuring PHP.
</para>
<para>
The initial PHP setup and configuration process is controlled by the
use of the commandline options of the <filename>configure</filename>
script. This page outlines the usage of the most common options,
but there are many others to play with. Check out the <link
linkend="install.configure">Complete list of configure
options</link> for an exhaustive rundown. There are several ways
to install PHP:
<itemizedlist>
<listitem>
<simpara>
As an <link linkend="install.apache">Apache module</link>
</simpara>
</listitem>
<listitem>
<simpara>
As an <link linkend="install.fhttpd">fhttpd module</link>
</simpara>
</listitem>
<listitem>
<simpara>
For use with <link
linkend="install.otherhttpd">AOLServer, NSAPI,
phttpd, Pi3Web, Roxen, thttpd, or Zeus.</link>
</simpara>
</listitem>
<listitem>
<simpara>
As a <link linkend="install.commandline">CGI executable</link>
</simpara>
</listitem>
</itemizedlist>
</para>
<sect2 id="install.unix.apache-module">
<title>Apache Module Quick Reference</title>
<para>
PHP can be compiled in a number of different ways, but one of
the most popular is as an Apache module. The following is a quick
installation overview.
</para>
<example id="install.unix.apache-module.quick">
<title>
Quick Installation Instructions for PHP 4 (Apache Module Version)
</title>
<programlisting>
1. gunzip apache_1.3.x.tar.gz
2. tar xvf apache_1.3.x.tar
3. gunzip php-x.x.x.tar.gz
4. tar xvf php-x.x.x.tar
5. cd apache_1.3.x
6. ./configure --prefix=/www
7. cd ../php-x.x.x
8. ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9. make
10. make install
11. cd ../apache_1.3.x
12. ./configure --activate-module=src/modules/php4/libphp4.a
13. make
14. make install
15. cd ../php-x.x.x
16. cp php.ini-dist /usr/local/lib/php.ini
17. Edit your httpd.conf or srm.conf file and add:
AddType application/x-httpd-php .php
18. Use your normal procedure for restarting the Apache server. (You must
stop and restart the server, not just cause the server to reload by
use a HUP or USR1 signal.)
</programlisting>
</example>
</sect2>
<sect2 id="install.building">
<title>Building</title>
<simpara>
When PHP is configured, you are ready to build the CGI executable.
The command <command>make</command> should
take care of this. If it fails and you can't figure out why, see
the <link linkend="install-problems">Problems section</link>.
</simpara>
</sect2>
</sect1>
<sect1 id="install.linux">
<title>Unix/Linux installs</title>
<para>
This section contains notes and hints specific to installing
PHP on Linux distributions.
</para>
<sect2 id="install.linux.packages">
<title>Using Packages</title>
<simpara>
Many Linux distributions have some sort of package installation,
such as RPM. This can assist in setting up a standard
configuration, but if you need to have a different set of features
(such as a secure server, or a different database driver), you may
need to build php and/or your webserver. If you are unfamiliar
with building and compiling your own software, it is worth
checking to see whether somebody has already built a packaged
version of PHP with the features you need.
</simpara>
</sect2>
</sect1>
<sect1 id="install.hpux">
<title>Unix/HP-UX installs</title>
<para>
This section contains notes and hints specific to installing PHP
on HP-UX systems.
</para>
<example id="install.hpux.example">
<title>
Installation Instructions for HP-UX 10
</title>
<programlisting>
From: [EMAIL PROTECTED]
04-Jan-2001 09:49
(These tips are for PHP 4.0.4 and Apache v1.3.9)
So you want to install PHP and Apache on a HP-UX 10.20 box?
1. You need gzip, download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/gzip-1.2.4a/gzip-1.2.4a-sd-10.20.depot.Z
uncompress the file and install using swinstall
2. You need gcc, download a binary distribution from
http://gatekeep.cs.utah.edu/ftp/hpux/Gnu/gcc-2.95.2/gcc-2.95.2-sd-10.20.depot.gz
gunzip this file and install gcc using swinstall.
3. You need the GNU binutils, you can download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/binutils-2.9.1/binutils-2.9.1-sd-10.20.depot.gz
gunzip and install using swinstall.
4. You now need bison, you can download a binary distribution from
http://hpux.connect.org.uk/ftp/hpux/Gnu/bison-1.28/bison-1.28-sd-10.20.depot.gz
install as above.
5. You now need flex, you need to download the source from one of the
http://www.gnu.org mirrors. It is in the <filename>non-gnu</filename> directory of the
ftp site.
Download the file, gunzip, then tar -xvf it. Go into the newly created flex
directory and do a ./configure, then a make, and then a make install
If you have errors here, it's probably because gcc etc. are not in your
PATH so add them to your PATH.
Right, now into the hard stuff.
6. Download the PHP and apache sources.
7. gunzip and tar -xvf them.
We need to hack a couple of files so that they can compile ok.
8. Firstly the configure file needs to be hacked because it seems to lose
track of the fact that you are a hpux machine, there will be a
better way of doing this but a cheap and cheerful hack is to put
lt_target=hpux10.20
on line 47286 of the configure script.
9. Next, the Apache GuessOS file needs to be hacked. Under
apache_1.3.9/src/helpers change line 89 from
"echo "hp${HPUXMACH}-hpux${HPUXVER}"; exit 0"
to:
"echo "hp${HPUXMACH}-hp-hpux${HPUXVER}"; exit 0"
10. You cannot install PHP as a shared object under HP-UX so you must compile
it as a static, just follow the instructions at the Apache page.
11. PHP and apache should have compiled OK, but Apache won't start. you need
to create a new user for Apache, eg www, or apache. You then change lines 252
and 253 of the conf/httpd.conf in Apache so that instead of
User nobody
Group nogroup
you have something like
User www
Group sys
This is because you can't run Apache as nobody under hp-ux.
Apache and PHP should then work.
Hope this helps somebody,
Paul Mckay.
</programlisting>
</example>
</sect1>
<sect1 id="install.solaris">
<title>Unix/Solaris installs</title>
<para>
This section contains notes and hints specific to installing
PHP on Solaris systems.
</para>
<sect2 id="install.solaris.required">
<title>Required software</title>
<para>
Solaris installs often lack C compilers and their related tools.
The required software is as follows:
<itemizedlist>
<listitem>
<simpara>
gcc (recommended, other C compilers may work)
</simpara>
</listitem>
<listitem>
<simpara>
make
</simpara>
</listitem>
<listitem>
<simpara>
flex
</simpara>
</listitem>
<listitem>
<simpara>
bison
</simpara>
</listitem>
<listitem>
<simpara>
m4
</simpara>
</listitem>
<listitem>
<simpara>
autoconf
</simpara>
</listitem>
<listitem>
<simpara>
automake
</simpara>
</listitem>
<listitem>
<simpara>
perl
</simpara>
</listitem>
<listitem>
<simpara>
gzip
</simpara>
</listitem>
<listitem>
<simpara>
tar
</simpara>
</listitem>
</itemizedlist>
In addition, you will need to install (and possibly compile) any
additional software specific to your configuration (such as Oracle
or MySQL.
</para>
</sect2>
<sect2 id="install.solaris.packages">
<title>Using Packages</title>
<simpara>
You can simplify the Solaris install process by using pkgadd to
install most of your needed components.
</simpara>
</sect2>
</sect1>
<sect1 id="install.openbsd">
<title>Unix/OpenBSD installs</title>
<para>
This section contains notes and hints specific to installing
PHP on <ulink url="&url.openbsd;">OpenBSD</ulink>.
</para>
<sect2 id="install.openbsd.ports">
<title>Using Ports</title>
<simpara>
This is the recommended method of installing PHP on OpenBSD, as it will have
the latest patches and security fixes applied to it by the maintainers. To
use this method, ensure that you have a <ulink url="&url.openbsd.ports;">
recent ports tree</ulink>. Then simply find out which flavors you wish
to install, and issue the <command>make install</command> command. Below
is an example of how to do this.
</simpara>
<example id="install.openbsd.ports.example">
<title>OpenBSD Ports Install Example</title>
<programlisting>
$ cd /usr/ports/www/php4
$ make show VARNAME=FLAVORS
(choose which flavors you want from the list)
$ FLAVOR="imap gettext ldap mysql gd pdflib" make install
$ php4-enable
</programlisting>
</example>
</sect2>
<sect2 id="install.openbsd.packages">
<title>Using Packages</title>
<simpara>
There are pre-compiled packages available for your release
of <ulink url="&url.openbsd;">OpenBSD</ulink>. These integrate
automatically with the version of Apache installed with the OS.
However, since there are a large number of options (called
<emphasis>flavors</emphasis>) available for this port,
you may find it easier to compile it from source using the ports tree.
Read the <ulink url="&url.openbsd.packages;">packages(7)</ulink>
manual page for more information in what packages are available.
</simpara>
</sect2>
</sect1>
<sect1 id="install.macosx">
<title>Unix/Mac OS X installs</title>
<para>
This section contains notes and hints specific to installing
PHP on Mac OS X.
</para>
<sect2 id="install.macosx.packages">
<title>Using Packages</title>
<simpara>
There are a few pre-packaged and pre-compiled versions of PHP for
Mac OS X. This can help in setting up a standard
configuration, but if you need to have a different set of features
(such as a secure server, or a different database driver), you may
need to build PHP and/or your web server yourself. If you are unfamiliar
with building and compiling your own software, it's worth
checking whether somebody has already built a packaged
version of PHP with the features you need.
<ulink url="&url.lightyear;">Lightyear Design</ulink> offers a
pre-built version of PHP for OS X, as does
<ulink url="&url.tenon;">Tenon Intersystems</ulink>.
</simpara>
</sect2>
<sect2 id="install.macosx.compile">
<title>Compiling for OS X server</title>
<simpara>
There are two slightly different versions of Mac OS X, client and
server. The following is for OS X Server.
</simpara>
<example id="install.macosx.compile.example">
<title>Mac OS X server install</title>
<programlisting>
1. Get the latest distributions of Apache and PHP
2. Untar them, and run the configure program on Apache like so.
./configure --exec-prefix=/usr \
--localstatedir=/var \
--mandir=/usr/share/man \
--libexecdir=/System/Library/Apache/Modules \
--iconsdir=/System/Library/Apache/Icons \
--includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
--enable-shared=max \
--enable-module=most \
--target=apache
4. You may also want to add this line:
setenv OPTIM=-O2
If you want the compiler to do some optimization.
5. Next, go to the PHP 4 source directory and configure it.
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/share/man \
--with-xml \
--with-apache=/src/apache_1.3.12
If you have any other addiitons (MySQL, GD, etc.), be sure to add
them here. For the --with-apache string, put in the path to your
apache source directory, for example "/src/apache_1.3.12".
6. make
7. make install
This will add a directory to your Apache source directory under
src/modules/php4.
8. Now, reconfigure Apache to build in PHP 4.
./configure --exec-prefix=/usr \
--localstatedir=/var \
--mandir=/usr/share/man \
--libexecdir=/System/Library/Apache/Modules \
--iconsdir=/System/Library/Apache/Icons \
--includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
--enable-shared=max \
--enable-module=most \
--target=apache \
--activate-module=src/modules/php4/libphp4.a
You may get a message telling you that libmodphp4.a is out of date.
If so, go to the src/modules/php4 directory inside your apache
source directory and run this command:
ranlib libmodphp4.a
Then go back to the root of the apache source directory and run the
above configure command again. That'll bring the link table up to
date.
9. make
10. make install
11. copy and rename the php.ini-dist file to your "bin" directory from your
PHP 4 source directory:
cp php.ini-dist /usr/local/bin/php.ini
or (if your don't have a local directory)
cp php.ini-dist /usr/bin/php.ini
</programlisting>
</example>
<simpara>
Other examples for
<ulink url="&url.stepwise.macosx-client;">Mac OS X client</ulink>
and
<ulink url="&url.stepwise.macosx-client;">Mac OS X server</ulink>
are available at <ulink url="&url.stepwise;">Stepwise</ulink>.
</simpara>
</sect2>
</sect1>
<sect1 id="install.configure">
<title>Complete list of configure options</title>
<note>
<para>
These are only used at compile time. If you want to alter PHP's
runtime configuration, please see the chapter on <link
linkend="configuration">Configuration</link>.
</para>
</note>
<para>
The following is a complete list of options supported by the PHP 3
and PHP 4 <filename>configure</filename> scripts, used when
compiling in Unix-like environments. Some are available in PHP 3,
some in PHP 4, and some in both, as noted. There are many options
the names of which have changed between PHP 3 and PHP 4, but which
accomplish the same things. These entries are cross-referenced to
each other, so if you have a problem getting your PHP 3-era
configuration options to work, check here to see whether the names
have changed.
</para>
<itemizedlist>
<listitem>
<para>
<link linkend="install.configure.databases">Database</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.ecommerce">Ecommerce</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.graphics">Graphics</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.misc">Miscellaneous</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.networking">Networking</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.php">PHP Behaviour</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.servers">Server</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.text">Text and language</link>
</para>
</listitem>
<listitem>
<para>
<link linkend="install.configure.xml">XML</link>
</para>
</listitem>
</itemizedlist>
<sect2 id="install.configure.databases">
<title>Database</title>
<variablelist>
<varlistentry id="install.configure.with-adabas">
<term>
<parameter>--with-adabas[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Adabas D support. DIR is the Adabas base
install directory, defaults to /usr/local.
</para>
<para>
<ulink url="&url.adabas;">Adabas home page</ulink>
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-dba">
<term>
<parameter>--enable-dba=shared</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build DBA as a shared module
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-dbase">
<term>
<parameter>--enable-dbase</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.with-dbase">--with-dbase</link>
instead.
</para>
<para>
PHP 4: Enable the bundled dbase library. No external libraries
are required.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-dbase">
<term>
<parameter>--with-dbase</parameter>
</term>
<listitem>
<para>
PHP 3: Include the bundled dbase library. No external
libraries are required.
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.enable-dbase">--enable-dbase</link>
instead.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-db2">
<term>
<parameter>--with-db2[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Berkeley DB2 support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-db3">
<term>
<parameter>--with-db3[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Berkeley DB3 support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-dbm">
<term>
<parameter>--with-dbm[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include DBM support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-dbmaker">
<term>
<parameter>--with-dbmaker[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include DBMaker support. DIR is the DBMaker base install
directory, defaults to where the latest version of DBMaker is installed
(such as /home/dbmaker/3.6).
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-empress">
<term>
<parameter>--with-empress[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Empress support. DIR is the Empress base install
directory, defaults to $EMPRESSPATH
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-filepro">
<term>
<parameter>--enable-filepro</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.with-filepro">--with-filepro</link>
instead.
</para>
<para>
PHP 4: Enable the bundled read-only filePro support. No
external libraries are required.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-filepro">
<term>
<parameter>--with-filepro</parameter>
</term>
<listitem>
<para>
PHP 3: Include the bundled read-only filePro support. No
external libraries are required.
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.enable-filepro">--enable-filepro</link>
instead.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-gdbm">
<term>
<parameter>--with-gdbm[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include GDBM support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-hyperwave">
<term>
<parameter>--with-hyperwave</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Hyperwave support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ibm-db2">
<term>
<parameter>--with-ibm-db2[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include IBM DB2 support. DIR is the DB2 base
install directory, defaults to
<filename>/home/db2inst1/sqllib</filename>.
</para>
<para>
<ulink url="&url.ibmdb2;">IBM DB2 home page</ulink>
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-informix">
<term>
<parameter>--with-informix[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Informix support. DIR is the Informix base install
directory, defaults to nothing.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ingres">
<term>
<parameter>--with-ingres[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Ingres II support. DIR is the Ingres base directory
(default /II/ingres)
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-interbase">
<term>
<parameter>--with-interbase[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include InterBase support. DIR is the InterBase base
install directory, which defaults to <filename>/usr/interbase</filename>.
</para>
<simpara>
<link linkend="ref.ibase">Interbase functions</link>
</simpara>
<simpara>
<ulink url="&url.ibase;">Interbase home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ldap">
<term>
<parameter>--with-ldap[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include LDAP support. DIR is the LDAP base install
directory. Defaults to <filename>/usr</filename> and
<filename>/usr/local</filename>
</para>
<para>
PHP 4: Include LDAP support. DIR is the LDAP base install directory.
</para>
<simpara>
This provides <acronym>LDAP</acronym> (Lightweight Directory Access
Protocol support). The parameter is the LDAP base install
directory, defaults to <filename
class="directory">/usr/local/ldap</filename>.
</simpara>
<simpara>
More information about LDAP can be found in <ulink
url="&url.rfc;rfc1777.html">RFC1777</ulink> and
<ulink
url="&url.rfc;rfc1778.html">RFC1778</ulink>.
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-msql">
<term>
<parameter>--with-msql[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enables mSQL support. The parameter to this
option is the mSQL install directory and defaults to <filename
class="directory">/usr/local/Hughes</filename>. This is the
default directory of the mSQL 2.0 distribution.
<command>configure</command> automatically detects which mSQL
version you are running and PHP supports both 1.0 and 2.0, but
if you compile PHP with mSQL 1.0, you can only access mSQL 1.0
databases, and vice-versa.
</para>
<simpara>
See also <link linkend="ini.sect.msql">mSQL
Configuration</link> Directives in the <link
linkend="configuration.file">configuration file</link>.
</simpara>
<simpara>
<ulink url="&url.msql;">mSQL home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mysql">
<term>
<parameter>--with-mysql[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include MySQL support. DIR is the MySQL base install directory,
defaults to searching through a number of common places for the MySQL
files.
</para>
<para>
PHP 4: Include MySQL support. DIR is the MySQL base directory. If
unspecified, the bundled MySQL library will be used. This
option is turned on by default.
</para>
<para>
See also <link linkend="ini.sect.mysql">MySQL
Configuration</link> Directives in the <link
linkend="configuration.file">configuration file</link>.
</para>
<para>
<ulink url="&url.mysql;">MySQL home page</ulink>
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ndbm">
<term>
<parameter>--with-ndbm[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include NDBM support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ovrimos">
<term>
<parameter>--with-ovrimos</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Ovrimos support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-oci8">
<term>
<parameter>--with-oci8[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Oracle-oci8 support. Default DIR is ORACLE_HOME.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-oracle">
<term>
<parameter>--with-oracle[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include Oracle database support. DIR is Oracle's home directory,
defaults to $ORACLE_HOME.
</para>
<para>
PHP 4: Include Oracle-oci7 support. Default DIR is ORACLE_HOME.
</para>
<simpara>
Includes Oracle support. Has been tested and should be
working at least with Oracle versions 7.0 through 7.3. The
parameter is the <envar>ORACLE_HOME</envar> directory. You do
not have to specify this parameter if your Oracle environment
has been set up.
</simpara>
<simpara>
<ulink url="&url.oracle;">Oracle home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-pgsql">
<term>
<parameter>--with-pgsql[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include PostgresSQL support. DIR is the PostgresSQL base
install directory, which defaults to
<filename>/usr/local/pgsql</filename>.
</para>
<para>
PHP 4: Include PostgreSQL support. DIR is the PostgreSQL base
install directory, which defaults to
<filename>/usr/local/pgsql</filename>. Set DIR to shared to
build as a dl, or shared,DIR to build as a dl and still specify
DIR.
</para>
<simpara>
See also <link linkend="ini.sect.pgsql">Postgres
Configuration</link> Directives in the <link
linkend="configuration.file">configuration file</link>.
</simpara>
<simpara>
<ulink url="&url.pgsql;">PostgreSQL home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-solid">
<term>
<parameter>--with-solid[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Solid support. DIR is the Solid base install
directory, defaults to /usr/local/solid
</para>
<simpara>
<ulink url="&url.solid;">Solid home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-sybase-ct">
<term>
<parameter>--with-sybase-ct[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Sybase-CT support. DIR is the Sybase home
directory, defaults to /home/sybase.
</para>
<simpara>
See also <link linkend="ini.sect.sybct">Sybase-CT
Configuration</link> Directives in the <link
linkend="configuration.file">configuration
file</link>.
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-sybase">
<term>
<parameter>--with-sybase[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Sybase-DB support. DIR is the Sybase home
directory, which defaults to <filename>/home/sybase</filename>.
</para>
<simpara>
See also <link linkend="ini.sect.sybase">Sybase
Configuration</link> Directives in the <link
linkend="configuration.file">configuration file</link>.
</simpara>
<simpara>
<ulink url="&url.sybase;">Sybase home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-openlink">
<term>
<parameter>--with-openlink[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include OpenLink ODBC support. DIR is the OpenLink base
install directory, defaults to /usr/local/openlink.
</para>
<simpara>
<ulink url="&url.openlink;">OpenLink Software's home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-iodbc">
<term>
<parameter>--with-iodbc[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include iODBC support. DIR is the iODBC base install
directory, defaults to <filename>/usr/local</filename>.
</para>
<para>
This feature was first developed for iODBC Driver Manager, a
freely redistributable ODBC driver manager which runs under
many flavors of UNIX.
</para>
<simpara>
<ulink url="&url.freeodbc;">FreeODBC home page</ulink>
or <ulink url="&url.iodbc;">iODBC home page</ulink>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-custom-odbc">
<term>
<parameter>--with-custom-odbc[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Includes support for an arbitrary custom ODBC
library. The parameter is the base directory and defaults to
<filename class="directory">/usr/local</filename>.
</para>
<simpara>
This option implies that you have defined CUSTOM_ODBC_LIBS
when you run the configure script. You also must have a valid
odbc.h header somewhere in your include path. If you don't
have one, create it and include your specific header from
there. Your header may also require some extra definitions,
particularly when it is multiplatform. Define them in
CFLAGS.
</simpara>
<simpara>
For example, you can use Sybase SQL Anywhere on QNX as
following:
<literal>
CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib
-lodbc" ./configure --with-custom-odbc=/usr/lib/sqlany50
</literal>
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-unified-odbc">
<term>
<parameter>--disable-unified-odbc</parameter>
</term>
<listitem>
<para>
PHP 3: Disable unified ODBC support. Only applicable if iODBC, Adabas,
Solid, Velocis or a custom ODBC interface is enabled.
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
<simpara>
The Unified ODBC module, which is a common interface to all
the databases with ODBC-based interfaces, such as Solid, IBM
DB2 and Adabas D. It also works for normal ODBC libraries.
Has been tested with iODBC, Solid, Adabas D, IBM DB2 and
Sybase SQL Anywhere. Requires that one (and only one) of these
extensions or the Velocis extension is enabled, or a custom ODBC
library specified. This option is only applicable if one of
the following options is used: <link
linkend="install.configure.with-iodbc">--with-iodbc</link>,
<link
linkend="install.configure.with-solid">--with-solid</link>,
<link
linkend="install.configure.with-ibm-db2">--with-ibm-db2</link>,
<link
linkend="install.configure.with-adabas">--with-adabas</link>,
<link
linkend="install.configure.with-velocis">--with-velocis</link>,
or <link
linkend="install.configure.with-custom-odbc">--with-custom-odbc</link>.
</simpara>
<simpara>
See also <link linkend="ini.sect.uodbc">Unified ODBC
Configuration</link> Directives in the <link
linkend="configuration.file">configuration
file</link>.
</simpara>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-unixODBC">
<term>
<parameter>--with-unixODBC[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include unixODBC support. DIR is the unixODBC base install
directory, defaults to /usr/local.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-velocis">
<term>
<parameter>--with-velocis[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include Velocis support. DIR is the Velocis base install
directory, defaults to /usr/local/velocis.
</para>
<simpara>
<ulink url="&url.velocis;">Velocis home page</ulink>
</simpara>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.ecommerce">
<title>Ecommerce</title>
<variablelist>
<varlistentry id="install.configure.with-ccvs">
<term>
<parameter>--with-ccvs[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Compile CCVS support into PHP 4. Please specify your CCVS base
install directory as DIR.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mck">
<term>
<parameter>--with-mck[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include Cybercash MCK support. DIR is the cybercash mck
build directory, which defaults to
<filename>/usr/src/mck-3.2.0.3-linux</filename>. For help, look
in <filename>extra/cyberlib</filename>.
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.with-cybercash">--with-cybercash</link>
instead.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-cybercash">
<term>
<parameter>--with-cybercash[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.with-mck">--with-mck</link>
instead.
</para>
<para>
PHP 4: Include CyberCash support. DIR is the CyberCash MCK install
directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-pfpro">
<term>
<parameter>--with-pfpro[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Verisign Payflow Pro support
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.graphics">
<title>Graphics</title>
<variablelist>
<varlistentry id="install.configure.enable-freetype-4bit-antialias-hack">
<term>
<parameter>--enable-freetype-4bit-antialias-hack</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include support for FreeType2 (experimental).
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-gd">
<term>
<parameter>--with-gd[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include GD support (DIR is GD's install dir).
</para>
<para>
PHP 4: Include GD support (DIR is GD's install dir). Set DIR to shared
to build as a dl, or shared,DIR to build as a dl and still specify DIR.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.without-gd">
<term>
<parameter>--without-gd</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Disable GD support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-imagick">
<term>
<parameter>--with-imagick[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include ImageMagick support. DIR is the install
directory, and if left out, PHP will try to find it on its
own. [experimental]
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-jpeg-dir">
<term>
<parameter>--with-jpeg-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: jpeg dir for pdflib 2.0
</para>
<para>
PHP 4: jpeg dir for pdflib 3.x
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-png-dir">
<term>
<parameter>--with-png-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: png dir for pdflib 3.x
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-t1lib">
<term>
<parameter>--enable-t1lib</parameter>
</term>
<listitem>
<para>
PHP 3: Enable t1lib support.
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.with-t1lib">--with-t1lib</link>
instead.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-t1lib">
<term>
<parameter>--with-t1lib[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.enable-t1lib">--enable-t1lib</link>
instead.
</para>
<para>
PHP 4: Include T1lib support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-tiff-dir">
<term>
<parameter>--with-tiff-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: tiff dir for pdflib 2.0
</para>
<para>
PHP 4: tiff dir for pdflib 3.x
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ttf">
<term>
<parameter>--with-ttf[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include FreeType support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-xpm-dir">
<term>
<parameter>--with-xpm-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: xpm dir for gd-1.8+
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.misc">
<title>Miscellaneous</title>
<para>
These are being classified over time, where appropriate.
</para>
<variablelist>
<varlistentry id="install.configure.gmp">
<term>
<parameter>--with-gmp</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4 : Include GMP support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-bcmath">
<term>
<parameter>--disable-bcmath</parameter>
</term>
<listitem>
<para>
PHP 3: Compile without BC arbitrary precision math
functions. These functions allow you to operate with numbers
outside of the ranges allowed by regular integers and floats;
see <link linkend="ref.bc">BCMath Arbitrary Precision
Mathematics Functions</link> for more information.
</para>
<para>
PHP 4: Option not available; bcmath is not compiled in by
default. Use <link
linkend="install.configure.enable-bcmath">--enable-bcmath</link>
to compile it in.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-display-source">
<term>
<parameter>--disable-display-source</parameter>
</term>
<listitem>
<para>
PHP 3: Compile without displaying source support
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-libtool-lock">
<term>
<parameter>--disable-libtool-lock</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: avoid locking (might break parallel builds)
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-pear">
<term>
<parameter>--disable-pear</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Do not install PEAR
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-pic">
<term>
<parameter>--disable-pic</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Disable PIC for shared objects
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-posix">
<term>
<parameter>--disable-posix</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3; use <link
linkend="install.configure.without-posix">--without-posix</link>
instead.
</para>
<para>
PHP 4: Disable POSIX-like functions
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-rpath">
<term>
<parameter>--disable-rpath</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Disable passing additional runtime library search paths
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-session">
<term>
<parameter>--disable-session</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Disable session support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-bcmath">
<term>
<parameter>--enable-bcmath</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3; bcmath is compiled in
by default. Use <link
linkend="install.configure.disable-bcmath">--disable-bcmath</link>
to disable it.
</para>
<para>
PHP 4: Compile with bc style precision math functions. Read
README-BCMATH for instructions on how to get this module
installed. These functions allow you to operate with numbers
outside of the ranges allowed by regular integers and floats;
see <link linkend="ref.bc">BCMath Arbitrary Precision
Mathematics Functions</link> for more information.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-c9x-inline">
<term>
<parameter>--enable-c9x-inline</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable C9x-inline semantics
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-calendar">
<term>
<parameter>--enable-calendar</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable support for calendar conversion
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-debug">
<term>
<parameter>--enable-debug</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Compile with debugging symbols.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-debugger">
<term>
<parameter>--enable-debugger</parameter>
</term>
<listitem>
<para>
PHP 3: Compile with remote debugging functions
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-discard-path">
<term>
<parameter>--enable-discard-path</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: If this is enabled, the PHP CGI binary can safely be
placed outside of the web tree and people will not be able to circumvent
.htaccess security.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-dmalloc">
<term>
<parameter>--enable-dmalloc</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable dmalloc
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-exif">
<term>
<parameter>--enable-exif</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable exif support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-experimental-zts">
<term>
<parameter>--enable-experimental-zts</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: This will most likely break your build
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-fast-install">
<term>
<parameter>--enable-fast-install[=PKGS]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: optimize for fast installation [default=yes]
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-force-cgi-redirect">
<term>
<parameter>--enable-force-cgi-redirect</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable the security check for internal server redirects.
You should use this if you are running the CGI version with Apache.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-inline-optimization">
<term>
<parameter>--enable-inline-optimization</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: If you have much memory and are using gcc, you might try this.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-libgcc">
<term>
<parameter>--enable-libgcc</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable explicitly linking against libgcc
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-maintainer-mode">
<term>
<parameter>--enable-maintainer-mode</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: enable make rules and dependencies not useful (and
sometimes confusing) to the casual installer
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-memory-limit">
<term>
<parameter>--enable-memory-limit</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Compile with memory limit support. [default=no]
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-safe-mode">
<term>
<parameter>--enable-safe-mode</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable safe mode by default.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-satellite">
<term>
<parameter>--enable-satellite</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable CORBA support via Satellite (Requires ORBit)
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-shared">
<term>
<parameter>--enable-shared[=PKGS]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: build shared libraries [default=yes]
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-sigchild">
<term>
<parameter>--enable-sigchild</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable PHP's own SIGCHLD handler.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-static">
<term>
<parameter>--enable-static[=PKGS]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: build static libraries [default=yes]
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-sysvsem">
<term>
<parameter>--enable-sysvsem</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable System V semaphore support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-sysvshm">
<term>
<parameter>--enable-sysvshm</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable the System V shared memory support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-trans-sid">
<term>
<parameter>--enable-trans-sid</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable transparent session id propagation
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-cdb">
<term>
<parameter>--with-cdb[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include CDB support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-config-file-path">
<term>
<parameter>--with-config-file-path=PATH</parameter>
</term>
<listitem>
<para>
PHP 3: Sets the path in which to look for php3.ini. Defaults to
<filename>/usr/local/lib</filename>
</para>
<para>
PHP 4: Sets the path in which to look for <filename>php.ini</filename>.
Defaults to <filename>/usr/local/lib</filename>
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-cpdflib">
<term>
<parameter>--with-cpdflib[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include ClibPDF support. DIR is the ClibPDF install directory,
defaults to /usr/local.
</para>
<para>
PHP 4: Include cpdflib support (requires cpdflib >= 2). DIR is the
cpdfllib install directory, defaults to /usr.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-esoob">
<term>
<parameter>--with-esoob[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Easysoft OOB support. DIR is the OOB base install
directory, defaults to /usr/local/easysoft/oob/client.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-exec-dir">
<term>
<parameter>--with-exec-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Only allow executables in DIR when in safe mode defaults
to /usr/local/php/bin
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-fdftk">
<term>
<parameter>--with-fdftk[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include fdftk support. DIR is the fdftk install directory,
defaults to /usr/local.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-gnu-ld">
<term>
<parameter>--with-gnu-ld</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: assume the C compiler uses GNU ld [default=no]
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-icap">
<term>
<parameter>--with-icap[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include ICAP support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-imap">
<term>
<parameter>--with-imap[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include IMAP support. DIR is the IMAP include and
c-client.a directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-imsp">
<term>
<parameter>--with-imsp[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include IMSP support (DIR is IMSP's include dir and libimsp.a
dir).
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-java">
<term>
<parameter>--with-java[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Java support. DIR is the base install directory for the
JDK. This extension can only be built as a shared dl.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-kerberos">
<term>
<parameter>--with-kerberos[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Kerberos support in IMAP.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mcal">
<term>
<parameter>--with-mcal[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include MCAL support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mcrypt">
<term>
<parameter>--with-mcrypt[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include mcrypt support. DIR is the mcrypt install
directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mhash">
<term>
<parameter>--with-mhash[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include mhash support. DIR is the mhash install directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mm">
<term>
<parameter>--with-mm[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include mm support for session storage
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mod_charset">
<term>
<parameter>--with-mod_charset</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable transfer tables for mod_charset (Rus Apache).
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-pdflib">
<term>
<parameter>--with-pdflib[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include pdflib support (tested with 0.6 and 2.0). DIR is
the pdflib install directory, which defaults to
<filename>/usr/local</filename>.
</para>
<para>
PHP 4: Include pdflib 3.x support. DIR is the pdflib install
directory, which defaults to <filename>/usr/local</filename>.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-shared-pdflib">
<term>
<parameter>--enable-shared-pdflib</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Activate pdflib as shared librairy.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-readline">
<term>
<parameter>--with-readline[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include readline support. DIR is the readline install directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-regex">
<term>
<parameter>--with-regex=TYPE</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: regex library type: system, apache, php
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-servlet">
<term>
<parameter>--with-servlet[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include servlet support. DIR is the base install
directory for the JSDK. This SAPI requires that the Java
extension be built as a shared dl.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ming">
<term>
<parameter>--with-ming</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Flash 4 support, with Ming
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-swf">
<term>
<parameter>--with-swf[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include swf support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-system-regex">
<term>
<parameter>--with-system-regex</parameter>
</term>
<listitem>
<para>
PHP 3: Do not use the bundled regex library
</para>
<para>
PHP 4: (deprecated) Use system regex library
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-tsrm-pth">
<term>
<parameter>--with-tsrm-pth[=pth-config]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Use GNU Pth.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-tsrm-pthreads">
<term>
<parameter>--with-tsrm-pthreads</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Use POSIX threads (default)
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-x">
<term>
<parameter>--with-x</parameter>
</term>
<listitem>
<para>
PHP 3: use the X Window System
</para>
<para>
PHP 4: Option not available in PHP 4
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-bzip2-dir">
<term>
<parameter>--with-bz2[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include support bzip2. DIR
is the bzip2 install dir.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-zlib-dir">
<term>
<parameter>--with-zlib-dir[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: zlib dir for pdflib 2.0 or include zlib support
</para>
<para>
PHP 4: zlib dir for pdflib 3.x or include zlib support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-zlib">
<term>
<parameter>--with-zlib[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include zlib support (requires zlib >= 1.0.9). DIR is
the zlib install directory, defaults to /usr.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.without-pcre-regex">
<term>
<parameter>--without-pcre-regex</parameter>
</term>
<listitem>
<para>
PHP 3: Don't include Perl Compatible Regular Expressions support
</para>
<para>
PHP 4: Do not include Perl Compatible Regular Expressions support. Use
--with-pcre-regex=DIR to specify DIR where PCRE's include and library
files are located, if not using bundled library.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.without-posix">
<term>
<parameter>--without-posix</parameter>
</term>
<listitem>
<para>
PHP 3: Don't include POSIX functions
</para>
<para>
PHP 4: Option not available in PHP 4; use <link
linkend="install.configure.disable-posix">--disable-posix</link>
instead.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.networking">
<title>Networking</title>
<variablelist>
<varlistentry id="install.configure.with-curl">
<term>
<parameter>--with-curl[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include CURL support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-ftp">
<term>
<parameter>--enable-ftp</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.with-ftp">--with-ftp</link>
instead.
</para>
<para>
PHP 4: Enable FTP support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-ftp">
<term>
<parameter>--with-ftp</parameter>
</term>
<listitem>
<para>
PHP 3: Include FTP support.
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.enable-ftp">--enable-ftp</link>
instead
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-url-fopen-wrapper">
<term>
<parameter>--disable-url-fopen-wrapper</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Disable the URL-aware fopen wrapper that allows accessing
files via http or ftp.
</para>
<warning>
<para>
This switch is only available for PHP versions up to 4.0.3, newer
versions provide an INI parameter called
<parameter>allow_url_fopen</parameter> instead of forcing you to
decide upon this feature at compile time.
</para>
</warning>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mod-dav">
<term>
<parameter>--with-mod-dav=DIR</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include DAV support through Apache's mod_dav, DIR is
mod_dav's installation directory (Apache module version only!)
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-openssl">
<term>
<parameter>--with-openssl[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include OpenSSL support in SNMP.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-snmp">
<term>
<parameter>--with-snmp[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include SNMP support. DIR is the SNMP base install
directory, defaults to searching through a number of common locations
for the snmp install. Set DIR to shared to build as a dl, or shared,DIR
to build as a dl and still specify DIR.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-ucd-snmp-hack">
<term>
<parameter>--enable-ucd-snmp-hack</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable UCD SNMP hack
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-sockets">
<term>
<parameter>--enable-sockets</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable sockets support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-yaz">
<term>
<parameter>--with-yaz[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include YAZ support (ANSI/NISO Z39.50). DIR is the YAZ bin
install directory
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-yp">
<term>
<parameter>--enable-yp</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available; use <link
linkend="install.configure.with-yp">--with-yp</link>
instead.
</para>
<para>
PHP 4: Include YP support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-yp">
<term>
<parameter>--with-yp</parameter>
</term>
<listitem>
<para>
PHP 3: Include YP support
</para>
<para>
PHP 4: Option not available; use <link
linkend="install.configure.enable-yp">--enable-yp</link>
instead.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-mnogosearch">
<term>
<parameter>--with-mnogosearch</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include mnoGoSearch support.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.php">
<title>PHP Behaviour</title>
<variablelist>
<varlistentry id="install.configure.enable-magic-quotes">
<term>
<parameter>--enable-magic-quotes</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Enable magic quotes by default.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-short-tags">
<term>
<parameter>--disable-short-tags</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Disable the short-form <? start tag by default.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-track-vars">
<term>
<parameter>--enable-track-vars</parameter>
</term>
<listitem>
<para>
PHP 3: Enable GET/POST/Cookie track variables by default.
</para>
<para>
PHP 4: Option not available in PHP 4; as of PHP 4.0.2,
track_vars is always on.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.servers">
<title>Server</title>
<variablelist>
<varlistentry id="install.configure.with-aolserver-src">
<term>
<parameter>--with-aolserver-src=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Specify path to the source distribution of AOLserver
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-aolserver">
<term>
<parameter>--with-aolserver=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Specify path to the installed AOLserver
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-apache">
<term>
<parameter>--with-apache[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Build Apache module. DIR is the top-level Apache build
directory, defaults to /usr/local/etc/httpd.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-apxs">
<term>
<parameter>--with-apxs[=FILE]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Build shared Apache module. FILE is the optional pathname
to the Apache apxs tool; defaults to apxs.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-versioning">
<term>
<parameter>--enable-versioning</parameter>
</term>
<listitem>
<para>
PHP 3: Take advantage of versioning and scoping Provided by Solaris 2.x
and Linux
</para>
<para>
PHP 4: Export only required symbols. See INSTALL for more information
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-caudium">
<term>
<parameter>--with-caudium[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build PHP as a Pike module for use with the Caudium
webserver. DIR is the Caudium base directory. If no directory
is specified $prefix/caudium/server is used. The prefix is
controlled by the --prefix option and is /usr/local per
default.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-fhttpd">
<term>
<parameter>--with-fhttpd[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Build fhttpd module. DIR is the fhttpd sources directory,
defaults to /usr/local/src/fhttpd.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-nsapi">
<term>
<parameter>--with-nsapi=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Specify path to the installed Netscape
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-phttpd">
<term>
<parameter>--with-phttpd=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4:
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-pi3web">
<term>
<parameter>--with-pi3web=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build PHP as a module for use with Pi3Web.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-roxen">
<term>
<parameter>--with-roxen=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build PHP as a Pike module. DIR is the base Roxen directory,
normally /usr/local/roxen/server.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-roxen-zts">
<term>
<parameter>--enable-roxen-zts</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build the Roxen module using Zend Thread Safety.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-thttpd">
<term>
<parameter>--with-thttpd=SRCDIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4:
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-zeus">
<term>
<parameter>--with-zeus=DIR</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Build PHP as an ISAPI module for use with Zeus.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.text">
<title>Text and language</title>
<variablelist>
<varlistentry id="install.configure.with-aspell">
<term>
<parameter>--with-aspell[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include ASPELL support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-gettext">
<term>
<parameter>--with-gettext[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4: Include GNU gettext support. DIR is the gettext install
directory, defaults to /usr/local
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-pspell">
<term>
<parameter>--with-pspell[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include PSPELL support.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-recode">
<term>
<parameter>--with-recode[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Include GNU recode support.
</para>
<para>
PHP 4: Include recode support. DIR is the recode install directory.
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-shmop">
<term>
<parameter>--enable-shmop</parameter>
</term>
<listitem>
<para>
PHP 3, PHP 4 : Activate shmop support.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="install.configure.xml">
<title>XML</title>
<variablelist>
<varlistentry id="install.configure.with-dom">
<term>
<parameter>--with-dom[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include DOM support (requires libxml >= 2.0). DIR is the
libxml install directory, defaults to <filename>/usr</filename>
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-sablot-errors-descriptive">
<term>
<parameter>--enable-sablot-errors-descriptive</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable Descriptive errors
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-sablot">
<term>
<parameter>--with-sablot[=DIR]</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Include Sablotron support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.enable-wddx">
<term>
<parameter>--enable-wddx</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3
</para>
<para>
PHP 4: Enable WDDX support
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.disable-xml">
<term>
<parameter>--disable-xml</parameter>
</term>
<listitem>
<para>
PHP 3: Option not available in PHP 3; XML functionality is
not built in by default. Use <link
linkend="install.configure.with-xml">--with-xml</link>
to turn it on.
</para>
<para>
PHP 4: Disable XML support using bundled expat lib
</para>
</listitem>
</varlistentry>
<varlistentry id="install.configure.with-xml">
<term>
<parameter>--with-xml</parameter>
</term>
<listitem>
<para>
PHP 3: Include XML support
</para>
<para>
PHP 4: Option not available; XML support is built in by
default. Use <link
linkend="install.configure.disable-xml">--disable-xml</link> to
turn it off.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>
<sect1 id="install-windows">
<title>Installation on Windows 9x/Me/NT/2000 systems</title>
<para>
There are two main ways to install PHP for Windows: either
<link linkend="install.windows.manual">manually</link>
or by using the <link linkend="install.windows.installer">InstallShield</link>
installer.
</para>
<para>
If you have Microsoft Visual Studio, you can also
<link linkend="install.windows.build">build</link>
PHP from the original source code.
</para>
<para>
Once you have PHP installed on your Windows system, you may also
want to <link linkend="install.windows.extensions">load various extensions</link>
for added functionality.
</para>
<sect2 id="install.windows.installer">
<title>Windows InstallShield</title>
<para>
The Windows PHP installer available from the downloads page at
<ulink url="&url.php;">&url.php;</ulink>, this installs the CGI version
of PHP and, for IIS, PWS, and Xitami, configures the web server as
well.
</para>
<simpara>
Install your selected <acronym>HTTP</acronym> server on your system
and make sure that it works.
</simpara>
<simpara>
Run the executable installer and follow the instructions provided by
the installation wizard. Two types of installation are supported -
standard, which provides sensible defaults for all the settings it
can, and advanced, which asks questions as it goes along.
</simpara>
<simpara>
The installation wizard gathers enough information to set up the
<filename>php.ini</filename> file and configure the web server to
use PHP. For IIS and also PWS on NT Workstation, a list of all the
nodes on the server with script map settings is displayed, and you
can choose those nodes to which you wish to add the PHP script
mappings.
</simpara>
<simpara>
Once the installation has completed the installer will inform you
if you need to restart your system, restart the server, or just
start using PHP.
</simpara>
</sect2>
<sect2 id="install.windows.manual">
<title>General Installation Steps</title>
<simpara>
This install guide will help you manually install and configure
PHP on your Windows 9x/Me/NT/2000 webservers. This guide was compiled by
&link.bob;. The original version can be found at <ulink
url="&url.win32install;">&url.win32install;</ulink>.
</simpara>
<para>
This guide provides manual installation support for:
<itemizedlist>
<listitem>
<para>
Personal Web Server 3 and 4 or newer
</para>
</listitem>
<listitem>
<para>
Internet Information Server 3 and 4 or newer
</para>
</listitem>
<listitem>
<para>
Apache 1.3.x
</para>
</listitem>
<listitem>
<para>
OmniHTTPd 2.0b1 and up
</para>
</listitem>
<listitem>
<para>
Oreilly Website Pro
</para>
</listitem>
<listitem>
<para>
Xitami
</para>
</listitem>
</itemizedlist>
</para>
<para>
PHP 4 for Windows comes in two flavours - a CGI executable (php.exe),
and several SAPI modules (for exapmle php4isapi.dll). The latter form
is new to PHP 4, and provides significantly improved performance and
some new functionality. However, please note that the SAPI modules
are <emphasis>NOT</emphasis> yet considered to be production quality.
The reason for this is that the PHP SAPI modules are using the
thread-safe version of the PHP code, which is new to PHP 4, and has
not yet been tested and pounded enough to be considered completely
stable, and there are actually a few known bugs. On the other hand,
some people have reported very good results with the SAPI modules,
even though we're not aware of anyone actually running it on a
production site. In short - your mileage may vary; If you need
absolute stability, trade the performance of the SAPI modules
with the stability of the CGI executable.
</para>
<para>
If you choose one of the SAPI modules and use Windows 95, be sure
to download the DCOM update from the <ulink
url="http://download.microsoft.com/msdownload/dcom/95/x86/en/dcom95.exe">Microsoft
DCOM pages</ulink>. For the ISAPI module, an ISAPI 4.0 compliant Web server
is required (tested on IIS 4.0, PWS 4.0 and IIS 5.0). IIS 3.0 is
<emphasis>NOT</emphasis> supported; You should download and
install the Windows NT 4.0 Option Pack with IIS 4.0 if you
want native PHP support.
</para>
<para>
The following steps should be performed on all installations
before the server specific instructions.
<itemizedlist>
<listitem>
<para>
Extract the distribution file to a directory of your choice.
"C:\PHP\" is a good start.
</para>
</listitem>
<listitem>
<para>
Copy the file, 'php.ini-dist' to your
'%WINDOWS%' directory on Windows 95/98 or to your
'%SYSTEMROOT%' directory under Windows NT or Windows
2000 and rename it to 'php.ini'. Your
'%WINDOWS%' or '%SYSTEMROOT%' directory is
typically:
<simplelist>
<member>c:\windows for Windows 95/98</member>
<member>c:\winnt or c:\winnt40 for NT/2000 servers</member>
</simplelist>
</para>
</listitem>
<listitem>
<para>
Edit your 'php.ini' file:
<itemizedlist>
<listitem>
<simpara>
You will need to change the 'extension_dir' setting to
point to your php-install-dir, or where you have placed
your 'php_*.dll' files. ex: c:\php
</simpara>
</listitem>
<listitem>
<simpara>
If you are using OmniHTTPd, do not follow the next step.
Set the 'doc_root' to point to your webservers
document_root. ex: c:\apache\htdocs or c:\webroot
</simpara>
</listitem>
<listitem>
<simpara>
Choose which extensions you would like to load when PHP
starts. You can uncomment the: 'extension=php_*.dll' lines
in <filename>php.ini</filename> to load these extensions.
Some extensions require you to have additional libraries
installed on your system for the module to work correctly.
The PHP <ulink url="&url.php.faq;">FAQ</ulink> has more
information on where to get supporting libraries. You
can also load a module dynamically in your script
using <function>dl</function>. See the section about
<link linkend="install.windows.extensions">Windows
extensions</link>.
</simpara>
</listitem>
<listitem>
<simpara>
On PWS and IIS, you can set the <filename>browscap.ini</filename>
to point to: 'c:\windows\system\inetsrv\browscap.ini' on
Windows 9x/Me and 'c:\winnt\system32\inetsrv\browscap.ini'
on NT/2000 Server. Additional information on using the
browscap functionality in PHP can be found at this <ulink
url="&url.browscap;">mirror</ulink>, select the "source"
button to see it in action.
</simpara>
</listitem>
</itemizedlist>
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
<sect2 id="install.windows.build">
<title>Building from source</title>
<para>
Before getting started, it is worthwhile answering the question:
"Why is building on Windows so hard?" Two reasons come to mind:
</para>
<orderedlist>
<listitem><simpara>
Windows does not (yet) enjoy a large community of developers
who are willing to freely share their source. As a direct
result, the necessary investment in infrastructure required
to support such development hasn't been made. By and large,
what is available has been made possible by the porting of
necessary utilities from Unix. Don't be surprised if some of
this heritage shows through from time to time.
</simpara></listitem>
<listitem><simpara>
Pretty much all of the instructions that follow are of the
"set and forget" variety. So sit back and try follow the
instructions below as faithfully as you can.
</simpara></listitem>
</orderedlist>
<sect3 id="install.windows.build.prepare">
<title>Preparations</title>
<para>
Before you get started, you have a lot to download....
</para>
<itemizedlist>
<listitem><simpara>
For starters, get the Cygwin toolkit from the closest <ulink
url="http://sources.redhat.com/cygwin/download.html">cygwin</ulink>
mirror site. This will provide you most of the popular GNU
utilities used by the build process.
</simpara></listitem>
<listitem><simpara>
Download the rest of the build tools you will need from the PHP
site at <ulink url="http://www.php.net/extra/win32build.zip"
>http://www.php.net/extra/win32build.zip</ulink>.
</simpara></listitem>
<listitem><simpara>
Get the source code for the DNS name resolver used by PHP
at <ulink url="http://www.php.net/extra/bindlib_w32.zip"
>http://www.php.net/extra/bindlib_w32.zip</ulink>. This
is a replacement for the <filename>resolv.lib</filename>
library included in <filename>win32build.zip</filename>.
</simpara></listitem>
<listitem><simpara>
If you don't already have an unzip utility, you will
need one. A free version is available from <ulink
url="http://www.cdrom.com/pub/infozip/UnZip.html">InfoZip</ulink>.
</simpara></listitem>
</itemizedlist>
<simpara>
Finally, you are going to need the source to PHP 4 itself.
You can get the latest development version using <ulink
url="http://www.php.net/anoncvs.php">anonymous CVS</ulink>. If you get
a <ulink url="http://snaps.php.net/">snapshot</ulink> or a <ulink
url="http://www.php.net/downloads.php">source</ulink> tarball, you
not only will have to untar and ungzip it, but you will have to
convert the bare linefeeds to crlf's in the <filename>*.dsp</filename>
and <filename>*.dsw</filename> files before Microsoft Visual C++
will have anything to do with them.
</simpara>
<note>
<simpara>
Place the <filename>Zend</filename> and
<filename>TSRM</filename> directories inside the
<filename>php4</filename> directory in order for the projects
to be found during the build process.
</simpara>
</note>
</sect3>
<sect3 id="install.windows.build.install">
<title>Putting it all together</title>
<itemizedlist>
<listitem><simpara>
Follow the instructions for installing the unzip utility of
your choosing.
</simpara></listitem>
<listitem>
<simpara>
Execute <filename>setup.exe</filename> and follow the installation
instructions. If you choose to install to a path other than
<filename>c:\cygnus</filename>, let the build process know by setting
the Cygwin environment variable. On Windows 95/98 setting
an environment variable can be done by placing a line in
your autoexec.bat. On Windows NT, go to My Computer =>
Control Panel => System and select the environment tab.
</simpara>
<warning>
<simpara>
Make a temporary directory for Cygwin to use, otherwise many
commands (particularly bison) will fail. On Windows 95/98,
<userinput>mkdir C:\TMP</userinput>. For Windows NT,
<userinput>mkdir %SystemDrive%\tmp</userinput>.
</simpara>
</warning>
</listitem>
<listitem><simpara>
Make a directory and unzip <filename>win32build.zip</filename> into it.
</simpara></listitem>
<listitem>
<simpara>
Launch Microsoft Visual C++, and from the menu select
Tools => Options. In the dialog, select the
directories tab. Sequentially change the dropdown
to Executables, Includes, and Library files,
and ensure that <filename>cygwin\bin</filename>,
<filename>win32build\include</filename>, and
<filename>win32build\lib</filename> are in each list,
respectively. (To add an entry, select a blank line
at the end of the list and begin typing). Typical entries
will look like this:
</simpara>
<itemizedlist>
<listitem><simpara>
<filename>c:\cygnus\bin</filename>
</simpara></listitem>
<listitem><simpara>
<filename>c:\php-win32build\include</filename>
</simpara></listitem>
<listitem><simpara>
<filename>c:\php-win32build\lib</filename>
</simpara></listitem>
</itemizedlist>
<simpara>
Press OK, and exit out of Visual C++.
</simpara>
</listitem>
<listitem>
<simpara>
Make another directory and unzip <filename>bindlib_w32.zip</filename>
into it. Decide whether you want to have debug symbols available
(bindlib - Win32 Debug) or not (bindlib - Win32 Release).
Build the appropriate configuration:
</simpara>
<itemizedlist>
<listitem><simpara>
For GUI users, launch VC++, and then select File => Open
Workspace and select bindlib. Then select Build=>Set
Active Configuration and select the desired configuration.
Finally select Build=>Rebuild All.
</simpara></listitem>
<listitem>
<simpara>
For command line users, make sure that you either have
the C++ environment variables registered, or have run
<command>vcvars.bat</command>, and then execute one of the
following:
</simpara>
<itemizedlist>
<listitem>
<simpara>
<userinput>msdev bindlib.dsp /MAKE "bindlib - Win32 Debug"</userinput>
</simpara>
</listitem>
<listitem>
<simpara>
<userinput>msdev bindlib.dsp /MAKE "bindlib - Win32 Release"</userinput>
</simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem><simpara>
At this point, you should have a usable
<filename>resolv.lib</filename> in either your
<filename>Debug</filename> or <filename>Release</filename>
subdirectories. Copy this file into your
<filename>win32build\lib</filename> directory over the
file by the same name found in there.
</simpara></listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</sect3>
<sect3 id="install.windows.build.compile">
<title>Compiling</title>
<simpara>
The best way to get started is to build the standalone/CGI version.
</simpara>
<itemizedlist>
<listitem><simpara>
For GUI users, launch VC++, and then select File => Open
Workspace and select php4ts. Then select Build=>Set Active
Configuration and select the desired configuration. Finally
select Build=>Rebuild All.
</simpara></listitem>
<listitem>
<simpara>
For command line users, make sure that you either have
the C++ environment variables registered, or have run
<command>vcvars.bat</command>, and then execute one of the
following:
</simpara>
<itemizedlist>
<listitem><simpara>
<userinput>msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS"</userinput>
</simpara></listitem>
<listitem><simpara>
<userinput>msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS"</userinput>
</simpara></listitem>
<listitem><simpara>
At this point, you should have a usable
<filename>php.exe</filename> in either
your <filename>Debug_TS</filename> or
<filename>Release_TS</filename> subdirectories.
</simpara></listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<simpara>
Repeat the above steps with <filename>php4isapi.dsp</filename>
(which can be found in <filename>sapi\isapi</filename>) in
order to build the code necessary for integrating PHP with
Microsoft IIS.
</simpara>
</sect3>
</sect2>
<sect2 id="install.windows.extensions">
<title>Installation of Windows extensions</title>
<para>
After installing PHP and a webserver on Windows, you will
probably want to install some extensions for added functionality.
The following table describes some of the extensions available. As
described in the manual installation steps, you can choose which
extensions you would like to load when PHP starts by uncommenting the:
'extension=php_*.dll' lines in <filename>php.ini</filename>. Some
extensions require you to have additional libraries installed on
your system for the module to work correctly. The PHP
<ulink url="&url.php.faq;">FAQ</ulink> has more information on
where to get supporting libraries. You can also load a module
dynamically in your script using <function>dl</function>.
</para>
<para>
The DLLs for PHP extensions are prefixed with 'php_'. This
prevents confusion between PHP extensions and their supporting
libraries.
</para>
<note>
<para>
In PHP 4.0.4pl1 MySQL, ODBC, FTP, Calendar, BCMath, COM, PCRE,
Session, WDDX and XML support is <emphasis>built-in</emphasis>.
You don't need to load any additional extensions in order to
use these functions. See your distributions
<filename>README.txt</filename> or <filename>install.txt</filename>
for a list of built in modules.
</para>
</note>
<para>
<table>
<title>PHP Extensions</title>
<tgroup cols="2">
<tbody>
<row>
<entry>php_calendar.dll</entry>
<entry>Calendar conversion functions</entry>
</row>
<row>
<entry>php_crypt.dll</entry>
<entry>Crypt functions</entry>
</row>
<row>
<entry>php_dbase.dll</entry>
<entry>dBase functions</entry>
</row>
<row>
<entry>php_dbm.dll</entry>
<entry>Berkeley DB2 library</entry>
</row>
<row>
<entry>php_filepro.dll</entry>
<entry>Read-only access to Filepro databases</entry>
</row>
<row>
<entry>php_gd.dll</entry>
<entry>GD library functions for GIF manipulation</entry>
</row>
<row>
<entry>php_hyperwave.dll</entry>
<entry>HyperWave functions</entry>
</row>
<row>
<entry>php_imap4r2.dll</entry>
<entry>IMAP 4 functions</entry>
</row>
<row>
<entry>php_ldap.dll</entry>
<entry>LDAP functions</entry>
</row>
<row>
<entry>php_msql1.dll</entry>
<entry>mSQL 1 client</entry>
</row>
<row>
<entry>php_msql2.dll</entry>
<entry>mSQL 2 client</entry>
</row>
<row>
<entry>php_mssql.dll</entry>
<entry>MSSQL client (requires MSSQL DB-Libraries</entry>
</row>
<row>
<entry>php3_mysql.dll (built into PHP 4)</entry>
<entry>MySQL functions</entry>
</row>
<row>
<entry>php_nsmail.dll</entry>
<entry>Netscape mail functions</entry>
</row>
<row>
<entry>php_oci73.dll</entry>
<entry>Oracle functions</entry>
</row>
<row>
<entry>php_snmp.dll</entry>
<entry>SNMP get and walk functions (NT only!)</entry>
</row>
<row>
<entry>php_zlib.dll</entry>
<entry>ZLib compression functions</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</sect2>
</sect1>
<sect1 id="install.apache">
<title>Servers-Apache</title>
<para>
This section contains notes and hints specific to Apache installs
of PHP, both for <link linkend="install.apache.unix">Unix</link> and
<link linkend="install.apache.windows">Windows</link> versions.
</para>
<sect2 id="install.apache.unix">
<title>Details of installing PHP with Apache on Unix.</title>
<para>
You can select arguments to add to the
<command>configure</command> on line 8 below from the <link
linkend="install.configure">Complete list of configure
options</link>.
</para>
<example id="install.apache.unix.longer">
<title>
Installation Instructions (Apache Module Version)
</title>
<programlisting>
1. gunzip apache_1.3.x.tar.gz
2. tar xvf apache_1.3.x.tar
3. gunzip php-x.x.x.tar.gz
4. tar xvf php-x.x.x.tar
5. cd apache_1.3.x
6. ./configure --prefix=/www
7. cd ../php-x.x.x
8. ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9. make
10. make install
11. cd ../apache_1.3.x
12. for PHP 3: ./configure --activate-module=src/modules/php3/libphp3.a
for PHP 4: ./configure --activate-module=src/modules/php4/libphp4.a
13. make
14. make install
Instead of this step you may prefer to simply copy the httpd binary
overtop of your existing binary. Make sure you shut down your
server first though.
15. cd ../php-x.x.x
16. for PHP 3: cp php3.ini-dist /usr/local/lib/php3.ini
for PHP 4: cp php.ini-dist /usr/local/lib/php.ini
You can edit your .ini file to set PHP options. If
you prefer this file in another location, use
--with-config-file-path=/path in step 8.
17. Edit your httpd.conf or srm.conf file and add:
For PHP 3: AddType application/x-httpd-php3 .php3
For PHP 4: AddType application/x-httpd-php .php
You can choose any extension you wish here. .php is simply the one
we suggest. You can even include .html .
18. Use your normal procedure for starting the Apache server. (You must
stop and restart the server, not just cause the server to reload by
use a HUP or USR1 signal.)
</programlisting>
</example>
<para>
Depending on your Apache install and Unix variant, there are many
possible ways to stop and restart the server. Below are some typical
lines used in restarting the server, for different apache/unix
installations. You should replace <literal>/path/to/</literal> with
the path to these applications on your systems.
<informalexample>
<programlisting>
1. Several Linux and SysV variants:
/etc/rc.d/init.d/httpd restart
2. Using apachectl scripts:
/path/to/apachectl stop
/path/to/apachectl start
3. httpdctl and httpsdctl (Using OpenSSL), similar to apachectl:
/path/to/httpsdctl stop
/path/to/httpsdctl start
4. Using mod_ssl, or another SSL server, you may want to manually
stop and start:
/path/to/apachectl stop
/path/to/apachectl startssl
</programlisting>
</informalexample>
The locations of the apachectl and http(s)dctl binaries often
vary. If your system has <literal>locate</literal> or
<literal>whereis</literal> or <literal>which</literal> commands,
these can assist you in finding your server contrl programs.
</para>
<para>
Different examples of compiling PHP for apache are as follows:
<informalexample>
<programlisting>
/configure --with-apxs --with-pgsql
</programlisting>
</informalexample>
</para>
<para>
This will create a <filename>libphp4.so</filename> shared
library that is loaded into Apache using a LoadModule line in
Apache's <filename>httpd.conf</filename> file. The PostgreSQL
support is embedded into this <filename>libphp4.so</filename>
library.
</para>
<para>
<informalexample>
<programlisting>
/configure --with-apxs --with-pgsql=shared
</programlisting>
</informalexample>
</para>
<para>
This will again create a <filename>libphp4.so</filename> shared
library for Apache, but it will also create a
<filename>pgsql.so</filename> shared library that is loaded into
PHP either by using the extension directive in
<filename>php.ini</filename> file or by loading it explicitly in
a script using the <function>dl</function> function.
</para>
<para>
<informalexample>
<programlisting>
/configure --with-apache=/path/to/apache_source --with-pgsql
</programlisting>
</informalexample>
</para>
<para>
This will create a <filename>libmodphp4.a</filename> library, a
<filename>mod_php4.c</filename> and some accompanying files and
copy this into the <literal>src/modules/php4</literal> directory
in the Apache source tree. Then you compile Apache using
<literal>--activate-module=src/modules/php4/libphp4.a</literal>
and the Apache build system will create
<filename>libphp4.a</filename> and link it statically into the
<filename>httpd</filename> binary. The PostgreSQL support is
included directly into this <filename>httpd</filename> binary,
so the final result here is a single <filename>httpd</filename>
binary that includes all of Apache and all of PHP.
</para>
<para>
<informalexample>
<programlisting>
/configure --with-apache=/path/to/apache_source --with-pgsql=shared
</programlisting>
</informalexample>
</para>
<para>
Same as before, except instead of including PostgreSQL support
directly into the final <filename>httpd</filename> you will get
a <filename>pgsql.so</filename> shared library that you can load
into PHP from either the <filename>php.ini</filename> file or
directly using <function>dl</function>.
</para>
<para>
When choosing to build PHP in different ways, you should consider
the advantages and drawbacks of each method. Building as a shared
object will mean that you can compile apache separately, and don't
have to recompile everything as you add to, or change, PHP.
Building PHP into apache (static method) means that PHP will
load and run faster. For more information, see the Apache
<ulink url="&url.apachedso;">webpage on DSO support</ulink>.
</para>
</sect2>
<sect2 id="install.apache.windows">
<title>Details of installing PHP on Windows with Apache 1.3.x</title>
<simpara>
There are two ways to set up PHP to work with Apache 1.3.x
on Windows. One is to use the CGI binary (php.exe),
the other is to use the Apache module dll. In either case
you need to stop the Apache server, and edit your
<literal>srm.conf</literal> or <literal>httpd.conf</literal>
to configure Apache to work with PHP.
</simpara>
<simpara>
Although there can be a few variations of configuring PHP
under Apache, these are simple enough to be used by the
newcomer. Please consult the Apache Docs for further
configuration directives.
</simpara>
<para>
If you unziped the PHP package to C:\PHP\ as desribed
in the <link linkend="install.windows.manual">General
Installation Steps</link> section, you need to insert
these lines to your Apache conf file to set up the
CGI binary:
<itemizedlist>
<listitem>
<simpara>
<literal>
ScriptAlias /php/ "c:/php/"
</literal>
</simpara>
</listitem>
<listitem>
<simpara>
<literal>
AddType application/x-httpd-php .php .phtml
</literal>
</simpara>
</listitem>
<listitem>
<simpara>
<literal>
Action application/x-httpd-php "/php/php.exe"
</literal>
</simpara>
</listitem>
</itemizedlist>
Remerber to restart the server, for example,
<literal>NET STOP APACHE</literal> followed by
<literal>NET START APACHE</literal>.
</para>
<para>
If you would like to use PHP as a module in Apache,
you should move <filename>php4ts.dll</filename> to
the windows/system (for Windows 9x/Me) or winnt/system32
(for Windows NT/2000) directory, overwriting any older file.
Then you should add the following two lines to you Apache
conf file:
<itemizedlist>
<listitem>
<simpara>
<literal>
LoadModule php4_module c:/php/sapi/php4apache.dll
</literal>
</simpara>
</listitem>
<listitem>
<simpara>
<literal>
AddType application/x-httpd-php .php .phtml
</literal>
</simpara>
</listitem>
</itemizedlist>
</para>
<simpara>
To use the source code highlighting feature, simply create a PHP
script file and stick this code in: <literal><?php show_source
("original_php_script.php"); ?></literal>. Substitute
<literal>original_php_script.php</literal> with the name of the
file you wish to show the source of. (This is the only way of
doing so).
</simpara>
<note>
<simpara>
On Win-Apache all backslashes in a path statement such
as: "c:\directory\file.ext", must be converted to
forward slashes.
</simpara>
</note>
</sect2>
</sect1>
<sect1 id="install.commandline">
<title>Servers-CGI/Commandline</title>
<para>
The default is to build PHP as a CGI program. This creates a
commandline interpreter, which can be used for CGI processing, or
for non-web-related PHP scripting. If you are running a web
server PHP has module support for, you should generally go for
that solution for performance reasons. However, the CGI version
enables Apache users to run different PHP-enabled pages under
different user-ids. Please make sure you read through the <link
linkend="security">Security chapter</link> if you are going to
run PHP as a CGI.
</para>
<sect2 id="install.commandline.testing">
<title>Testing</title>
<simpara>
If you have built PHP as a CGI program, you may test your build
by typing <command>make test</command>. It is always a good idea
to test your build. This way you may catch a problem with PHP on
your platform early instead of having to struggle with it later.
</simpara>
</sect2>
<sect2 id="install.commandline.benchmarking">
<title>Benchmarking</title>
<simpara>
If you have built PHP 3 as a CGI program, you may benchmark your
build by typing <command>make bench</command>. Note that if safe
mode is on by default, the benchmark may not be able to finish if
it takes longer then the 30 seconds allowed. This is because the
<function>set_time_limit</function> can not be used in safe
mode. Use the <link
linkend="ini.max-execution-time">max_execution_time</link>
configuration setting to control this time for your own
scripts. <command>make bench</command> ignores the <link
linkend="configuration.file">configuration file</link>.
</simpara>
<note>
<simpara>
<command>make bench</command> is only available for PHP 3.
</simpara>
</note>
</sect2>
</sect1>
<sect1 id="install.fhttpd">
<title>Servers-fhttpd</title>
<para>
To build PHP as an fhttpd module, answer "yes" to "Build as an
fhttpd module?" (the <option><link
linkend="install.configure.with-fhttpd">
--with-fhttpd</link>=<replaceable>DIR</replaceable></option>
option to configure) and specify the fhttpd source base
directory. The default directory is <filename
class="directory">/usr/local/src/fhttpd</filename>. If you are
running fhttpd, building PHP as a module will give better
performance, more control and remote execution capability.
</para>
</sect1>
<sect1 id="install.caudium">
<title>Servers-Caudium</title>
<para>
PHP 4 can be build as a Pike module for the Caudium webserver. Note
that this is not supported with PHP 3. Follow the simple
instructions below to install PHP 4 for Caudium.
</para>
<example id="install.caudium.instructions">
<title>Caudium Installation Instructions</title>
<programlisting>
1. Make sure you have Caudium installed prior to attempting to
install PHP 4. For PHP 4 to work correctly, you will need Pike
7.0.268 or newer. For the sake of this example we assume that
Caudium is installed in /opt/caudium/server/.
2. Change directory to php-x.y.z (where x.y.z is the version number).
3. ./configure --with-caudium=/opt/caudium/server
4. make
5. make install
6. Restart Caudium if it's currently running.
7. Log into the graphical configuration interface and go to the
virtual server where you want to add PHP 4 support.
8. Click Add Module and locate and then add the PHP 4 Script Support module.
9. If the documentation says that the 'PHP 4 interpreter isn't
available', make sure that you restarted the server. If you did
check /opt/caudium/logs/debug/default.1 for any errors related to
<filename>PHP4.so</filename>. Also make sure that
<filename>caudium/server/lib/[pike-version]/PHP4.so</filename>
is present.
10. Configure the PHP Script Support module if needed.
</programlisting>
</example>
<para>
You can of course compile your Caudium module with support for the
various extensions available in PHP 4. See the
<link linkend="install.configure">complete list of configure
options</link> for an exhaustive rundown.
</para>
<note>
<para>
When compiling PHP 4 with MySQL support you must make sure that
the normal MySQL client code is used. Otherwise there might be
conflicts if your Pike already has MySQL support. You do this by
specifying a MySQL install directory <link
linkend="install.configure.with-mysql">the --with-mysql
option</link>.
</para>
</note>
</sect1>
<sect1 id="install.iis">
<title>Servers-IIS/PWS</title>
<para>
This section contains notes and hints specific to IIS (Microsoft
Internet Information Server) installing PHP for
<link linkend="install.iis.iis3">PWS/IIS 3</link>,
<link linkend="install.iis.pws4">PWS 4 or newer</link> and
<link linkend="install.iis.iis4">IIS 4 or newer</link> versions.
</para>
<sect2 id="install.iis.iis3">
<title>Windows and PWS/IIS 3</title>
<simpara>
The recommended method for configuring these servers is to use
the INF file included with the distribution
(php_iis_reg.inf). You may want to edit this file and make sure
the extensions and PHP install directories match your
configuration. Or you can follow the steps below to do it
manually.
</simpara>
<warning>
<para>
These steps involve working directly with the Windows
registry. One error here can leave your system in an unstable
state. We highly recommend that you back up your registry
first. The PHP Development team will not be held responsible if
you damage your registry.
</para>
</warning>
<para>
<itemizedlist>
<listitem>
<simpara>
Run Regedit.
</simpara>
</listitem>
<listitem>
<simpara>
Navigate to: <literal>HKEY_LOCAL_MACHINE /System
/CurrentControlSet /Services /W3Svc /Parameters
/ScriptMap</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
On the edit menu select: <literal>New->String Value</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Type in the extension you wish to use for your php
scripts. ex: <literal>.php</literal>
</simpara>
</listitem>
<listitem>
<simpara>
Double click on the new string value and enter the path to
<literal>php.exe</literal> in the value data field. ex:
<literal>c:\php\php.exe %s %s</literal>. The '%s %s' is VERY
important, PHP will not work properly without it.
</simpara>
</listitem>
<listitem>
<simpara>
Repeat these steps for each extension you wish to associate
with PHP scripts.
</simpara>
</listitem>
<listitem>
<simpara>
Now navigate to: <literal>HKEY_CLASSES_ROOT</literal>
</simpara>
</listitem>
<listitem>
<simpara>
On the edit menu select: <literal>New->Key</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Name the key to the extension you setup in the previous
section. ex: <literal>.php</literal>
</simpara>
</listitem>
<listitem>
<simpara>
Highlight the new key and in the right side pane, double click
the "default value" and enter <literal>phpfile</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Repeat the last step for each extension you set up in the
previous section.
</simpara>
</listitem>
<listitem>
<simpara>
Now create another <literal>New->Key</literal> under
<literal>HKEY_CLASSES_ROOT</literal> and name it
<literal>phpfile</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Highlight the new key <literal>phpfile</literal> and in the
right side pane, double click the "default value" and enter
<literal>PHP Script</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Right click on the <literal>phpfile</literal> key and select
<literal>New->Key</literal>, name it <literal>Shell</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Right click on the <literal>Shell</literal> key and select
<literal>New->Key</literal>, name it <literal>open</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Right click on the <literal>open</literal> key and select
<literal>New->Key</literal>, name it
<literal>command</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Highlight the new key <literal>command</literal> and in the
right side pane, double click the "default value" and enter
the path to <literal>php.exe</literal>. ex:
<literal>c:\php\php.exe -q %1</literal>. (don't forget the
<literal>%1</literal>).
</simpara>
</listitem>
<listitem>
<simpara>
Exit Regedit.
</simpara>
</listitem>
<listitem>
<simpara>
If using PWS on Windows, reboot to reload the registry.
</simpara>
</listitem>
</itemizedlist>
</para>
<simpara>
PWS and IIS 3 users now have a fully operational system. IIS 3
users can use a nifty <ulink url="&url.iiscfg;">tool</ulink>
from Steven Genusa to configure their script maps.
</simpara>
</sect2>
<sect2 id="install.iis.pws4">
<title>Windows and PWS 4 or newer</title>
<simpara>
When installing PHP on Windows with PWS 4 or newer version,
you have two options. One to set up the PHP CGI binary,
the other is to use the ISAPI module dll.
</simpara>
<para>
If you choose the CGI binary, do the following:
<itemizedlist>
<listitem>
<simpara>
Edit the enclosed <filename>pws-php4cgi.reg</filename>
file (look into the sapi dir) to reflect the location of
your php.exe. Forward slashes should be escaped, for example:
<literal>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script
Map] ".php"="C:\\PHP\\php.exe"</literal>
</simpara>
</listitem>
<listitem>
<simpara>
In the PWS Manager, right click on a given directory you want
to add PHP support to, and select Properties. Check the 'Execute'
checkbox, and confirm.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
If you choose the ISAPI module, do the following:
<itemizedlist>
<listitem>
<simpara>
Edit the enclosed <filename>pws-php4isapi.reg</filename>
file (look into the sapi dir) to reflect the location of
your php4isapi.dll. Forward slashes should be escaped, for example:
<literal>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script
Map] ".php"="C:\\PHP\\sapi\\php4isapi.dll"</literal>
</simpara>
</listitem>
<listitem>
<simpara>
In the PWS Manager, right click on a given directory you want to
add PHP support to, and select Properties. Check the 'Execute'
checkbox, and confirm.
</simpara>
</listitem>
</itemizedlist>
</para>
</sect2>
<sect2 id="install.iis.iis4">
<title>Windows NT/2000 and IIS 4 or newer</title>
<simpara>
To install PHP on an NT/2000 Server running IIS 4 or newer,
follow these instructions. You have two options to set up
PHP, using the CGI binary (php.exe) or with the ISAPI module.
</simpara>
<simpara>
In either case, you need to start the Microsoft Management
Console (may appear as 'Internet Services Manager', either
in your Windows NT 4.0 Option Pack branch or the Control
Panel=>Administrative Tools under Windows 2000). Then
right click on your Web server node (this will most probably
appear as 'Default Web Server'), and select 'Properties'.
</simpara>
<para>
If you want to use the CGI binary, do the following:
<itemizedlist>
<listitem>
<simpara>
Under 'Home Directory', 'Virtual Directory', or
'Directory', click on the 'Configuration' button,
and then enter the App Mappings tab.
</simpara>
</listitem>
<listitem>
<simpara>
Click Add, and in the Executable box, type:
<literal>c:\php\php.exe %s %s</literal> (assuming
that you have unziped PHP in c:\php\). You MUST
have the %s %s on the end, PHP will not function
properly if you fail to do this.
</simpara>
</listitem>
<listitem>
<simpara>
In the Extension box, type the file name extension you want
associated with PHP scripts. Leave 'Method exclusions'
blank, and check the Script engine checkbox.
You must repeat step 3 and 4 for each extension you
want associated with PHP scripts.
(<literal>.php</literal> and <literal>.phtml</literal>
are common.)
</simpara>
</listitem>
<listitem>
<simpara>
Set up the appropriate security. (This is done in Internet
Service Manager), and if your NT Server uses NTFS file system,
add execute rights for I_USR_ to the directory that contains
<literal>php.exe</literal>.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
To use the ISAPI module, do the following:
<itemizedlist>
<listitem>
<simpara>
If you don't want to perform HTTP Authentication using PHP,
you can (and should) skip this step. Under ISAPI Filters,
add a new ISAPI filter. Use PHP as the filter name, and
supply a path to the php4isapi.dll.
</simpara>
</listitem>
<listitem>
<simpara>
Under 'Home Directory', click on the 'Configuration' button.
Add a new entry to the Application Mappings. Use the path
to the php4isapi.dll as the Executable, supply .php as the
extension, leave Method exclusions blank, and check the
Script engine checkbox.
</simpara>
</listitem>
<listitem>
<simpara>
Stop IIS completely
</simpara>
</listitem>
<listitem>
<simpara>
Start IIS again
</simpara>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<sect1 id="install.netscape-enterprise">
<title>Servers-Netscape and iPlanet</title>
<para>
To build PHP with NES or iPlanet web servers, enter the proper
install directory for the
<option><link linkend="install.configure.with-nsapi">--with-nsapi</link> =
<replaceable>DIR</replaceable></option>
option. The default directory is usually
<filename class="directory">/opt/netscape/suitespot/</filename>.
Please also read
<filename>/php-xxx-version/sapi/nsapi/nsapi-readme.txt</filename>.
</para>
<para>
<example id="install.netscape-enterprise.solaris">
<title>
Installation Example for Netscape Enterprise on Solaris
</title>
<programlisting>
Instructions for Sun Solaris 2.6 with Netscape Enterprise Server 3.6
From: [EMAIL PROTECTED]
1. Install the following packages from www.sunfreeware.com or another
download site:
flex-2_5_4a-sol26-sparc-local
gcc-2_95_2-sol26-sparc-local
gzip-1.2.4-sol26-sparc-local
perl-5_005_03-sol26-sparc-local
bison-1_25-sol26-sparc-local
make-3_76_1-sol26-sparc-local
m4-1_4-sol26-sparc-local
autoconf-2.13
automake-1.4
mysql-3.23.24-beta (if you want mysql support)
tar-1.13 (GNU tar)
2. Make sure your path includes the proper directories
PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin
export PATH
3. gunzip php-x.x.x.tar.gz (if you have a .gz dist, otherwise go to 4)
4. tar xvf php-x.x.x.tar
5. cd ../php-x.x.x
6. For the following step, make sure /opt/netscape/suitespot/ is where
your netscape server is installed. Otherwise, change to correct path:
/configure --with-mysql=/usr/local/mysql --with-nsapi=/opt/netscape/suitespot/
--enable-track-vars --enable-libgcc
7. make
8. make install
</programlisting>
</example>
After performing the base install and reading the appropriate
readme file, you may need to performs some additional
configuration steps.
</para>
<para>
Firstly you may need to add some paths to the LD_LIBRARY_PATH
environment for Netscape to find all the shared libs. This can
best done in the start script for your Netscape server.
Windows users can probably skip this step. The start
script is often located in:
<filename
class="directory">/path/to/server/https-servername/start</filename>
</para>
<para>
You may also need to edit the configuration files that are
located in:<filename
class="directory">/path/to/server/https-servername/config/</filename>.
</para>
<example id="install.netscape-enterprise.configure">
<title>
Configuration Example for Netscape Enterprise
</title>
<programlisting>
Configuration Instructions for Netscape Enterprise Server
From: [EMAIL PROTECTED]
1. Add the following line to mime.types:
type=magnus-internal/x-httpd-php exts=php
2. Add the following to obj.conf, shlib will vary depending on
your OS, for unix it will be something like
/opt/netscape/suitespot/bin/libphp4.so.
You should place the following lines after mime types init.
Init fn="load-modules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans"
shlib="/php4/nsapiPHP4.dll"
Init fn=php4_init errorString="Failed to initialize PHP!"
<object name="default">
.
.
.
.#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog'
lines
Service fn="php4_execute" type="magnus-internal/x-httpd-php"
.
.
</Object>
<Object name="x-httpd-php">
ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
Service fn=php4_execute
</Object>
Authentication configuration
PHP authentication cannot be used with any other authentication. ALL
AUTHENTICATION IS
PASSED TO YOUR PHP SCRIPT. To configure PHP Authentication for the entire server,
add
the following line:
<Object name="default">
AuthTrans fn=php4_auth_trans
.
.
.
.
</Object>
To use PHP Authentication on a single directory, add the following:
<Object ppath="d:\path\to\authenticated\dir\*">
AuthTrans fn=php4_auth_trans
</Object>
</programlisting>
</example>
</sect1>
<sect1 id="install.omnihttpd">
<title>Servers-OmniHTTPd Server</title>
<para>
This section contains notes and hints specific to OmniHTTPd.
</para>
<sect2 id="install.omnihttpd.windows">
<title>OmniHTTPd 2.0b1 and up for Windows</title>
<simpara>
This has got to be the easiest config there is:
</simpara>
<para>
<itemizedlist>
<listitem>
<para>
Step 1: Install OmniHTTPd server.
</para>
</listitem>
<listitem>
<para>
Step 2: Right click on the blue OmniHTTPd icon in the system
tray and select <literal>Properties</literal>
</para>
</listitem>
<listitem>
<para>
Step 3: Click on <literal>Web Server Global Settings</literal>
</para>
</listitem>
<listitem>
<para>
Step 4: On the 'External' tab, enter: <literal>virtual = .php
| actual = c:\path-to-php-dir\php.exe</literal>, and use the Add
button.
</para>
</listitem>
<listitem>
<para>
Step 5: On the <literal>Mime</literal> tab, enter:
<literal>virtual = wwwserver/stdcgi | actual = .php</literal>,
and use the Add button.
</para>
</listitem>
<listitem>
<para>
Step 6: Click <literal>OK</literal>
</para>
</listitem>
</itemizedlist>
</para>
<simpara>
Repeat steps 2 - 6 for each extension you want to associate with PHP.
</simpara>
<note>
<para>
Some OmniHTTPd packages come with built in PHP support.
You can choose at setup time to do a custom setup, and
uncheck the PHP component. We recommend you to use the latest
PHP binaries. Some OmniHTTPd servers come with PHP 4 beta
distributions, so you should choose not to set up
the built in support, but install your own. If the server
is already on your machine, use the Replace button in Step
4 and 5 to set the new, correct information.
</para>
</note>
</sect2>
</sect1>
<sect1 id="install.oreilly">
<title>Servers-Oreilly Website Pro</title>
<para>
This section contains notes and hints specific to Oreilly
Website Pro.
</para>
<sect2 id="install.oreilly.windows">
<title>Oreilly Website Pro 2.5 and up for Windows</title>
<simpara>
This list describes how to set up the PHP CGI binary
or the ISAPI module to work with Oreilly Website Pro
on Windows.
</simpara>
<para>
<itemizedlist>
<listitem>
<para>
Edit the Server Properties and select the tab "Mapping".
</para>
</listitem>
<listitem>
<para>
From the List select "Associations" and enter the desired
extension (".php") and the path to the CGI exe
(ex. c:\php\php.exe) or the ISAPI dll file
(ex. c:\php\sapi\php4isapi.dll).
</para>
</listitem>
<listitem>
<para>
Select "Content Types" add the same extension ".php"
and enter the content type. If you choose the CGI exe
file, enter 'wwwserver/shellcgi', if you chosse the
ISAPI module, enter 'wwwserver/isapi' (both without
quotes).
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<sect1 id="install.xitami">
<title>Servers-Xitami</title>
<para>
This section contains notes and hints specific to Xitami.
</para>
<sect2 id="install.xitami.windows">
<title>Xitami for Windows</title>
<simpara>
This list describes how to set up the PHP CGI binary
to work with Xitami on Windows.
</simpara>
<para>
<itemizedlist>
<listitem>
<para>
Make sure the webserver is running, and point
your browser to xitamis admin console
(usually http://127.0.0.1/admin), and click on
Configuration.
</para>
</listitem>
<listitem>
<para>
Navigate to the Filters, and put the
extension which php should parse (i.e. .php)
into the field File extensions (.xxx).
</para>
</listitem>
<listitem>
<para>
In Filter command or script put the path and name
of your php executable i.e. c:\php\php.exe.
</para>
</listitem>
<listitem>
<para>
Press the 'Save' icon.
</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<sect1 id="install.otherhttpd">
<title>Servers-Other web servers</title>
<para>
PHP can be built to support a large number of web servers. Please
see <link linkend="install.configure.servers">Server-related
options</link> for a full list of server-related configure
options. The PHP CGI binaries are compatible with almost all
webservers supporting the CGI interface.
</para>
</sect1>
<sect1 id="install-problems">
<title>Problems?</title>
<sect2>
<title>Read the FAQ</title>
<simpara>
Some problems are more common than others. The most common ones
are listed in the PHP FAQ, found at <ulink
url="&url.php.faq;">&url.php.faq;</ulink>
</simpara>
</sect2>
<sect2 id="install.otherproblems">
<title>Other problems</title>
<simpara>
If you are still stuck, someone on the PHP installation mailing list may be
able to help you. You should check out the archive first, in case
someone already answered someone else who had the same problem as
you. The archives are available from the support page on <ulink
url="&url.php;">&url.php;</ulink>. To subscribe to the PHP installation
mailing list, send an empty mail to <ulink
url="mailto:&email.php.install.subscribe;">&email.php.install.subscribe;</ulink>.
The mailing list address is
<literal>&email.php.install;</literal>.
</simpara>
<simpara>
If you want to get help on the mailing list, please try to be
precise and give the necessary details about your environment
(which operating system, what PHP version, what web server, if
you are running PHP as CGI or a server module, etc.), and
preferably enough code to make others able to reproduce and test
your problem.
</simpara>
</sect2>
<sect2 id="install.bugreports">
<title>Bug reports</title>
<simpara>
If you think you have found a bug in PHP, please report it. The
PHP developers probably don't know about it, and unless you
report it, chances are it won't be fixed. You can report bugs
using the bug-tracking system at <ulink
url="&url.php.bugs;">&url.php.bugs;</ulink>.
</simpara>
<simpara>
Read the <ulink
url="&url.php.bugdosdonts;">Bugs-Dos-And-Donts</ulink>
before submitting any bug reports!
</simpara>
</sect2>
</sect1>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/chapters/intro.xml
+++ phpdoc/hk/chapters/intro.xml
<chapter id="introduction">
<title>�ި�</title>
<sect1 id="intro-whatis">
<title>PHP �O���� ?</title>
<simpara>
PHP (�x��W�� "PHP: Hypertext Preprocessor") �O�@�إ]�t�b HTML
��b���A�W�B�檺�������y���C
</simpara>
<para>
�o�ӵ��װ��`�����A �쩳�O����N��O ? �ݤU�����ܽd :
</para>
<para>
<example>
<title>²��Ҥl</title>
<programlisting role="php">
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
echo "Hi, I'm a PHP script!";
?>
</body>
</html>
</programlisting>
</example>
</para>
<para>
����@�U�W�����Ҥl�M�@��� Perl�B C ���� �g�� CGI �{���A �A�|�o�{�����`��²��C
���ǥΨӿ�X HTML �奻�����g�j�ת����O�����F�A ���ӥN���� �O�O�J�b HTML
����{���X�C�o�ǵ{���X�|����S�w���u�@�A�p�W�ҫK�O���X�@���r�C PHP
���{���y�y�������w��
�}�l/��������
</para>
<para>
�]�_�ӥH�K�M�u�� HTML ���e���}�C ��� PHP �����A���|�� PHP
�����e���������A�������A�̼��ҹL�y�X PHP ��t�{�����O�������Ӱ���C
�̫���A����B��G�M���Ӫ� HTML �����@�ְe��Ȥ�ݥh�C </para>
</sect1>
<sect1 id="intro-whatcando">
<title>PHP �i�H������ ?</title>
<para>
�b�̧C���n�D�U�A PHP �i�H�����Ҧ� CGI �{�����u�@�C ��p��������W����ơA
�۰ʫ����p���� HTML �����Ϊ̦��e COOKIES�C
</para>
<para>
���L PHP �̧l�ޤH���a��O����·��h��������Ʈw�n��C
�Υ��Ӽg�@��¸�Ʈw������²����Y���ٮe���C PHP �ثe��ª���Ʈw�]�A:
<blockquote>
<simplelist columns="3">
<member>Adabas D</member>
<member>dBase</member>
<member>Empress</member>
<member>FilePro (read-only)</member>
<member>Hyperwave</member>
<member>IBM DB2</member>
<member>Informix</member>
<member>Ingres</member>
<member>InterBase</member>
<member>FrontBase</member>
<member>mSQL</member>
<member>Direct MS-SQL</member>
<member>MySQL</member>
<member>ODBC</member>
<member>Oracle (OCI7 and OCI8)</member>
<member>Ovrimos</member>
<member>PostgreSQL</member>
<member>Solid</member>
<member>Sybase</member>
<member>Velocis</member>
<member>Unix dbm</member>
</simplelist>
</blockquote>
</para>
<para>
�������~�A PHP �]�i�q�L IMAP�B SNMP�B NNTP�B POP3 �Ʀ� HTTP
�����q�T��w�өM�O�����W�A�Ȭ۳s�C �N��O�s����C�h���������f SOCKET
���]���������q�T��w�i�ΡC </para>
<!--
<figure>
<title>�������c</title>
<graphic fileref="../images/php3_internal_structure.gif"/>
</figure>
<figure>
<title>�إ߳s�����W�h</title>
<graphic fileref="../images/php3_request_scheme.gif"/>
</figure>
-->
</sect1>
<sect1 id="intro-history">
<title>PHP ���G��</title>
<simpara>
PHP �������O 1994 ��ѥ� &link.rasmus; �Q�X�Ӫ��C
PHP was conceived sometime in the fall of 1994 by &link.rasmus;.
Early non-released versions were used on his home page to keep
track of who was looking at his online resume. The first version
used by others was available sometime in early 1995 and was known
as the Personal Home Page Tools. It consisted of a very
simplistic parser engine that only understood a few special macros
and a number of utilities that were in common use on home pages
back then. A guestbook, a counter and some other stuff. The
parser was rewritten in mid-1995 and named PHP/FI Version 2. The
FI came from another package Rasmus had written which interpreted
html form data. He combined the Personal Home Page tools scripts
with the Form Interpreter and added mSQL support and PHP/FI was
born. PHP/FI grew at an amazing pace and people started
contributing code to it.
</simpara>
<simpara>
It is difficult to give any hard statistics, but it is estimated
that by late 1996 PHP/FI was in use on at least 15,000 web sites
around the world. By mid-1997 this number had grown to over
50,000. Mid-1997 also saw a change in the development of PHP. It
changed from being Rasmus' own pet project that a handful of
people had contributed to, to being a much more organized team
effort. The parser was rewritten from scratch by Zeev Suraski and
Andi Gutmans and this new parser formed the basis for PHP Version
3. A lot of the utility code from PHP/FI was ported over to PHP 3
and a lot of it was completely rewritten.
</simpara>
<simpara>
The latest version (PHP 4) uses the <ulink
url="&url.zend;">Zend</ulink> scripting engine to deliver higher
performance, supports an even wider array of third-party libraries
and extensions, and runs as a native server module with all of the
popular web servers.
</simpara>
<simpara>
Today (1/2001) PHP 3 or PHP 4 now ships with a number of
commercial products such as Red Hat's Stronghold web server.
A conservative estimate based on an extrapolation from
numbers provided by <ulink url="&url.netcraft;">Netcraft</ulink>
(see also <ulink url="&url.netcraft-survey;">Netcraft Web Server
Survey</ulink>) would be that PHP is in use on over 5,100,000
sites around the world. To put that in perspective, that is
slightly more sites than run Microsoft's IIS server on the Internet
(5.03 million).
</simpara>
<!--
<figure>
<title>NetCraft Webserver Survey</title>
<graphic fileref="&url.php.stats;"/>
</figure>
-->
</sect1>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/chapters/security.xml
+++ phpdoc/hk/chapters/security.xml
<chapter id="security">
<title>Security</title>
<simpara>
PHP is a powerful language and the interpreter, whether included
in a web server as a module or executed as a separate
<acronym>CGI</acronym> binary, is able to access files, execute
commands and open network connections on the server. These
properties make anything run on a web server insecure by default.
PHP is designed specifically to be a more secure language for
writing CGI programs than Perl or C, and with correct selection of
compile-time and runtime configuration options, and proper coding
practices, it can give you exactly the combination of freedom and
security you need.
</simpara>
<simpara>
As there are many different ways of utilizing PHP, there are many
configuration options controlling its behaviour. A large
selection of options guarantees you can use PHP for a lot of
purposes, but it also means there are combinations of these
options and server configurations that result in an insecure
setup.
</simpara>
<simpara>
The configuration flexibility of PHP is equally rivalled by the
code flexibility. PHP can be used to build complete server
applications, with all the power of a shell user, or it can be used
for simple server-side includes with little risk in a tightly
controlled environment. How you build that environment, and how
secure it is, is largely up to the PHP developer.
</simpara>
<simpara>
This chapter starts by explaining the different configuration
option combinations and the situations they can be safely used. It
then describes different considerations in coding for different
levels of security, and ends with some general security advice.
</simpara>
<sect1 id="security.cgi">
<title>Installed as CGI binary</title>
<sect2 id="security.cgi.attacks">
<title>Possible attacks</title>
<simpara>
Using PHP as a <acronym>CGI</acronym> binary is an option for
setups that for some reason do not wish to integrate PHP as a
module into server software (like Apache), or will use PHP with
different kinds of CGI wrappers to create safe chroot and setuid
environments for scripts. This setup usually involves installing
executable PHP binary to the web server cgi-bin directory. CERT
advisory <ulink url="&url.cert;">CA-96.11</ulink> recommends
against placing any interpreters into cgi-bin. Even if the PHP
binary can be used as a standalone interpreter, PHP is designed
to prevent the attacks this setup makes possible:
</simpara>
<itemizedlist>
<listitem>
<simpara>
Accessing system files: <filename
role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>
</simpara>
<simpara>
The query information in a url after the question mark (?) is
passed as command line arguments to the interpreter by the CGI
interface. Usually interpreters open and execute the file
specified as the first argument on the command line.
</simpara>
<simpara>
When invoked as a CGI binary, PHP refuses to interpret the
command line arguments.
</simpara>
</listitem>
<listitem>
<simpara>
Accessing any web document on server: <filename
role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>
</simpara>
<simpara>
The path information part of the url after the PHP binary name,
<filename role="uri">/secret/doc.html</filename> is
conventionally used to specify the name of the file to be
opened and interpreted by the <acronym>CGI</acronym> program.
Usually some web server configuration directives (Apache:
Action) are used to redirect requests to documents like
<filename
role="url">http://my.host/secret/script.php</filename> to the
PHP interpreter. With this setup, the web server first checks
the access permissions to the directory <filename
role="uri">/secret</filename>, and after that creates the
redirected request <filename
role="url">http://my.host/cgi-bin/php/secret/script.php</filename>.
Unfortunately, if the request is originally given in this form,
no access checks are made by web server for file <filename
role="uri">/secret/script.php</filename>, but only for the
<filename role="uri">/cgi-bin/php</filename> file. This way
any user able to access <filename
role="uri">/cgi-bin/php</filename> is able to access any
protected document on the web server.
</simpara>
<simpara>
In PHP, compile-time configuration option <link
linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
and runtime configuration directives <link
linkend="ini.doc-root">doc_root</link> and <link
linkend="ini.user-dir">user_dir</link> can be used to prevent
this attack, if the server document tree has any directories
with access restrictions. See below for full the explanation
of the different combinations.
</simpara>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="security.cgi.default">
<title>Case 1: only public files served</title>
<simpara>
If your server does not have any content that is not restricted
by password or ip based access control, there is no need for
these configuration options. If your web server does not allow
you to do redirects, or the server does not have a way to
communicate to the PHP binary that the request is a safely
redirected request, you can specify the option <link
linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
to the configure script. You still have to make sure your PHP
scripts do not rely on one or another way of calling the script,
neither by directly <filename
role="php">http://my.host/cgi-bin/php/dir/script.php</filename>
nor by redirection <filename
role="php">http://my.host/dir/script.php</filename>.
</simpara>
<simpara>
Redirection can be configured in Apache by using AddHandler and
Action directives (see below).
</simpara>
</sect2>
<sect2 id="security.cgi.force-redirect">
<title>Case 2: using --enable-force-cgi-redirect</title>
<simpara>
This compile-time option prevents anyone from calling PHP
directly with a url like <filename
role="php">http://my.host/cgi-bin/php/secretdir/script.php</filename>.
Instead, PHP will only parse in this mode if it has gone through
a web server redirect rule.
</simpara>
<simpara>
Usually the redirection in the Apache configuration is done with
the following directives:
</simpara>
<programlisting role="apache-conf">
Action php-script /cgi-bin/php
AddHandler php-script .php
</programlisting>
<simpara>
This option has only been tested with the Apache web server, and
relies on Apache to set the non-standard CGI environment variable
<envar>REDIRECT_STATUS</envar> on redirected requests. If your
web server does not support any way of telling if the request is
direct or redirected, you cannot use this option and you must use
one of the other ways of running the CGI version documented
here.
</simpara>
</sect2>
<sect2 id="security.cgi.doc-root">
<title>Case 3: setting doc_root or user_dir</title>
<simpara>
To include active content, like scripts and executables, in the
web server document directories is sometimes consider an insecure
practice. If, because of some configuration mistake, the scripts
are not executed but displayed as regular HTML documents, this
may result in leakage of intellectual property or security
information like passwords. Therefore many sysadmins will prefer
setting up another directory structure for scripts that are
accessible only through the PHP CGI, and therefore always
interpreted and not displayed as such.
</simpara>
<simpara>
Also if the method for making sure the requests are not
redirected, as described in the previous section, is not
available, it is necessary to set up a script doc_root that is
different from web document root.
</simpara>
<simpara>
You can set the PHP script document root by the configuration
directive <link linkend="ini.doc-root">doc_root</link> in the
<link linkend="configuration.file">configuration file</link>, or
you can set the environment variable
<envar>PHP_DOCUMENT_ROOT</envar>. If it is set, the CGI version
of PHP will always construct the file name to open with this
<parameter>doc_root</parameter> and the path information in the
request, so you can be sure no script is executed outside this
directory (except for <parameter>user_dir</parameter>
below).
</simpara>
<simpara>
Another option usable here is <link
linkend="ini.user-dir">user_dir</link>. When user_dir is unset,
only thing controlling the opened file name is
<parameter>doc_root</parameter>. Opening an url like <filename
role="url">http://my.host/~user/doc.php</filename> does not
result in opening a file under users home directory, but a file
called <filename role="uri">~user/doc.php</filename> under
doc_root (yes, a directory name starting with a tilde
[<literal>~</literal>]).
</simpara>
<simpara>
If user_dir is set to for example <filename
role="dir">public_php</filename>, a request like <filename
role="url">http://my.host/~user/doc.php</filename> will open a
file called <filename>doc.php</filename> under the directory
named <filename role="dir">public_php</filename> under the home
directory of the user. If the home of the user is <filename
role="dir">/home/user</filename>, the file executed is
<filename>/home/user/public_php/doc.php</filename>.
</simpara>
<simpara>
<parameter>user_dir</parameter> expansion happens regardless of
the <parameter>doc_root</parameter> setting, so you can control
the document root and user directory access
separately.
</simpara>
</sect2>
<sect2 id="security.cgi.shell">
<title>Case 4: PHP parser outside of web tree</title>
<para>
A very secure option is to put the PHP parser binary somewhere
outside of the web tree of files. In <filename
role="dir">/usr/local/bin</filename>, for example. The only real
downside to this option is that you will now have to put a line
similar to:
<informalexample>
<programlisting>
#!/usr/local/bin/php
</programlisting>
</informalexample>
as the first line of any file containing PHP tags. You will also
need to make the file executable. That is, treat it exactly as
you would treat any other CGI script written in Perl or sh or any
other common scripting language which uses the
<literal>#!</literal> shell-escape mechanism for launching
itself.
</para>
<para>
To get PHP to handle <envar>PATH_INFO</envar> and
<envar>PATH_TRANSLATED</envar> information correctly with this
setup, the php parser should be compiled with the <link
linkend="install.configure.enable-discard-path">--enable-discard-path</link>
configure option.
</para>
</sect2>
</sect1>
<sect1 id="security.apache">
<title>Installed as an Apache module</title>
<simpara>
When PHP is used as an Apache module it inherits Apache's user
permissions (typically those of the "nobody" user). This has several
impacts on security and authorization. For example, if you are using
PHP to access a database, unless that database has built-in access
control, you will have to make the database accessable to the
"nobody" user. This means a malicious script could access and modify
the databse, even without a username and password. It's entirely
possible that a web spider could stumble across a database
adminisitror's web page, and drop all of your databases. You can
protect against this with Apache authorization, or you can design
your own access model using LDAP, .htaccess files, etc. and include
that code as part of your PHP scripts.
</simpara>
<simpara>
Often, once security is established to the point where the PHP user
(in this case, the apache user) has very little risk, it is
discovered that PHP now has been prevented from writing virus files
to user directories. Or perhaps it has been prevented from accessing
or changing a non-public database. It has equally been secured from
writing files that it should, or entering database transactions.
</simpara>
<simpara>
A frequent security mistake made at this point is to allow apache
root permissions.
</simpara>
<simpara>
Escalating the Apache user's permissions to root is extremely
dangerous and may compromise the entire system, so sudo'ing,
chroot'ing ,or otherwise running as root should not be considered by
those who are not security professionals.
</simpara>
</sect1>
<sect1 id="security.filesystem">
<title>Filesystem Security</title>
<simpara>
PHP is subject to the security built into most server systems with
respect to permissions on a file and directory basis. This allows
you to control which files in the filesystem may be read. Care
should be taken with any files which are world readable to ensure
that they are safe for reading by all users who have access to that
filesystem.
</simpara>
<simpara>
Since PHP was designed to allow user level access to the filesystem,
it's entirely possible to write a PHP script that will allow you
to read system files such as /etc/password, modify your ethernet
connections, send massive printer jobs out, etc. This has some
obvious implications, in that you need to ensure that the files
that you read from and write to are the appropriate ones.
</simpara>
<simpara>
Consider the following script, where a user indicates that they'd
like to delete a file in their home directory. This assumes a
situation where a PHP web interface is regularly used for file
management, so the Apache user is allowed to delete files in
the user home directories.
</simpara>
<para>
<example>
<title>Poor variable checking leads to....</title>
<programlisting role="php">
<?php
// remove a file from the user's home directory
$username = $user_submitted_name;
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ($homedir/$userfile);
echo "$file_to_delete has been deleted!";
?>
</programlisting>
</example>
Since the username is postable from a user form, they can submit
a username and file belonging to someone else, and delete files.
In this case, you'd want to use some other form of authentication.
Consider what could happen if the variables submitted were
"../etc/" and "passwd". The code would then effectively read:
<example>
<title>... A filesystem attack</title>
<programlisting role="php">
<?php
// removes a file from anywhere on the hard drive that
// the PHP user has access to. If PHP has root access:
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd has been deleted!";
?>
</programlisting>
</example>
There are two important measures you should take to prevent these
issues.
<itemizedlist>
<listitem>
<simpara>
Only allow limited permissions to the PHP web user binary.
</simpara>
</listitem>
<listitem>
<simpara>
Check all variables which are submitted.
</simpara>
</listitem>
</itemizedlist>
Here is an improved script:
<example>
<title>More secure file name checking</title>
<programlisting role="php">
<?php
// removes a file from the hard drive that
// the PHP user has access to.
$username = $HTTP_REMOTE_USER; // use an authentication mechanisim
$homedir = "/home/$username";
$file_to_delete = basename("$userfile"); // strip paths
unlink ($homedir/$file_to_delete);
$fp = fopen("/home/logging/filedelete.log","+a"); //log the deletion
$logstring = "$HTTP_REMOTE_USER $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);
echo "$file_to_delete has been deleted!";
?>
</programlisting>
</example>
Alternately, you may prefer to write a more customized check:
<example>
<title>More secure file name checking</title>
<programlisting role="php">
<?php
$username = getenv("REMOTE_USER");
$homedir = "/home/$username";
if (!ereg('^[^./][^/]*$', $userfile))
die('bad filename'); //die, do not process
//etc...
?>
</programlisting>
</example>
Depending on your operating system, there are a wide variety of files
which you should be concerned about, including device entries (/dev/
or COM1), configuration files (/etc/ files and the .ini files),
well known file storage areas (/home/, My Documents), etc. For this
reason, it's usually easier to create a policy where you forbid
everything except for what you explicitly allow.
</para>
</sect1>
<sect1 id="security.errors">
<title>Error Reporting</title>
<simpara>
A standard attack tactic involves profiling a system by feeding
it improper data, and checking for the kinds, and contexts, of the
errors which are returned. This allows the system cracker to probe
for information about the server, to determine possible weaknesses.
</simpara>
<simpara>
The PHP errors which are normally returned can be quite helpful to a
developer who is trying to debug a script, indicating such things
as the function or file that failed, the PHP file it failed in,
and the line number which the failure occured in. This is all
information that can be exploited. It is not uncommon for a php
developer to use <function>show_source</function>,
<function>highlight_string</function>, or
<function>highlight_file</function> as a debugging measure, but in
a live site, this can expose hidden variables, unchecked syntax,
and other dangerous information.
</simpara>
<simpara>
For example, the very style of a generic error indicates a system
is running PHP. If the attacker was looking at an .html page, and
wanted to probe for the back-end (to look for known weaknesses in
the system), by feeding it the wrong data they may be able to
determine that a system was built with PHP.
</simpara>
<simpara>
A function error can indicate whether a system may be running a
specific database engine, or give clues as to how a web page or
programmed or designed. This allows for deeper investigation into
open database ports, or to look for specific bugs or weaknesses
in a web page. By feeding different pieces of bad data, for example,
an attacker can determine the order of authentication in a script,
(from the line number errors) as well as probe for exploits that
may be exploited in different locations in the script.
</simpara>
<simpara>
A filesystem or general PHP error can indicate what permissions
the webserver has, as well as the structure and organization of
files on the web server. Developer written error code can aggravate
this problem, leading to easy exploitation of formerly "hidden"
information.
</simpara>
<simpara>
There are three major solutions to this issue. The first is to
scrutinize all functions, and attempt to compensate for the bulk
of the errors. The second is to disable error reporting entirely
on the running code. The third is to use PHP's custom error
handling functions to create your own error handler. Depending
on your security policy, you may find all three to be applicable
to your situation.
</simpara>
</sect1>
<sect1 id="security.variables">
<title>User Submitted Data</title>
<para>
The greatest weakness in many PHP programs is not inherent in the
language itself, but merely an issue of code not being written with
security in mind. For this reason, you should always take the time
to consider the implications of a given piece of code, to ascertain
the possible damage if an unexpected variable is submitted to it.
<example>
<title>Dangerous Variable Usage</title>
<programlisting role="php">
<?php
// remove a file from the user's home directory... or maybe
// somebody else's?
unlink ($evil_var);
// Write logging of their access... or maybe not?
fputs ($fp, $evil_var);
// Execute something trivial.. or rm -rf *?
system ($evil_var);
exec ($evil_var);
?>
</programlisting>
</example>
You should always carefully examine your code to make sure that any
variables being submitted from a web browser are being properly
checked, and ask yourself the following questions:
<itemizedlist>
<listitem>
<simpara>
Will this script only affect the intended files?
</simpara>
</listitem>
<listitem>
<simpara>
Can unusual or undesirable data be acted upon?
</simpara>
</listitem>
<listitem>
<simpara>
Can this script be used in unintended ways?
</simpara>
</listitem>
<listitem>
<simpara>
Can this be used in conjunction with other scripts in a negative
manner?
</simpara>
</listitem>
<listitem>
<simpara>
Will any transactions be adequately logged?
</simpara>
</listitem>
</itemizedlist>
By adequately asking these questions while writing the script,
rather than later, you prevent an unfortunate re-write when you
need to increase your security. By starting out with this mindset,
you won't guarantee the security of your system, but you can help
improve it.
</para>
<para>
You may also want to consider turning off register_globals,
magic_quotes, or other convenience settings which may confuse
you as to the validity, source, or value of a given variable.
Working with PHP in error_reporting(E_ALL) mode can also help warn
you about variables being used before they are checked or
initialized (so you can prevent unusual data from being
operated upon).
</para>
</sect1>
<sect1 id="security.general">
<title>General considerations</title>
<simpara>
A completely secure system is a virtual impossibility, so an
approach often used in the security profession is one of balancing
risk and usability. If every variable submitted by a user required
two forms of biometric validation (such as a retinal scan and a
fingerprint), you would have an extremely high level of
accountability. It would also take half an hour to fill out a fairly
complex form, which would tend to encourage users to find ways of
bypassing the security.
</simpara>
<simpara>
The best security is often inobtrusive enough to suit the
requirements without the user being prevented from accomplishing
their work, or over-burdening the code author with excessive
complexity. Indeed, some security attacks are merely exploits of
this kind of overly built security, which tends to erode over time.
</simpara>
<simpara>
A phrase worth remembering: A system is only as good as the weakest
link in a chain. If all transactions are heavily logged based on
time, location, transaction type, etc. but the user is only
verified based on a single cookie, the validity of tying the users
to the transaction log is severely weakened.
</simpara>
<simpara>
When testing, keep in mind that you will not be able to test all
possibilities for even the simplest of pages. The input you
may expect will be completely unrelated to the input given by
a disgruntled employee, a cracker with months of time on their
hands, or a housecat walking across the keyboard. This is why it's
best to look at the code from a logical perspective, to discern
where unexpected data can be introduced, and then follow how it is
modified, reduced, or amplified.
</simpara>
<simpara>
The Internet is filled with people trying to make a name for
themselves by breaking your code, crashing your site, posting
inappropriate content, and otherwise making your day interesting.
It doesn't matter if you have a small or large site, you are
a target by simply being online, by having a server that can be
connected to. Many cracking programs do not discern by size, they
simply trawl massive IP blocks looking for victims. Try not to
become one.
</simpara>
</sect1>
<sect1 id="security.current">
<title>Keeping Current</title>
<simpara>
PHP, like any other large system, is under constant scrutiny and
improvement. Each new version will often include both major and
minor changes to enhance and repair security flaws, configuration
mishaps, and other issues that will affect the overall security
and stability of your system.
</simpara>
<simpara>
Like other system-level scripting languages and programs, the best
approach is to update often, and maintain awareness of the latest
versions and their changes.
</simpara>
</sect1>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/connection-handling.xml
+++ phpdoc/hk/features/connection-handling.xml
<chapter id="features.connection-handling">
<title>Connection handling</title>
<note>
<para>The following applies to 3.0.7 and later.</para>
</note>
<para>
Internally in PHP a connection status is maintained. There are 3
possible states:
<itemizedlist>
<listitem><simpara>0 - NORMAL</simpara></listitem>
<listitem><simpara>1 - ABORTED</simpara></listitem>
<listitem><simpara>2 - TIMEOUT</simpara></listitem>
</itemizedlist>
</para>
<simpara>
When a PHP script is running normally the NORMAL state, is active.
If the remote client disconnects the ABORTED state flag is
turned on. A remote client disconnect is usually caused by the
user hitting his STOP button. If the PHP-imposed time limit (see
<function>set_time_limit</function>) is hit, the TIMEOUT state flag
is turned on.</simpara>
<simpara>
You can decide whether or not you want a client disconnect to cause
your script to be aborted. Sometimes it is handy to always have your
scripts run to completion even if there is no remote browser receiving
the output. The default behaviour is however for your script to be
aborted when the remote client disconnects. This behaviour can be
set via the ignore_user_abort php3.ini directive as well as through
the corresponding php3_ignore_user_abort Apache .conf directive or
with the <function>ignore_user_abort</function> function. If you do
not tell PHP to ignore a user abort and the user aborts, your script
will terminate. The one exception is if you have registered a shutdown
function using <function>register_shutdown_function</function>. With a
shutdown function, when the remote user hits his STOP button, the
next time your script tries to output something PHP will detect that
the connection has been aborted and the shutdown function is called.
This shutdown function will also get called at the end of your script
terminating normally, so to do something different in case of a client
diconnect you can use the <function>connection_aborted</function>
function. This function will return true if the connection was
aborted.</simpara>
<simpara>
Your script can also be terminated by the built-in script timer.
The default timeout is 30 seconds. It can be changed using
the max_execution_time php3.ini directive or the corresponding
php3_max_execution_time Apache .conf directive as well as with
the <function>set_time_limit</function> function. When the timer
expires the script will be aborted and as with the above client
disconnect case, if a shutdown function has been registered it will
be called. Within this shutdown function you can check to see if
a timeout caused the shutdown function to be called by calling the
<function>connection_timeout</function> function. This function will
return true if a timeout caused the shutdown function to be called.</simpara>
<simpara>
One thing to note is that both the ABORTED and the TIMEOUT states
can be active at the same time. This is possible if you tell
PHP to ignore user aborts. PHP will still note the fact that
a user may have broken the connection, but the script will keep
running. If it then hits the time limit it will be aborted and
your shutdown function, if any, will be called. At this point
you will find that <function>connection_timeout</function>
and <function>connection_aborted</function> return true.
You can also check both states in a single call by using the
<function>connection_status</function>. This function returns a
bitfield of the active states. So, if both states are active it
would return 3, for example.</simpara>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/cookies.xml
+++ phpdoc/hk/features/cookies.xml
<chapter id="features.cookies">
<title>Cookies</title>
<para>
PHP transparently supports HTTP cookies. Cookies are a mechanism
for storing data in the remote browser and thus tracking
or identifying return users. You can set cookies using the
<function>setcookie</function> function. Cookies are part of the
HTTP header, so <function>setcookie</function> must be called before
any output is sent to the browser. This is the same limitation that
<function>header</function> has.</para>
<para>
Any cookies sent to you from the client will automatically be
turned into a PHP variable just like GET and POST method data. If
you wish to assign multiple values to a single cookie, just add
<emphasis>[]</emphasis> to the cookie name. For more details see
the <function>setcookie</function> function.</para>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/error-handling.xml
+++ phpdoc/hk/features/error-handling.xml
<chapter id="features.error-handling">
<title>Error Handling</title>
<para>
There are several types of errors and warnings in PHP. They are:
<table>
<title>PHP error types</title>
<tgroup cols="4">
<thead>
<row>
<entry>Value</entry>
<entry>Constant</entry>
<entry>Description</entry>
<entry>Note</entry>
</row>
</thead>
<tbody>
<row>
<entry>1</entry>
<entry>E_ERROR</entry>
<entry>fatal run-time errors</entry>
<entry></entry>
</row>
<row>
<entry>2</entry>
<entry>E_WARNING</entry>
<entry>run-time warnings (non fatal errors)</entry>
<entry></entry>
</row>
<row>
<entry>4</entry>
<entry>E_PARSE</entry>
<entry>compile-time parse errors</entry>
<entry></entry>
</row>
<row>
<entry>8</entry>
<entry>E_NOTICE </entry>
<entry>
run-time notices (less serious than warnings)
</entry>
<entry></entry>
</row>
<row>
<entry>16</entry>
<entry>E_CORE_ERROR</entry>
<entry>fatal errors that occur during PHP's initial startup</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>32</entry>
<entry>E_CORE_WARNING</entry>
<entry>
warnings (non fatal errors) that occur during PHP's initial
startup
</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>64</entry>
<entry>E_COMPILE_ERROR</entry>
<entry>fatal compile-time errors</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>128</entry>
<entry>E_COMPILE_WARNING</entry>
<entry>compile-time warnings (non fatal errors)</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>256</entry>
<entry>E_USER_ERROR</entry>
<entry>user-generated error message</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>512</entry>
<entry>E_USER_WARNING</entry>
<entry>user-generated warning message</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry>1024</entry>
<entry>E_USER_NOTICE </entry>
<entry>user-generated notice message</entry>
<entry>PHP 4 only</entry>
</row>
<row>
<entry></entry>
<entry>E_ALL</entry>
<entry>all of the above, as supported</entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
The above values (either numerical or symbolic) are used to build
up a bitmask that specifies which errors to report. You can use the
<link linkend="language.operators.bitwise">bitwise operators</link>
to combine these values or mask out certain types of errors. Note
that only '|', '~', '!', and '&' will be understood within
<filename>php.ini</filename>, however, and that no bitwise
operators will be understood within <filename>php3.ini</filename>.
</para>
<para>
In PHP 4, the default <link
linkend="ini.error-reporting">error_reporting</link> setting is
<literal>E_ALL & ~E_NOTICE</literal>, meaning to display all errors
and warnings which are not E_NOTICE-level. In PHP 3, the default
setting is <literal>(E_ERROR | E_WARNING | E_PARSE)</literal>,
meaning the same thing. Note, however, that since constants are not
supported in PHP 3's <filename>php3.ini</filename>, the <link
linkend="ini.error-reporting">error_reporting</link> setting there
must be numeric; hence, it is <literal>7</literal>.
</para>
<para>
The initial setting can be changed in the ini file with the <link
linkend="ini.error-reporting">error_reporting</link> directive, in
your Apache <filename>httpd.conf</filename> file with the
php_error_reporting (php3_error_reporting for PHP 3) directive, and
lastly it may be set at runtime within a script by using the
<function>error_reporting</function> function.
</para>
<warning>
<para>
When upgrading code or servers from PHP 3 to PHP 4 you should
check these settings and calls to
<function>error_reporting</function> or you might disable
reporting the new error types, especially E_COMPILE_ERROR. This
may lead to empty documents without any feedback of what happened
or where to look for the problem.
</para>
</warning>
<para>
All <link linkend="language.expressions">PHP expressions</link> can
also be called with the "@" prefix, which turns off error reporting
for that particular expression. If an error occurred during such
an expression and the <link
linkend="ini.track-errors">track_errors</link> feature is enabled,
you can find the error message in the global variable
<literal>$php_errormsg</literal>.
</para>
<note>
<para>
The <link linkend="language.operators.errorcontrol">@
error-control operator</link> prefix will not disable messages
that are the result of parse errors.
</para>
</note>
<warning>
<para>
Currently the <link linkend="language.operators.errorcontrol">@
error-control operator</link> prefix will even disable error
reporting for critical errors that will terminate script
execution. Among other things, this means that if you use <link
linkend="language.operators.errorcontrol">@</link> to suppress
errors from a certain function and either it isn't available or
has been mistyped, the script will die right there with no
indication as to why.
</para>
</warning>
<para>
Below we can see an example of using the error handling capabilities in
PHP. We define a error handling function which logs the information into
a file (using an XML format), and e-mails the developer in case a critical
error in the logic happens.
<example>
<title>Using error handling in a script</title>
<programlisting role="php">
<?php
// we will do our own error handling
error_reporting(0);
// user defined error handling function
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
// timestamp for the error entry
$dt = date("Y-m-d H:i:s (T)");
// define an assoc array of error string
// in reality the only entries we should
// consider are 2,8,256,512 and 1024
$errortype = array (
1 => "Error",
2 => "Warning",
4 => "Parsing Error",
8 => "Notice",
16 => "Core Error",
32 => "Core Warning",
64 => "Compile Error",
128 => "Compile Warning",
256 => "User Error",
512 => "User Warning",
1024=> "User Notice"
);
// set of errors for which a var trace will be saved
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>".$dt."</datetime>\n";
$err .= "\t<errornum>".$errno."</errnumber>\n";
$err .=
"\t<errortype>".$errortype[$errno]."</errortype>\n";
$err .= "\t<errormsg>".$errmsg."</errormsg>\n";
$err .=
"\t<scriptname>".$filename."</scriptname>\n";
$err .=
"\t<scriptlinenum>".$linenum."</scriptlinenum>\n";
if (in_array($errno, $user_errors))
$err .=
"\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
$err .= "</errorentry>\n\n";
// for testing
// echo $err;
// save to the error log, and e-mail me if there is a critical user error
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR)
mail("[EMAIL PROTECTED]","Critical User Error",$err);
}
function distance ($vect1, $vect2) {
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Vectors need to be of the same size", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Coordinate $i in vector 1 is not a number, using
zero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Coordinate $i in vector 2 is not a number, using
zero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// undefined constant, generates a warning
$t = I_AM_NOT_DEFINED;
// define some "vectors"
$a = array(2,3,"foo");
$b = array(5.5, 4.3, -1.6);
$c = array (1,-3);
// generate a user error
$t1 = distance($c,$b)."\n";
// generate another user error
$t2 = distance($b,"i am not an array")."\n";
// generate a warning
$t3 = distance($a,$b)."\n";
?>
</programlisting>
</example>
This is just a simple example showing how to use the
<link linkend="ref.errorfunc">Error Handling and Logging
functions</link>.
</para>
<para>
See also <function>error_reporting</function>,
<function>error_log</function>,
<function>set_error_handler</function>,
<function>restore_error_handler</function>,
<function>trigger_error</function>,
<function>user_error</function>
</para>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/file-upload.xml
+++ phpdoc/hk/features/file-upload.xml
<chapter id="features.file-upload">
<title>Handling file uploads</title>
<sect1 id="features.file-upload.post-method">
<title>POST method uploads</title>
<simpara>
PHP is capable of receiving file uploads from any RFC-1867
compliant browser (which includes Netscape Navigator 3 or later,
Microsoft Internet Explorer 3 with a patch from Microsoft, or
later without a patch). This feature lets people upload both text
and binary files. With PHP's authentication and file manipulation
functions, you have full control over who is allowed to upload and
what is to be done with the file once it has been uploaded.
</simpara>
<para>
Note that PHP also supports PUT-method file uploads as used by
Netscape Composer and W3C's Amaya clients. See the <link
linkend="features.file-upload.put-method">PUT Method
Support</link> for more details.
</para>
<para>
A file upload screen can be built by creating a special form which
looks something like this:
<example>
<title>File Upload Form</title>
<programlisting>
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_"
METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE"
value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
</programlisting>
</example>
The _URL_ should point to a PHP file. The MAX_FILE_SIZE hidden
field must precede the file input field and its value is the
maximum filesize accepted. The value is in bytes.
</para>
<para>
In PHP 3, the following variables will be defined within the
destination script upon a successful upload, assuming that <link
linkend="ini.register-globals">register_globals</link> is turned
on in <filename>php3.ini</filename>. If <link
linkend="ini.track-vars">track_vars</link> is turned on, they will
also be available in PHP 3 within the global array
<varname>$HTTP_POST_VARS</varname>. Note that the following
variable names assume the use of the file upload name 'userfile',
as used in the example above:
<itemizedlist>
<listitem>
<simpara>
<varname>$userfile</varname> - The temporary filename in which
the uploaded file was stored on the server machine.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_name</varname> - The original name or path
of the file on the sender's system.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_size</varname> - The size of the uploaded
file in bytes.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_type</varname> - The mime type of the file
if the browser provided this information. An example would be
"image/gif".
</simpara>
</listitem>
</itemizedlist>
Note that the "$userfile" part of the above variables is
whatever the name of the INPUT field of TYPE=file is in the upload
form. In the above upload form example, we chose to call it
"userfile"
</para>
<para>
In PHP 4, the behaviour is slightly different, in that the new
global array <varname>$HTTP_POST_FILES</varname> is provided to
contain the uploaded file information. This is still only
available if <link linkend="ini.track-vars">track_vars</link> is
turned on, but <link linkend="ini.track-vars">track_vars</link> is
always turned on in versions of PHP after PHP 4.0.2.
</para>
<para>
The contents of <varname>$HTTP_POST_FILES</varname> are as
follows. Note that this assumes the use of the file upload name
'userfile', as used in the example above:
<variablelist>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term>
<listitem>
<para>
The original name of the file on the client machine.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['type']</varname></term>
<listitem>
<para>
The mime type of the file, if the browser provided this
information. An example would be
<literal>"image/gif"</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['size']</varname></term>
<listitem>
<para>
The size, in bytes, of the uploaded file.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['tmp_name']</varname></term>
<listitem>
<para>
The temporary filename of the file in which the uploaded file
was stored on the server.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Files will by default be stored in the server's default temporary
directory, unless another location has been given with the <link
linkend="ini.upload-tmp-dir">upload_tmp_dir</link> directive in
<filename>php.ini</filename>. The server's default directory can
be changed by setting the environment variable
<envar>TMPDIR</envar> in the environment in which PHP runs.
Setting it using <function>putenv</function> from within a PHP
script will not work. This environment variable can also be used
to make sure that other operations are working on uploaded files,
as well.
<example>
<title>Validating file uploads</title>
<para>
The following examples are for versions of PHP 3 greater than
3.0.16, and versions of PHP 4 greater than 4.0.2. See the
function entries for <function>is_uploaded_file</function> and
<function>move_uploaded_file</function>.
</para>
<programlisting role="php">
<?php
if (is_uploaded_file($userfile)) {
copy($userfile, "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack: filename '$userfile'.";
}
/* ...or... */
move_uploaded_file($userfile, "/place/to/put/uploaded/file");
?>
</programlisting>
<para>
For earlier versions of PHP, you'll need to do something like
the following.
<note>
<para>
This will <emphasis>not</emphasis> work in versions of PHP 4
after 4.0.2. It depends on internal functionality of PHP which
changed after that version.
</para>
</note>
</para>
<programlisting role="php">
<?php
/* Userland test for uploaded file. */
function is_uploaded_file($filename) {
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname(tempnam('', ''));
}
$tmp_file .= '/' . basename($filename);
/* User might have trailing slash in php.ini... */
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}
if (is_uploaded_file($userfile)) {
copy($userfile, "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack: filename '$userfile'.";
}
?>
</programlisting>
</example>
</para>
<simpara>
The PHP script which receives the uploaded file should implement
whatever logic is necessary for determining what should be done
with the uploaded file. You can for example use the
<varname>$file_size</varname> variable to throw away any files
that are either too small or too big. You could use the
<varname>$file_type</varname> variable to throw away any files
that didn't match a certain type criteria. Whatever the logic,
you should either delete the file from the temporary directory or
move it elsewhere.
</simpara>
<simpara>
The file will be deleted from the temporary directory at the end
of the request if it has not been moved away or renamed.
</simpara>
</sect1>
<sect1 id="features.file-upload.common-pitfalls">
<title>Common Pitfalls</title>
<simpara>
The MAX_FILE_SIZE item cannot specify a file size greater than the file
size that has been set in the upload_max_filesize in the PHP 3.ini file
or the corresponding php3_upload_max_filesize Apache .conf directive.
The default is 2 Megabytes.
</simpara>
<simpara>
Not validating which file you operate on may mean that users can access
sensitive information in other directories.
</simpara>
<simpara>
Please note that the CERN httpd seems to strip off everything
starting at the first whitespace in the content-type mime header
it gets from the client. As long as this is the case, CERN httpd
will not support the file upload feature.
</simpara>
</sect1>
<sect1 id="feature-fileupload.multiple">
<title>Uploading multiple files</title>
<simpara>
It is possible to upload multiple files simultaneously and have
the information organized automatically in arrays for you. To
do so, you need to use the same array submission syntax in the
HTML form as you do with multiple selects and checkboxes:
</simpara>
<note>
<para>
Support for multiple file uploads was added in version 3.0.10.
</para>
</note>
<para>
<example>
<title>Uploading multiple files</title>
<programlisting>
<form action="file-upload.php" method="post"
enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Send files">
</form>
</programlisting>
</example>
</para>
<simpara>
When the above form is submitted, the arrays
<computeroutput>$userfile</computeroutput>,
<computeroutput>$userfile_name</computeroutput>, and
<computeroutput>$userfile_size</computeroutput> will be formed in
the global scope (as well as in $HTTP_POST_FILES ($HTTP_POST_VARS
in PHP 3)). Each of these will be a numerically indexed array of
the appropriate values for the submitted files.
</simpara>
<simpara>
For instance, assume that the filenames
<filename>/home/test/review.html</filename> and
<filename>/home/test/xwp.out</filename> are submitted. In this
case, <computeroutput>$userfile_name[0]</computeroutput> would
contain the value <computeroutput>review.html</computeroutput>,
and <computeroutput>$userfile_name[1]</computeroutput> would
contain the value
<computeroutput>xwp.out</computeroutput>. Similarly,
<computeroutput>$userfile_size[0]</computeroutput> would contain
<filename>review.html</filename>'s filesize, and so forth.
</simpara>
<simpara>
<computeroutput>$userfile['name'][0]</computeroutput>,
<computeroutput>$userfile['tmp_name'][0]</computeroutput>,
<computeroutput>$userfile['size'][0]</computeroutput>, and
<computeroutput>$userfile['type'][0]</computeroutput> are also set.
</simpara>
</sect1>
<sect1 id="features.file-upload.put-method">
<title>PUT method support</title>
<para>
PHP provides support for the HTTP PUT method used by clients such
as Netscape Composer and W3C Amaya. PUT requests are much simpler
than a file upload and they look something like this:
<informalexample>
<programlisting>
PUT /path/filename.html HTTP/1.1
</programlisting>
</informalexample>
</para>
<para>
This would normally mean that the remote client would like to save
the content that follows as: /path/filename.html in your web tree.
It is obviously not a good idea for Apache or PHP to automatically
let everybody overwrite any files in your web tree. So, to handle
such a request you have to first tell your web server that you
want a certain PHP script to handle the request. In Apache you do
this with the <emphasis>Script</emphasis> directive. It can be
placed almost anywhere in your Apache configuration file. A
common place is inside a <Directory> block or perhaps inside
a <Virtualhost> block. A line like this would do the trick:
<informalexample>
<programlisting>
Script PUT /put.php3
</programlisting>
</informalexample>
</para>
<simpara>
This tells Apache to send all PUT requests for URIs that match the
context in which you put this line to the put.php3 script. This
assumes, of course, that you have PHP enabled for the .php3
extension and PHP is active.
</simpara>
<simpara>
Inside your put.php3 file you would then do something like this:
</simpara>
<para>
<informalexample><programlisting>
<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>
</programlisting></informalexample>
</para>
<simpara>
This would copy the file to the location requested by the remote
client. You would probably want to perform some checks and/or
authenticate the user before performing this file copy. The only
trick here is that when PHP sees a PUT-method request it stores
the uploaded file in a temporary file just like those handled but
the <link
linkend="features.file-upload.post-method">POST-method</link>.
When the request ends, this temporary file is deleted. So, your
PUT handling PHP script has to copy that file somewhere. The
filename of this temporary file is in the $PHP_PUT_FILENAME
variable, and you can see the suggested destination filename in
the $REQUEST_URI (may vary on non-Apache web servers). This
destination filename is the one that the remote client specified.
You do not have to listen to this client. You could, for example,
copy all uploaded files to a special uploads directory.
</simpara>
</sect1>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/http-auth.xml
+++ phpdoc/hk/features/http-auth.xml
<chapter id="features.http-auth">
<title>HTTP authentication with PHP</title>
<simpara>
The HTTP Authentication hooks in PHP are only available when it is
running as an Apache module and is hence not available in the CGI version.
In an Apache module PHP script, it is possible to use the
<function>Header</function> function to send an "Authentication Required"
message to the client browser causing it to pop up a Username/Password
input window. Once the user has filled in a username and a password,
the URL containing the PHP script will be called again with the variables,
$PHP_AUTH_USER, $PHP_AUTH_PW and $PHP_AUTH_TYPE set to the user
name, password and authentication type respectively. Only "Basic"
authentication is supported at this point. See the <function>Header</function>
function for more information.</simpara>
<para>
An example script fragment which would force client authentication
on a page would be the following:
<example>
<title>HTTP Authentication example</title>
<programlisting role="php">
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;
} else {
echo "Hello $PHP_AUTH_USER.<P>";
echo "You entered $PHP_AUTH_PW as your password.<P>";
}
?>
</programlisting>
</example></para>
<para>
Instead of simply printing out the $PHP_AUTH_USER and
$PHP_AUTH_PW, you would probably want to check the username and
password for validity. Perhaps by sending a query to a database,
or by looking up the user in a dbm file.</para>
<para>
Watch out for buggy Internet Explorer browsers out there. They
seem very picky about the order of the headers. Sending the
<emphasis>WWW-Authenticate</emphasis> header before the
<errorcode>HTTP/1.0 401</errorcode> header seems to do the trick
for now.</para>
<simpara>
In order to prevent someone from writing a script which reveals
the password for a page that was authenticated through a
traditional external mechanism, the PHP_AUTH variables will not be
set if external authentication is enabled for that particular
page. In this case, the $REMOTE_USER variable can be used to
identify the externally-authenticated user.</simpara>
<simpara>
Note, however, that the above does not prevent someone who
controls a non-authenticated URL from stealing passwords from
authenticated URLs on the same server.</simpara>
<simpara>
Both Netscape Navigator and Internet Explorer will clear the local browser
window's authentication cache for the realm upon receiving a
server response of 401. This can effectively "log out" a user,
forcing them to re-enter their username and password. Some people
use this to "time out" logins, or provide a "log-out" button.</simpara>
<simpara></simpara>
<example>
<title>HTTP Authentication example forcing a new name/password</title>
<programlisting role="php">
<?php
function authenticate() {
Header( "WWW-authenticate: basic realm=\"Test Authentication
System\"");
Header( "HTTP/1.0 401 Unauthorized");
echo "You must enter a valid login ID and password to access
this resource\n";
exit;
}
if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth,
$PHP_AUTH_USER)) ) {
authenticate();
}
else {
echo "Welcome: $PHP_AUTH_USER<BR>";
echo "Old: $OldAuth";
echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\"
VALUE=\"1\">\n";
echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\"
VALUE=\"$PHP_AUTH_USER\">\n";
echo "<INPUT TYPE=Submit VALUE=\"Re
Authenticate\">\n";
echo "</FORM>\n";
}
?>
</programlisting>
</example>
<simpara>
This behavior is not required by the HTTP Basic authentication
standard, so you should never depend on this. Testing with Lynx
has shown that Lynx does not clear the authentication credentials
with a 401 server response, so pressing back and then forward
again will open the resource as long as the credential
requirements haven't changed. The user can press the
'_' key to clear their authentication information, however.
</simpara>
<simpara>
Also note that this does not work using Microsoft's IIS server and
the CGI version of PHP due to a limitation of IIS.
</simpara>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/images.xml
+++ phpdoc/hk/features/images.xml
<chapter id="features.images">
<title>Creating and manipulating images</title>
<simpara>
PHP is not limited to creating just HTML output. It can also be
used to create and manipulate image files in a variety of different
image formats, including gif, png, jpg, wbmp, and xpm. Even more
convenient, php can output image streams directly to a browser. You
will need to compile PHP with the GD library of image functions for
this to work. GD and PHP may also require other libraries, depending
on which image formats you want to work with. GD stopped supporting
Gif images in version 1.6.
</simpara>
<para>
<example>
<title>PNG creation with PHP</title>
<programlisting role="php">
<?php
Header("Content-type: image/png");
$string=implode($argv," ");
$im = imageCreateFromPng("images/button1.png");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImagePng($im);
ImageDestroy($im);
?>
</programlisting>
</example>
This example would be called from a page with a tag like: <img
src="button.php?text"> The above button.php script
then takes this "text" string an overlays it on top of a
base image which in this case is "images/button1.png"
and outputs the resulting image. This is a very convenient way to
avoid having to draw new button images every time you want to
change the text of a button. With this method they are
dynamically generated.
</para>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/persistent-connections.xml
+++ phpdoc/hk/features/persistent-connections.xml
<chapter id="features.persistent-connections">
<title>Persistent Database Connections</title>
<simpara>
Persistent connections are SQL links that do not close when the
execution of your script ends. When a persistent connection is
requested, PHP checks if there's already an identical persistent
connection (that remained open from earlier) - and if it exists, it
uses it. If it does not exist, it creates the link. An 'identical'
connection is a connection that was opened to the same host, with
the same username and the same password (where applicable).
</simpara>
<simpara>
People who aren't thoroughly familiar with the way web servers work
and distribute the load may mistake persistent connects for what
they're not. In particular, they do <emphasis>not</emphasis> give
you an ability to open 'user sessions' on the same SQL link, they
do <emphasis>not</emphasis> give you an ability to build up a
transaction efficently, and they don't do a whole lot of other
things. In fact, to be extremely clear about the subject,
persistent connections don't give you <emphasis>any</emphasis>
functionality that wasn't possible with their non-persistent
brothers.
</simpara>
<simpara>
Why?
</simpara>
<simpara>
This has to do with the way web servers work. There are three ways
in which your web server can utilize PHP to generate web pages.
</simpara>
<simpara>
The first method is to use PHP as a CGI "wrapper". When run this
way, an instance of the PHP interpreter is created and destroyed
for every page request (for a PHP page) to your web server.
Because it is destroyed after every request, any resources that it
acquires (such as a link to an SQL database server) are closed when
it is destroyed. In this case, you do not gain anything from trying
to use persistent connections -- they simply don't persist.
</simpara>
<simpara>
The second, and most popular, method is to run PHP as a module in a
multiprocess web server, which currently only includes Apache. A
multiprocess server typically has one process (the parent) which
coordinates a set of processes (its children) who actually do the
work of serving up web pages. When each request comes in from a
client, it is handed off to one of the children that is not already
serving another client. This means that when the same client makes
a second request to the server, it may be serviced by a different
child process than the first time. What a persistent connection
does for you in this case it make it so each child process only
needs to connect to your SQL server the first time that it serves a
page that makes us of such a connection. When another page then
requires a connection to the SQL server, it can reuse the
connection that child established earlier.
</simpara>
<simpara>
The last method is to use PHP as a plug-in for a multithreaded web
server. Currently PHP 4 has support for ISAPI, WSAPI, and NSAPI (on
Windows), which all allow PHP to be used as a plug-in on multithreaded
servers like Netscape FastTrack, Microsoft's Internet Information
Server (IIS), and O'Reilly's WebSite Pro. The behavior is essentially
the same as for the multiprocess model described before. Note that
SAPI support is not available in PHP 3.
</simpara>
<simpara>
If persistent connections don't have any added functionality, what
are they good for?
</simpara>
<simpara>
The answer here is extremely simple -- efficiency. Persistent
connections are good if the overhead to create a link to your SQL
server is high. Whether or not this overhead is really high depends
on many factors. Like, what kind of database it is, whether or not
it sits on the same computer on which your web server sits, how
loaded the machine the SQL server sits on is and so forth. The
bottom line is that if that connection overhead is high, persistent
connections help you considerably. They cause the child process to
simply connect only once for its entire lifespan, instead of every
time it processes a page that requires connecting to the SQL
server. This means that for every child that opened a persistent
connection will have its own open persistent connection to the
server. For example, if you had 20 different child processes that
ran a script that made a persistent connection to your SQL server,
you'd have 20 different connections to the SQL server, one from
each child.
</simpara>
<simpara>
Note, however, that this can have some drawbacks if you are using a
database with connection limits that are exceeded by persistant
child connections. If your database has a limit of 16 simultaneous
connections, and in the course of a busy server session, 17 child
threads attempt to connect, one will not be able to. If there are
bugs in your scripts which do not allow the connections to shut
down (such as infinite loops), a database with only 32 connections
may be rapidly swamped. Check your database documentation for
information on handling abandoned or idle connections.
</simpara>
<simpara>
An important summary. Persistent connections were designed to have
one-to-one mapping to regular connections. That means that you
should <emphasis>always</emphasis> be able to replace persistent
connections with non-persistent connections, and it won't change
the way your script behaves. It <emphasis>may</emphasis> (and
probably will) change the efficiency of the script, but not its
behavior!
</simpara>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
Index: phpdoc/hk/features/remote-files.xml
+++ phpdoc/hk/features/remote-files.xml
<chapter id="features.remote-files">
<title>Using remote files</title>
<para>
As long as support for the "URL fopen wrapper" is enabled when
you configure PHP (which it is unless you explicitly pass the
<option>--disable-url-fopen-wrapper</option> flag to configure (for versions
up to 4.0.3) or set <parameter>allow_url_fopen</parameter> to off in php.ini
(for newer versions),
you can use HTTP and FTP URLs with most functions that take a
filename as a parameter, including the <function>require</function>
and <function>include</function> statements.
</para>
<para>
<note>
<para>
You can't use remote files in <function>include</function> and
<function>require</function> statements on Windows.
</para>
</note>
</para>
<para>
For example, you can use this to open a file on a remote web server,
parse the output for the data you want, and then use that data in a
database query, or simply to output it in a style matching the rest
of your website.
</para>
<para>
<example>
<title>Getting the title of a remote page</title>
<programlisting role="php">
<![CDATA[
<?php
$file = fopen ("http://www.php.net/", "r");
if (!$file) {
echo "<p>Unable to open remote file.\n";
exit;
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
/* This only works if the title and its tags are on one line */
if (eregi ("<title>(.*)</title>", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
]]>
</programlisting>
</example>
</para>
<para>
You can also write to files on an FTP as long you connect as a user
with the correct access rights, and the file doesn't exist already.
To connect as a user other than 'anonymous', you need to specify
the username (and possibly password) within the URL, such as
'ftp://user:[EMAIL PROTECTED]/path/to/file'. (You can use the
same sort of syntax to access files via HTTP when they require Basic
authentication.)
</para>
<para>
<example>
<title>Storing data on a remote server</title>
<programlisting role="php">
<![CDATA[
<?php
$file = fopen ("ftp://ftp.php.net/incoming/outputfile", "w");
if (!$file) {
echo "<p>Unable to open remote file for writing.\n";
exit;
}
/* Write the data here. */
fputs ($file, "$HTTP_USER_AGENT\n");
fclose ($file);
?>
]]>
</programlisting>
</example>
</para>
<para>
<note>
<para>
You might get the idea from the example above to use this
technique to write to a remote log, but as mentioned above, you
can only write to a new file using the URL fopen() wrappers. To
do distributed logging like that, you should take a look at
<function>syslog</function>.
</para>
</note>
</para>
</chapter>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->