#native_company# #native_desc#
#native_cta#

Application Variable Handlers

By Martin Laine
on January 20, 2002

Version: 1.1

Type: Function

Category: Other

License: WebSite Only

Description: A collection of functions to handle application-wide persistent variables. Similar to session handling functions, this code was based on the APPLICATION scope in Cold Fusion. I needed this concept for a system where one set of code drives several web applications. I am sure there are file locking issues so comments would be greatly appreciated!!

<?php

/*
<fusedoc fuse="application.php" language="PHP" version="1.1">
	<responsibilities>
		I define Application variable handling functions.
		
		Include this file in your code with require_once().
		
		I create an array of application variables named _APPLICATION. Changes to this array will be persistent
		because of application_write_all() is registered as a shutdown function. This means that it will be called
		once the script shuts down.
		
		I store this array as a WDDX packet in a file.
		
		NOTE: This code probably needs some kind of file locking. At least, that's what I would do
			  when using Cold Fusion on a Windows box. As I am totally new to PHP and have never
			  coded for Unix/Linux platforms, I am not sure of the issues behind shared file storage.
		
		To identify the application, use application_start() and specify a UNIQUE application name
		and the physical location of the application data storage e.g.:
		
			application_start( "WEB_APP_NAME", "C:PHPAPPLICATIONDATA" );
		
		application_start() deserializes the WDDX packet to the global _APPLICATION array.
		If the storage file does ot exist, it creates a new one.
		
		When created, the _APPLICATION array contains two strings:
		
			_APPLICATION["AppName"]
			_APPLICATION["AppDataLocation"]
		
		These two values are used by the other functions to serialize and deserialize the array to and
		from the data file.
		
		To register a value as an application variable use application_register(). This will also update
		the data file.
		
		Similarly to session functions, you can use application_unregister() to remove an application
		variable from the array. This will also update the data file.
		
		To remove all variables, use application_unset(). This will also update the data file.
		
		There is no need for a 'destroy' function. The application_unset() is enough to re-initialise the _APPLICATION array.
	</responsibilities>
	
	<properties>
		<history author="Martin Laine"
				 email="[email protected]"
				 date="15/01/2002"
				 type="Create"/>
		<history author="Martin Laine"
				 email="[email protected]"
				 date="20/01/2002"
				 type="Update">
			Added application_write_all to the set of functions and set it as a shutdown function.
			This now allows for the _APPLICATION array to be READ and WRITE enabled.
		</history>
	</properties>
	
	<io>
		<out>
			<array name="_APPLICATION">
				<string name="AppName" comments="Name of the application."/>
				<string name="AppDataLocation" comments="Physical path to the application data storage directory."/>
				<mixed name="*" comments="User-defined application variables."/>
			</array>
		</out>
	</io>
</fusedoc>
*/

// --------------------------------------------------------------
// Initialise _APPLICATION array if not set
// --------------------------------------------------------------

if( !isset( $_APPLICATION ) ) $_APPLICATION = array();


// --------------------------------------------------------------
// Use this function to update the data file
// --------------------------------------------------------------

function application_write_all() {
	global $_APPLICATION;
	$FileName = $_APPLICATION["AppDataLocation"] . "app_" . $_APPLICATION["AppName"] . ".dat";

	// Serialize the array and write it to the data file
	$fp = fopen( $FileName, "w" ) or die( "Unable to open the application data file" );
	fwrite( $fp, wddx_serialize_value( $_APPLICATION ) ) or die( "Unable to write to the application data file" );
	fclose( $fp );
}


// --------------------------------------------------------------
// Use this function to identify the application and deserialize the array
// --------------------------------------------------------------

function application_start( $AppName, $AppDataLocation ) {
	global $_APPLICATION;
	$FileName = $AppDataLocation . "app_" . $AppName . ".dat";

	// Check for the existence of the data file
	if( !file_exists( $FileName ) ) {
		// Write AppName and AppDataLocation to the _APPLICATION array
		$_APPLICATION["AppName"] = $AppName;
		$_APPLICATION["AppDataLocation"] = $AppDataLocation;

		// Write array to data file
		application_write_all();
	}
	else {
		// Get the WDDX packet from the data file and write to the _APPLICATION array
		$fp = fopen( $FileName, "r" ) or die( "Unable to open the application data file" );
		$_APPLICATION = wddx_deserialize( fread ( $fp, filesize ( $FileName ) ) );
		fclose( $fp );
	}
}


// --------------------------------------------------------------
// Use this function to register an application variable
// --------------------------------------------------------------

function application_register( $VarName ) {
	global $_APPLICATION;

	// Make sure we are not trying to modify AppName or AppDataLocation
	if( strcmp( $VarName, "AppName" ) == 0 OR strcmp( $VarName, "AppDataLocation" ) == 0 ) die( "Warning: Attempting to register " . $VarName );
	
	// Write the new value to the array
	$_APPLICATION[$VarName] = $GLOBALS[$VarName];
	
	// Write array to data file
	application_write_all();
}


// --------------------------------------------------------------
// Use this function to unregister an application variable
// --------------------------------------------------------------

function application_unregister( $VarName ) {
	global $_APPLICATION;
	
	// Make sure we are not trying to unregister AppName or AppDataLocation
	if( strcmp( $VarName, "AppName" ) == 0 OR strcmp( $VarName, "AppDataLocation" ) == 0 ) die( "Warning: Attempting to unregister " . $VarName );

	// Remove the variable from the array if it exists
	if( isset( $_APPLICATION[$VarName] ) ) unset( $GLOBALS["_APPLICATION"][$VarName] );

	// Write array to data file
	application_write_all();
}


// --------------------------------------------------------------
// Use this function to remove all application variables
// --------------------------------------------------------------

function application_unset() {
	global $_APPLICATION;

	// Remove all application variables except AppName and AppDataLocation
	foreach( array_keys( $_APPLICATION ) as $Index ) if( strcmp( $Index, "AppName" ) != 0 AND strcmp( $Index, "AppDataLocation" ) != 0 ) unset( $GLOBALS["_APPLICATION"][$Index] );

	// Write array to data file
	application_write_all();
}

register_shutdown_function( "application_write_all" );

?>