PHP - Web Developement

0 views
Skip to first unread message

Maui Web Designer

unread,
May 13, 2005, 6:59:36 PM5/13/05
to Maui-...@googlegroups.com
Find PHP Develpers for Maui Web Design at http://www.nemonetworks.net

PHP
(PHP Hypertext Preprocessor) A scripting language used to create
dynamic Web pages. With syntax from C, Java and Perl, PHP code is
embedded within HTML pages for server side execution. It is commonly
used to extract data out of a database and present it on the Web page.
NT/2000 and Unix Web servers support the language, and it is widely
used with the mSQL database. PHP was originally known as "Personal Home
Page." See mSQL.


Investment

PHP
In currencies, this is the abbreviation for the Philippine Peso.

Investopedia Says: The currency market, also known as the Foreign
Exchange market, is the largest financial market in the world, with a
daily average volume of over US $1 trillion.

See Also: Currency, FOREX, Hard Currency, Money


Acronyms

PHP is an acronym for:
Meaning Category
Hypertext Preprocessor Computing->Databases
Parents Helping Parents Community
Partial Hospitalization Program Computing->File Extensions
Paul Hagan Productions Business->Firms
Peace Happiness And Prosperity Community->Religion
People Hate Perl Miscellaneous->Funnies
People Have Posted Internet->Chat
People Help People Community
Personal Handy Phone Academic & Science->Electronics
Personal Home Page Internet
Philip, South Dakota USA Regional->Airport Codes
Philippine Peso Regional->Currencies
Photon Hypermega Phasor Internet->Wannas
Pretty Hot Programmer Miscellaneous->Funnies
Push Harder Please Computing->SMS


Click here to submit an acronym.


Wikipedia

PHP
For the "PHP" Cold War history project, see Parallel History Project.

PHP logoPHP is a widely-used open-source programming language primarily
for server-side applications and developing dynamic web content, and
more recently, other software. The name is a recursive acronym for
"PHP: Hypertext Preprocessor". (This is actually a retronym; see
history.)

Famous examples of PHP applications include phpBB and MediaWiki, the
software behind Wikipedia. The PHP model can be seen as an alternative
to Microsoft's ASP.NET/C#/VB.NET system, Macromedia's ColdFusion
system, Sun Microsystems' JSP/Java system, and to the CGI/Perl system.


Overview
PHP's ease of use and similarity with the most common structured
programming languages-most notably C and Perl (and from version 5,
Java)-allows most experienced programmers to start developing complex
applications with a minimal learning curve. It also enables experienced
developers to get involved with dynamic web content applications
without having to learn a whole new set of functions and practices.

One of the more attractive parts of PHP is that it is more than just a
scripting language. Due to its modular design, PHP is also used to
develop GUI applications (using PHP-GTK), and can be used from the
command line just like Perl or Python.

PHP allows interaction with a large number of relational database
management systems, such as MySQL, Oracle, IBM DB2, Microsoft SQL
Server, PostgreSQL and SQLite while maintaining a simple and
straightforward syntax. PHP runs on most major operating systems,
including UNIX, Linux, Windows, and Mac OS X, and can interact with
many major web servers. The official PHP website (http://www.php.net/)
contains extensive documentation (http://www.php.net/manual/). The
Linux, Apache, MySQL, PHP (LAMP) architecture has become popular in the
Web industry as a way of deploying inexpensive, reliable, scalable,
secure web applications. (The 'P' in LAMP can also stand for Perl or
Python.)

PHP is the result of the collective efforts of many contributors. It is
licensed under a BSD-style license, the PHP license. PHP, from version
4, has been powered by the Zend engine.


History
PHP was originally designed as a small set of Perl scripts, followed by
a rewritten set of CGI binaries written in C by Rasmus Lerdorf in 1994
to display his résumé and collect some data, such as how many hits it
was generating. Others first used "Personal Home Page Tools" in 1995,
when Lerdorf had combined it with his own Form Interpreter to create
PHP/FI. Zeev Suraski and Andi Gutmans, two Israeli developers of the
Technion - Israel Institute of Technology, rewrote the parser in 1997
and formed the base of PHP 3. They also changed the name to its current
recursive form. After months in beta, the development team officially
released PHP/FI 2 in November 1997. Public testing of PHP 3 began
immediately and the official launch came in June 1998. Suraski and
Gutmans then started a new rewrite of PHP's core, producing the Zend
engine in 1999 (a page at www.zend.com
(http://www.zend.com/zend/zend-engine-summary.php) states that PHP 3
was powered by Zend Engine 0.5). They also founded Zend Technologies in
Ramat Gan, Israel which has since overseen the PHP advances. In May
2000, PHP 4, powered by the Zend Engine 1.0, was released. On July 13,
2004, PHP 5 was released, powered by Zend Engine II (formerly known as
Zend Engine 2).


Popularity
PHP is currently one of the most popular server-side scripting systems
on the Web. It has been widely adopted since the release of version 4.

One major part of PHP which has helped it become popular is that it is
a very loose language; in particular, it is dynamically typed. That is,
the rules aren't as strict with variables-they don't have to be
declared and they can hold any type of object. Further, unlike many
other languages (like C++ and Java), arrays are able to hold objects of
varying types, including other arrays.

According to Netcraft's April 2002 survey, PHP is now the most deployed
server-side scripting language, running on around 9 of the 37 million
domains in their survey. This is confirmed by PHP's own figures, which
show PHP usage (measured on a per-domain basis) growing at around 5%
per month. In May 2003, almost 13 million domains were using PHP, based
on the same source.[1] (http://www.php.net/usage.php)

Due to PHP's popularity, a new breed of programmer has emerged-one
who is familiar only with PHP, which in turn forced open the door
toward a command line interface for PHP, along with support for GUI
library such as GTK+ and text mode libraries like Ncurses and Newt.
This is a major step for PHP, because it represents its adoption as a
genuine programming language (that is, running autonomously on a
stand-alone machine, as opposed to its original purpose of serving web
pages to client machines from a server).

Many PHP programmers have reported having had trouble trying to learn
other languages in the past and ultimately giving up after each attempt
until attempting to learn PHP. The ease of programming in PHP has made
it so these programmers are able to learn the basics of programming and
are then able to continue on to other languages suchs as C/C++ or
Perl/Python/Java and then finding themselves back programming in PHP
for its speed of development in comparison to other languages.


Code example
Here is a Hello World code example: [2]
(http://php.net/manual/en/language.basic-syntax.php)


<?php
echo "Hello, world!\n";
// "\n" = newline. It does not work like <br />, and
// the client can only see that it looks like "enter" (return)
// has been pressed in the code.
// to convert newlines to <br /> (perhaps in a $_POST variable)
// use nl2br()
?>

Here is an example that prints out the lyrics for the song 99 Bottles
of Beer:


<?php
/*
* /* ... */ is a comment that can span one or many lines.
* This kind of comment does not need stars (*) in the beginning of
each line,
* but including them is a common practice. // and # are also
comments.
* They only comment the text that are after them in the same line.
They have
* no special ending character.
*
*/

/*
* First we define a new function called "plural".
* It will return an "s" if the argument passed to it was any other
* than number 1.
*/

function plural($number) {
return ($number != 1 ? "s" : "");
// The ternary ?: operator is similar to if-else: (test_condition ?
true : false)
// In this case it's used to return "" (void) for one and "s" for
all other numbers
}

// We define a variable called $lb to contain an HTML line break
// as well as a carriage return and line feed:
$lb = "<br />\r\n";

// Be sure to count DOWN
for ($i = 99; $i > 0; $i--) {
echo $i . " bottle" . plural($i) . " of beer on the wall," . $lb;
// We don't actually need a new echo for each line. Let's see:
echo $i . " bottle" . plural($i) . " of beer." . $lb . "
Take one down, pass it around," . $lb .
($i - 1 != 0 ? $i - 1 : "No more") .
" bottle" . plural($i - 1) . " of beer on the wall" . $lb .
$lb;
}

echo "Go to the store," . $lb . "buy some more," . $lb .
"99 bottles of beer on the wall!";

?>

Notes:

PHP allows the placement of strings on multiple lines, as long as it
eventually finds a semicolon (;) to terminate it. [3]
(http://php.net/manual/en/language.basic-syntax.instruction-separation.php)

A period (.) concatenates strings together. [4]
(http://php.net/manual/en/language.types.string.php)
Variables always have names that start with a dollar sign ($), and are
parsed inside double quotation marks ("), but not inside single
quotation marks ('). (that is not always required, but is recommended)
Functions, such as plural(), are never parsed inside any sort of string
(but you can separate the function from the string with the period
"string concatenation" operator).
EX:

$var = "string" . function() . "rest of string";

[5] (http://php.net/manual/en/language.variables.php)

Although PHP allows both # and // for "same line" comments, it is
generally preferred to use the C-style // and not the Perl-style #. [6]
(http://us2.php.net/manual/en/language.basic-syntax.comments.php)
For output, this program uses echo. print and printf may also be used
for this purpose.

Libraries
PHP includes a large number of free and open-source libraries with the
core build. PHP is a fundamentally Internet-aware system with modules
built in for accessing FTP servers, many database servers, embedded SQL
libraries like embedded MySQL and SQLite, LDAP servers, and others.
Many functions familiar to C programmers such as the printf family are
available in the standard PHP build.

PHP extensions exist which, among other features, add support for the
Windows API, process management on UNIX-like operating systems, cURL,
and the ZIP/gzip/bzip2/rar/lzf compression formats. Some of the more
unusual features are on-the-fly Macromedia Flash generation,
integration with Internet relay chat, and generation of dynamic images
(where the content of the image can be changed). Some additional
extensions are available via the PHP Extension Community Library
(PECL).

This is the present list of all officially documented libraries:

Apache
BCMath
Bzip2
Calendars
CCVS
COM
ClibPDF
cURL
Cybercash
dBase
DBM
dbx
DB++
LDAP
DNS
DOM XML
.NET
FrontBase
filePro
FriBiDi
FTP
Gettext
GD Graphics Library
GNU Multi-Precision Library
Hyperwave
iconv
IMAP, POP3 and NNTP
Informix
Ingres II
InterBase
IRC
Javax
Lotus Notes
mailparse
MCAL
Mcrypt
MCVE
Mhash
Mimetype Functions
MS-SQL
Ming
mnoGoSearch
mSQL
MySQL
Mowhawk
muscat
Ncurses
ODBC
Oracle
OpenSSL
Ovrimos SQL
PDF
PayFlow Pro
PDO
POSIX
PostgreSQL
Printer
Pspell
GNU Readline
GNU Recode
Regular expressions
QT-Dom
Semaphores
SESAM
Session Handling
Shared Memory
SMTP
SNMP
Sockets
SimpleXML
SQLite
Streams
Sybase
Token
vpopmail
WDDX
Win32 API
XML (Expat)
XML-RPC
XSLT
YAZ
Yellow Pages / NIS
ZIP
Zlib


(Source: PHP.net manual (http://www.php.net/manual/en/))


Object-oriented programming
Up until version 3, PHP had no object-oriented features. In version 3
basic object functionality was added. The same semantics were
implemented in PHP 4 as well as pass-by-reference and
return-by-reference for objects but the implementation still lacked the
powerful and useful features of other object-oriented languages like
C++ and Java.

In version 5, which was released in July 2004, PHP's object-oriented
functionality has been very much enhanced and is more robust and
complete. Here is a summary of some of the changes in PHP 5 (powered by
Zend Engine II (http://www.zend.com/php5/)):

New Object Model - PHP's handling of objects has been completely
rewritten, allowing for better performance and more features. In
previous versions of PHP, objects were handled like primitive types
(for instance integers and strings). The drawback of this method was
that semantically the whole object was copied when a variable was
assigned, or passed as a parameter to a method. In the new approach,
objects are referenced by handle, and not by value (one can think of a
handle as an object's identifier).
Private and Protected Members - PHP 5 introduces private and
protected member variables, they allow you to define the visibility of
class properties.
Private and Protected Methods - Private and protected methods are
also introduced.
Abstract Classes and Methods - PHP 5 also introduces abstract classes
and methods. An abstract method only declares the method's signature
and does not provide an implementation. A class that contains abstract
methods needs to be declared abstract.
Interfaces - A class may implement an arbitrary list of interfaces.
Object Cloning - If the developer asks to create a copy of an object
by using the reserved word clone, the Zend engine will check if a
__clone() method has been defined or not. If not, it will call a
default __clone() which will copy all of the object's properties. If a
__clone() method is defined, then it will be responsible to set the
necessary properties in the created object. For convenience, the engine
will supply a function that imports all of the properties from the
source object, so that they can start with a by-value replica of the
source object, and only override properties that need to be changed.
Unified Constructors - PHP 5 introduces a standard way of declaring
constructor methods by calling them by the name __construct().
Destructors - PHP 5 introduces a destructor concept similar to that
of other object-oriented languages, such as Java: When the last
reference to an object is destroyed, the object's destructor (a class
method named __destruct() that receives no parameters) is called before
the object is freed from memory.
Exceptions - PHP 4 had no exception handling. PHP 5 introduces an
exception model similar to that of other programming languages.
More additions and examples of the additions mentioned above are
available in the Classes and Objects chapter
(http://php.net/manual/en/language.oop5.php) of the PHP 5 manual.

It is should be noted that the static method and class variable
features in Zend Engine 2 do not work the way some expect. There is no
virtual table feature in the Engine, so the static variables are bound
with a name at compile time instead of with a reference. This can lead
to unexpected behavior, if you do not understand this.

Here is an example of creating an object:


<?php
class Car() {
var $miles;//variable that can be accesed outside the class

function Car($param) { //is called when class "Car" is created
dosomething($param);
}

function startcar() {
startthecar();
}

function stopcar() {
stopthecar();
}

function miles {
return $this->miles;
}
}

$car = new Car($param);
echo $car->miles; //echos the value of the property "miles" of the
class "Car"
?>

For more on PHP's OOP abilities, see:

PHP.net OOP Section (http://us3.php.net/manual/en/language.oop.php)
Spoono OOP Tutorial
(http://www.spoono.com/php/tutorials/tutorial.php?id=27)
PHP Freaks OOP Tutorial (http://www.phpfreaks.com/tutorials/48/0.php)
Guru's Network OOP Tutorial
(http://www.gurusnetwork.com/tutorial/oop_php/)

Criticism
Criticism of PHP includes those general criticisms ascribed to other
scripting programming languages and dynamically typed languages. In
addition, specific criticism of PHP includes:


Syntax
PHP does not enforce the declaration of variables, and variables that
have not been initialized can have operations (such as concatenation)
performed on them; however, an operation on an uninitialized variable
does raise an E_NOTICE level error, errors that are hidden by default.
This leads to security holes with register_globals (not on by default),
as mentioned below. See also error_reporting()
(http://php.net/manual/en/function.error-reporting.php).
Within sections of the built-in function selection there is little or
no consistency regarding argument order (examples: order of subject
array and other data for array handling functions, order of needle and
haystack in various search functions).

Built-in functions
Built-in function names have no standard form, with some employing
underscores (strip_tags) while others do not (stripslashes). Although
all new functions do follow a naming standard, old names remain for
backward compatibility reasons.
Some functions have inconsistent output. Statements like This function
may return Boolean FALSE, but may also return a non-Boolean value which
evaluates to FALSE, such as 0 or "". can be found in the documentation
(http://php.net/manual/en/function.strpos.php). This is related to
PHP's dynamic typing. A workaround is using strict (===) type checking
as opposed to loose (==). See also the manual on type juggling
(http://php.net/manual/en/language.types.type-juggling.php).
In some areas the selection of built-in functions is notably incomplete
(supplying intersection and union functions, but no full difference
function, for example).
The number of built-in functions is said to be too numerous, with many
functions performing the same actions, but with just slightly different
data, results, etc. This is said to make it difficult to program in the
language without the frequent consultation of a reference work.
There are over 3,000 functions, sharing the same global namespace. Most
functions are not enabled by default; available functions depend on the
configuration options.
Some default settings and features are said to be confusing and the
cause of frequent errors.
There is a "magic quotes" feature that inserts backslashes into user
input strings. The feature was introduced to reduce code written by
beginners from being dangerous (such as in SQL injection attacks), but
some criticize it as a frequent cause of improperly displayed text or
encouraging beginners to write PHP which is vulnerable to SQL_injection
when used on a system with it turned off. (Always be sure to check for
"magic-quotes": get_magic_quotes_gpc(); and to unset
"magic-quotes-runtime": set_magic_quotes_runtime(0);.) For more
information, see the security section in the Magic Quotes chapter
(http://php.net/manual/en/security.magicquotes.php) of the PHP manual.

Security
If register_globals
(http://php.net/manual/en/ini.sect.data-handling.php#ini.register-globals)
is enabled in PHP's configuration file, users could cause harm by
manipulating poorly written code. As of version 4.2.0
(http://php.net/release_4_2_0.php) register_globals defaults to off.
For more information, see the security section in the Using Register
Globals chapter (http://php.net/manual/en/security.globals.php) of the
PHP manual.
Other languages, such as ASP.NET, include functionality to detect and
clean harmful cross-site scripting or other malicious code
automatically, whereas PHP does not. See also strip_tags()
(http://php.net/manual/en/function.strip-tags.php).
In the majority of cases, Linux and Unix webservers with PHP installed
(using mod_php) typically run PHP scripts as "nobody", which can make
file security in a shared hosting environment difficult.
PHP has no variable tainting
(http://gunther.web66.com/FAQS/taintmode.html) mechanism (which is very
useful for a language designed to accept and process untrusted input.)

Miscellaneous
Error messages are said to be confusing. This is a common criticism
levelled at many programming languages. The error messages generated by
PHP are easier to comprehend than those of Perl. [7]
(http://www.javascriptkit.com/howto/phpcgi.shtml) For further
information, see the manual section on PHP parser tokens
(http://php.net/manual/en/tokens.php).
The many settings in the PHP interpreter's configuration file (php.ini)
mean that code that works with one installation of PHP might not work
with another. For example, if code is written to work with
register_globals turned on, it won't work on another system that has
register_globals turned off. This makes it necessary to write code that
is cross-platform compatible by assuming that register_globals will be
off and therefore calling a global variable with its prefix in front of
its name, such as $_POST['variable'], $_SERVER['variable'] and
$_COOKIE['variable']-not, simply, $variable. For more information,
see the manual page on using external variables
(http://php.net/manual/en/language.variables.external.php).
Some PHP extensions use libraries that are not threadsafe, hence
rendering with Apache 2's Multithreaded MPM
(http://httpd.apache.org/docs-2.0/mpm.html) (multi-processing module)
may cause crashes.

Support
PHP is self-supporting with respect to user support. Direct, one-to-one
help is frequently provided free of charge through all of these and
other media. PHP users assist each other through various media such as
chat, forums, newsgroups and PHP developer web sites. In turn, the PHP
development team actively participates in such communities, garnering
assistance from them in their own development effort (PHP itself) and
providing assistance to them as well. There are many help resources
available for the novice PHP programmer.

These resources include:

Online Forums
Official PHP Support Page (http://php.net/support.php)
php.net's manual (http://www.php.net/manual/en/), which also contains
user-contributed notes at the bottom of each manual page.
Devshed (http://forums.devshed.com)
PHPBuilder (http://www.phpbuilder.com)
Listservs/Mailing_lists
PHP mailing lists (http://www.php.net/mailing-lists.php)
PHP.net's news server (news://news.php.net/)
Newsgroups/Usenet
The group comp.lang.php
Chat / IRC
IRC channels #php and #phphelp on EFNet, IRCNet, DALnet and other
networks.
Other IRC channels include #php (irc://irc.freenode.net/php) and
#phpfreaks (irc://irc.freenode.net/phpfreaks) on freenode and #phpcafe
(irc://irc.invisionize.com/phpcafe) on irc.invisionize.com.
User Groups
There is a PHP user group registry (http://www.phpusergroups.org/).
Directory of country specific PHP user groups
(http://www.phpclasses.org/browse/group/) of the users of the PHP
Classes site

Applications built with PHP
The following is a list of notable applications developed using PHP:

Coppermine Photo Gallery - gallery software
Drupal - content management system
Gallery Project - gallery software
Invision Power Board - Internet forum software
Mambo - content management system
MediaWiki - wiki software
Moodle - e-learning platform
phpBB - Internet forum software
phpLDAPadmin - LDAP management frontend
phpMyAdmin - MySQL database management frontend
PHP-Nuke - content management system
phpPgAdmin - PostgreSQL database management frontend
PhpWiki - wiki software
PmWiki - wiki software
PostNuke - content management system
PunBB - Internet forum software
Typo3 - content management system
UBB.threads - Internet forum software
vBulletin - Internet forum software
WordPress - content management system
Xaraya - content management system
XOOPS - content management system

External links
Wikibooks has more about this subject:
PHP
PHP home site
Official PHP website (http://www.php.net/)
Selected sub-pages of php.net:
PHP license information (http://www.php.net/license/)
PHP.net domain-based graph of PHP deployment
(http://www.php.net/usage.php)
When using the PHP.net website, access the content you would like to
see quickly (http://www.php.net/urlhowto.php)
Selected sub-domains of php.net:
PHP Extension and Application Repository (http://pear.php.net/)
PHP Extension Community Library (http://pecl.php.net/)
PHP-GTK extension providing an object-oriented interface to GTK+
classes and functions (http://gtk.php.net/)

Advocacy
Experiences of Using PHP in Large Websites
(http://www.ukuug.org/events/linux2002/papers/html/php/)
Making the Case for PHP at Yahoo!
(http://public.yahoo.com/~radwin/talks/yahoo-phpcon2002.htm) -
Michael J. Radwin, Yahoo! Engineer explains why Yahoo! has chosen PHP
over Apache mod_include, ASP, ColdFusion, Perl, JSP, Servlets, J2EE,
XSLT and ClearSilver
Follow-up: One Year of PHP at Yahoo!
(http://public.yahoo.com/~radwin/talks/one-year-of-php-oscon2003.htm)
Newsforge report
(http://newsforge.com/newsforge/02/06/11/011243.shtml?tid=5) of
Netcraft web host survey that says PHP is widely used
The PHP Scalability Myth
(http://www.onjava.com/pub/a/onjava/2003/10/15/php_scalability.html)
- Jack Herrington
PHP Scales (http://shiflett.org/archive/46) - Chris Shiflett

Frameworks
Open Directory Project: PHP Frameworks
(http://www.dmoz.org/Computers/Programming/Languages/PHP/Scripts/Frameworks/)


Integrated development environments, debuggers and other tools
Open Directory Project: PHP Tools
(http://www.dmoz.org/Computers/Programming/Languages/PHP/Tools/)

Security
PHP Security Consortium (http://phpsec.org/) - International group of
PHP experts dedicated to promoting secure programming practices.
PHP Security Workbook (http://shiflett.org/php-security.pdf) - A
55-page workbook on various security topics.
WACT PHP Application Security Wiki
(http://wact.sourceforge.net/index.php/PhpApplicationSecurity) - The
Web Application Component Toolkit's wiki page on PHP security
resources.
The OWASP Top Ten Security Vulnerabilities
(http://www.sklar.com/page/article/owasp-top-ten) as applied to PHP.

Tutorials
Open Directory Project: PHP Tutorials
(http://www.dmoz.org/Computers/Programming/Languages/PHP/Tutorials/)

Articles and other resources
Codewalkers.com (http://www.codewalkers.com/) - Community based on
PHP and MySQL development.
Hotscripts.com PHP scripts for webmasters
(http://www.hotscripts.com/PHP/index.html)
PHP5: Coming Soon to a Webserver Near You
(http://www.sitepoint.com/article/1192/1) - SitePoint
(http://www.sitepoint.com) overview article about upcoming changes in
PHP5 by Harry Fuecks, July 28, 2003
PHPBuilder (http://www.phpbuilder.com/) - Online resource for PHP
developers
PHP Classes repository (http://www.phpclasses.org/) - Large
repository of ready-to-use PHP components made available by hundreds of
PHP developers in the form of source code of classes of objects
PHP Developer's Network (http://forums.devnetwork.net/) - Online
community of beginners, intermediates and advanced programmers
PHP Freaks (http://www.phpfreaks.com/) - Online resource packed with
tutorials, full scripts, and utilities.
PHP Presents (http://talks.php.net/) and PHP Conference Material Site
(http://conf.php.net/) - Sites collecting slides of talks given by
well known people from the PHP community. The former one is also known
as pres2 (version 2 of the latter).
A PHP 4 Coding Standard
(http://www.dagbladet.no/development/phpcodingstandard/)
PHP Weblog (http://www.php9.com/) - PHP developer weblog, with
articles, code tutorials, news
Practical PHP Programming (http://www.hudzilla.org/phpbook/)
Web Design Reference
(http://www.d.umn.edu/itss/support/Training/Online/webdesign/) - Huge
mega-reference (over 3,000 links) of information and articles dedicated
web design and development. The site advocates web standards,
accessibility, usability, PHP and many related topics. It features a
listserv and RSS feed for site updates

Reply all
Reply to author
Forward
0 new messages