Sure.
First to build it, you will need to check out HEAD and update
main/main.c main/SAPI.* and sapi/apache/* to the apache_hooks branch.
Now you can register handlers for any of the apache request api hooks.
Valid httpd.conf commands are:
phpRequire /path/to/file = requires a file at the beginning of an
initial apache request
phpUriHandler /path/to/file = registers a hook that will run the
specified file at the uri translation stage of the apache request
phpUriHandler Class::Method = registers a hook to run Class::Method at
the uri translation stage of the apache request
phpPostReadHandler /path/to/file = hook for post-read phase
phpPostReadHandlerMethod Class::Method
phpHeaderHandler = hook for header parsing phase
phpHeaderHandlerMethod
phpAuthHandler = hook for authentication phase
phpAuthHandlerMethod
phpAccessHandler = hook for access control phase
phpAccessHandlerMethod
phpTypeHandler = hook for Type Checking phase
phpTypeHandlerMethod
phpFixupHandler = hook for 'fixup' phase
phpFixupHandlerMethod
phpLoggerHandler = hook for logging phase
phpLoggerHandlerMethod
AddHandler php-script = set's up a special type handler
phpResponseHandler /path/to/file = sets file to be called to handle
response phase
phpResponseHandlerMethod Class::Method
So, to set up a 'hello world' location handler (so that any request to
/hello/* returns hello world) you can:
phpRequire /tmp/setup.php
Location /hello
AddHandler php-script
phpResponseHandlerMethod Hello::World
/Location
with
#/tmp/setup.php
?
class Hello {
function World() {
global $request;
$request-send_http_header();
echo Hello World;
}
}
?
$request is the apache request. It is instantiated at all stages
automatically. The methods of that class are:
getallheaders
args
boundary
content_encoding
content_type
filename
handler
hostname
method
path_info
protocol
status_line
the_request
unparsed_uri
uri
allowed
bytes_sent
chunked
content_length
header_only
method_number
mtime
no_cache
no_local_copy
proto_num
proxyreq
read_body
remaining
request_time
status
headers_in
headers_out
err_headers_out
auth_name
auth_type
basic_auth_pw
discard_request_body
is_initial_req
meets_conditions
remote_host
satisfies
server_port
set_etag
set_last_modified
some_auth_required
update_mtime
send_http_header
basic_http_header
send_header_field
send_http_trace
send_http_options
send_error_response
set_content_length
set_keepalive
rputs
log_error
lookup_uri
lookup_file
method_uri
run
internal_redirect
These all wrap the ap_* apache EXPORT_API functions using the same
semantics (and are also the same as the Apache::Request methods in
mod_perl if you are familiar with that)
So, a uri handler to redirect all non-local traffic to /404.php (an
error page) would be
phpUriHandler /tmp/uri.php
#/tmp/uri.php
?
if($REMOTE_ADDR != '127.0.0.1') {
$request-uri('/404.php');
}
return OK;
?
It's important to note that since this is called from the uri
translations phase, this validation is performed for every request to
the server, not just for php pages.
Also, scope is shared between all the hooks. So in the above, we could
merge the two and do something like:
#/tmp/uri.php
?
if($REMOTE_ADDR != '127.0.0.1') {
$whoami = 'Stranger';
}
else {
$whoami = 'Friend';
}
return DECLINED; # because we're not redirecting, just messing around
?
and then:
#/tmp/setup.php
?
class Hello {
function World() {
global $request;
global $whoami;
$request-send_http_header();
echo Hello $whoami;
}
}
?
These variables are also in the same scope as a script if your script is
being handled by the standard application/x-httpd-php handler.
This allows you to make decisions and pass data between your handlers
and scripts at all stages.
The above are clearly trite examples, but hopefully give you a starting
point.
One note: all handlers can be validly re-entered 'in sub-requests'.
For this reason you should not define functions/classes here without
anti-redefinition guards (I would just recommend putting them in an
include and using include_one). This is not true for phpRequire, which
is only entered once, at the main request, and so it is safe to make
function/class declarations there (in fact that's what it's for).
Hope that helps!
George
On Friday, August 30, 2002, at 03:31 PM, Edin Kadribasic wrote:
The apache_hooks stuff is about at the stage where people poking
holes/finding bugs/making suggestions would be very beneficial. Any
feedback would be appreciated.
apache_hooks stuff sounds very interesting, but it's kind of difficult
start
playing with it without any pointers. Could you give us some hints/usage
tips on how to get started?
Edin
--
PHP Development Mailing List