[geeklog-devel] Quick overview of GL2 and what we have so far and how it relates to the API

Tony Bibbs tony at tonybibbs.com
Mon Nov 3 10:45:44 EST 2003


Yeah, but if you start depending on files then it makes having GL2 work 
on multiple webservers more difficult.  Let me think about this some more.

--Tony

Vincent Furia wrote:
> My idea was to store who registered which events in the database.  But, 
> thinking ahead, since event registration is not a frequent task (and 
> therefore the table won't be changing all that much) I think we could 
> easily use a php file as a cache.  The php file would get updated 
> everytime the event_handler table was altered.  This would prevent 
> unnecessary database calls.
> 
> The cache file could look something like:
> <?php
> $eventListener['plugin']['event'][] = 'listening plugin';
> ?>
> 
> And then once this file is loaded, and GL2 core gets notified of an 
> event, all it has to do is:
> foreach ($eventListener[$plugin][$event] as $plugs) {
>    require_once($plugs . '/functions.inc');    // or whatever file...
>    $plugs::onEvent($plugin, $event, $vars);
> }
> 
> The only problem I see with the method you suggest is that every 
> plugin's functions.inc file (or whatever the equivilent we will use in 
> GL2) will have to be loaded whenever any event occurs.  The method 
> recommended above, would only need to load the plugins that are 
> listening for an event.  Since I expect many more events to occur than 
> are actually going to be handled by the different plugins, this will 
> probably end up saving CPU and Memmory usage.  It will allow us to stick 
> with the MVCnPHP mantra of loading only what is necessary.
> 
> -Vinny
> 
> Tony Bibbs wrote:
> 
>> I need more time to digest this but one quick note about your approach 
>> to event handling.  If I read it right, your method requires trip(s) 
>> to the database to be able to determine which modules wanted to be 
>> triggered when an event occurs.  I would like to see us implement this 
>> in a way that would avoid that overhead and I think we can do it.  For 
>> example, a module will know when it is shipped which modules it will 
>> try to interact with.  Here is a snippet that I think can handle this:
>>
>> /**
>> * This calls an event on any module
>> *
>> * NOTE: this is just a stub in the API
>> *
>> * @param string $eventName Name of the event that was fired
>> * @param string $module Name of the module that triggered an event
>> * @param array $args Array of arguments for the handler
>> *
>> */
>> function handleEvent($eventName, $module, $args)
>> {
>> }
>>
>> For example purposes let's assume the following is the API 
>> implementation of the function above for the forum module:
>>
>> /**
>> * Proxies events to the appropriate non-API event handlers
>> *
>> *
>> * @param string $eventName Name of the event that was fired
>> * @param string $module Name of the module that triggered an event
>> * @param array $args Array of arguments for the handler
>> *
>> */
>> function handleEvent($eventName, $module, $args)
>> {
>>     switch ($module) {
>>         'Geeklog':
>>             // Call local non-API method to handle Messaging event
>>             return handleGeeklogEvent($eventName);
>>         'Messaging':
>>             // Call local non-API method to handle Messaging event
>>             return handleMessagingEvent($eventName);
>>         'Stories':
>>             // Call local non-API method to handle Story event
>>             return handleStoryEvent($eventName);
>>         default:
>>         // For all other modules we don't care so bail
>>             return false;
>>     }
>> }
>>
>> Though you can see the trend, here is what you would have in one of 
>> the event handlers.  Let's assume this is the forum's event handler 
>> for messaging:
>>
>> function handleMessagingEvent($eventName)
>> {
>>     switch ($eventName) {
>>         'onPMSent':
>>             return ForumEventHandler::hand
>>     EventHandler::
>> }
>>
>> In this way you don't need to register events in a database.  You may 
>> be able to condense this a bit by using is_callable() or 
>> method_exists() to avoid too many levels of event handling proxies but 
>> this demonstrates my idea.  Again, I think we should trim GL2 down to 
>> essential DB calls and if we can avoid them here I'd like to.  I'm 
>> sure there may be arguments for doing it in the DB which is fine, just 
>> let me know what they are (i.e. I'm not married to any decision yet).
>>
>> Thoughts or concerns?
>>
>> --Tony
>>
>> Vincent Furia wrote:
>>
>>> A couple comments I wanted to add about plugins and other GL2 stuff.  
>>> First, I think that we should consider making some of the 'core' 
>>> functionality into plugins instead. Specifically I'm referring to the 
>>> comment engine, the (potential) ratings engine, and the messaging 
>>> system (maybe even the logging system?).  This would allow users to 
>>> replace the functionality provided by these plugins.  A good example 
>>> of this might be replacing a standard comment system with a 
>>> forum-like comment system.  I think doing so would give GL2 even more 
>>> flexibility.
>>>
>>> I know Tony didn't mean the core feautre list to be exhaustive, but 
>>> one item I didn't see (but would like to see) was a configuration 
>>> utility.  I think, with GL2, we should get away from forcing GL 
>>> administrators from editing config.php by hand and move to a fully 
>>> web based configuration utility that can be used by the plugins as 
>>> well being used for core feautres.
>>>
>>> On that subject I think it's time to start putting together a 
>>> document that shows what core functionality GL2 will provide and any 
>>> information we have on how it will provide that.  Something like a 
>>> design document.  It's something that I'd be willing to work on, but 
>>> I'd need a lot of information and support, especially from Tony.  
>>> Maybe this is something that would best be done in a Wiki format?
>>>
>>> Finally, I have a few comments about event handling system and a few 
>>> comments on plugins in general.  If we do this well, and efficiently, 
>>> we could have a really flexible, extensible system that will beat out 
>>> every other open source system I've seen.  For that reason I think 
>>> its important to focus, briefly on how the plugin event calls might 
>>> work in GL2.  This is just a rough idea, and I'd really like to see 
>>> input on what you all think of this.
>>>
>>> Each plugin should be able to register the fact it wants to be called 
>>> when certain events occur:
>>>    registerEventCallback(plugin registering callback, plugin raising 
>>> event, event)
>>>
>>> Then, a plugin can notify GL2 that event has occurred with:
>>>    raiseEvent(plugin raising event, event, parameters)   // 
>>> parameters: array of values
>>>
>>> Upon being notified that an event occurred, GL2 can call the plugin 
>>> API for all plugins registered to recieve the event:
>>>    onEvent(plugin raising event, event, parameters)
>>>
>>> Also plugins need to be able to invoke an event/function in another 
>>> plugin:
>>>    invokeEvent(plugin providing function, event, parameters)
>>>
>>> I'm still thinking about possible ways raiseEvent and invokeEvent can 
>>> handle returned values. One possibility, at least for invokeEvent, is 
>>> the functions could be required to return a small object containing 
>>> status (-1, failure; 0, plugin function not found; 1, success; etc.) 
>>> and the results of the call:
>>>    $P = invokeEvent(plugin, event, parameters);
>>>     if ($P->status > 0) {
>>>         echo $P->result;
>>>     }
>>>
>>> Of course all this leads to a question if we should have a severely 
>>> simplified API where even core functionality such as the moderation 
>>> fuctions, comment functions, etc should all be called through this 
>>> event API (with a plugin name = 'core').  One advantage to doing it 
>>> this way would allow us to extend plugin functionality in later 
>>> releases without affecting the plugin API (which would prevent plugin 
>>> obsolesence to an extent).
>>>
>>> Another issue I think we should start talking about is plugin 
>>> dependency, and how to handle it gracefully.  Obviously plugins will 
>>> support, to one extent or another, the use of other plugins.  This 
>>> could run the gambit from a plugin being dependent on another plugin 
>>> to work, to a plugin using another plugin in a non dependent way 
>>> (i.e. the plugin isn't required for operation, just for extended 
>>> functionality).
>>>
>>> I think that is more than enough to digest in one sitting.  If anyone 
>>> would like to chat with me I'll try to be available in #geeklog.  Of 
>>> couse, email discourse is always welcome as well.
>>>
>>> -Vinny
>>> Who is already having fun...
>>>
>>> _______________________________________________
>>> geeklog-devel mailing list
>>> geeklog-devel at lists.geeklog.net
>>> http://lists.geeklog.net/listinfo/geeklog-devel
>>
>>
>>
> 
> 
> _______________________________________________
> geeklog-devel mailing list
> geeklog-devel at lists.geeklog.net
> http://lists.geeklog.net/listinfo/geeklog-devel

-- 
+----------------------------------------------------------------------+
|Tony Bibbs         |[R]egardless of what you may think of our penal   |
|tony at tonybibbs.com |system, the fact is that every man in jail is one |
|                   |less potential fisherman to clutter up your       |
|                   |favorite pool or pond. --Ed Zern                  |
+----------------------------------------------------------------------+




More information about the geeklog-devel mailing list