We'll start with the creation of a very simple extension at first, which
basically does nothing more than implement a function that returns the
integer it receives as parameter. Example 46-2 shows the source.
This code contains a complete PHP module. We'll explain the source
code in detail shortly, but first we'd like to discuss the build
process. (This will allow the impatient to experiment before we
dive into API discussions.)
There are basically two ways to compile modules:
Use the provided "make" mechanism in the
ext directory, which also allows building
of dynamic loadable modules.
Compile the sources manually.
The first method should definitely be favored,
since, as of PHP 4.0, this has been standardized into a
sophisticated build process. The fact that it is so sophisticated
is also its drawback, unfortunately - it's hard to understand at
first. We'll provide a more detailed introduction to this later in
the chapter, but first let's work with the default files.
The second method is good for those who (for some reason) don't
have the full PHP source tree available, don't have access to all
files, or just like to juggle with their keyboard. These cases
should be extremely rare, but for the sake of completeness we'll
also describe this method.
Compiling Using Make.
To compile the sample sources using the standard mechanism, copy
all their subdirectories to the ext
directory of your PHP source tree. Then run
buildconf, which will create an updated
configure script containing appropriate
options for the new extension. By default, all the sample sources
are disabled, so you don't have to fear breaking your build
After you run buildconf, configure
--help shows the following additional modules:
--enable-array_experiments BOOK: Enables array experiments
--enable-call_userland BOOK: Enables userland module
--enable-cross_conversion BOOK: Enables cross-conversion module
--enable-first_module BOOK: Enables first module
--enable-infoprint BOOK: Enables infoprint module
--enable-reference_test BOOK: Enables reference test module
--enable-resource_test BOOK: Enables resource test module
--enable-variable_creation BOOK: Enables variable-creation module
The module shown earlier in Example 46-2
can be enabled with
To compile your modules manually, you need the following commands:
|Compiling||cc -fpic -DCOMPILE_DL=1 -I/usr/local/include -I.
-I.. -I../Zend -c -o <your_object_file>
|Linking||cc -shared -L/usr/local/lib -rdynamic -o
The command to compile the module simply instructs the compiler
to generate position-independent code (-fpic
omitted) and additionally defines the constant COMPILE_DL
tell the module code that it's compiled as a dynamically loadable module (the
test module above checks for this; we'll discuss it shortly). After these
options, it specifies a number of standard include paths that should be used
as the minimal set to compile the source files.
Note: All include paths in the example are
relative to the directory ext. If you're
compiling from another directory, change the pathnames
accordingly. Required items are the PHP directory, the
Zend directory, and (if necessary), the
directory in which your module resides.
The link command is also a plain vanilla command instructing linkage as a dynamic module.
You can include optimization options in the compilation
command, although these have been omitted in this example (but some are included in the makefile
template described in an earlier section).
Note: Compiling and linking manually as a
static module into the PHP binary involves very long instructions
and thus is not discussed here. (It's not very efficient to type
all those commands.)