“drupal is written in php, which is uttterly offensive to people.”
DESCRIPTION
H o r r i b l e T r u t h 1. “Drupal is written in PHP, which is uttterly offensive to people.”. H o r r i b l e T r u t h 2. “Drupal loads too much code” -rasmus. Is Drupal too Modular?. H o r r i b l e T r u t h 4. “Drupal is basically a 404 page to which you can add modules””. - PowerPoint PPT PresentationTRANSCRIPT
“Drupal is written in PHP, which is
uttterly offensive to people.”
H o r r i b l e T r u t h 1
“Drupal loads too much
code”
-rasmus
H o r r i b l e T r u t h 2
Is Drupal too Modular?
“Drupal is basically a 404 page to
which you can add modules””
H o r r i b l e T r u t h 4
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
index.phpincludes/bootstrap.inc - load necessary functionsdrupal_page_header() starts timer, sets up caching, module calloutincludes/common.inc - utility functions such as path formatting functions, form generation and validation, etc. fix_gpc_magic() sets $status 404 switch - case Not Found case Access Denied drupal_page_footer()
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drupal_load()drupal_not_found();drupal_access_denied();drupal_site_offline();
$return = menu_execute_active_handler();print theme('page', $return);
drupal_page_footer();
What's on the menu api?
MENU_CALLBACK
MENU_DEFAULT_LOCAL_TASK
MENU_LOCAL_TASK
MENU_MAX_DEPTH
MENU_MAX_PARTS
MENU_NORMAL_ITEM
MENU_SUGGESTED_ITEM
MENU_CALLBACK
MENU_DEFAULT_LOCAL_TASK
MENU_LOCAL_TASK
MENU_MAX_DEPTH
MENU_MAX_PARTS
MENU_NORMAL_ITEM
MENU_SUGGESTED_ITEM
Scream API
The Dreaded Hooks of Torture
H o r r i b l e T r u t h 7
Hooks of Torture
• to implement a hook, create a function that 'extends' hooks into an existing hook (“hook function”)
• not functions but can be overloaded
• call user function array used to make dynamic function calls
module_invoke_all
<?phpfunction module_invoke_all() { $args = func_get_args(); $hook = $args[0]; unset($args[0]); $return = array(); foreach (module_implements($hook) as $module) { $function = $module .'_'. $hook; $result = call_user_func_array($function, $args); if (isset($result) && is_array($result)) { $return = array_merge_recursive($return, $result); } else if (isset($result)) { $return[] = $result; } }
return $return;}?>
hook_admin
/** * channels_admin * implements hook_admin * Provides channels admin form to save settings for the following fields: * */function channels_admin() { $form['channels'] = array( '#type' => 'textfield', '#title' => t('Channel'), '#default_value' => variable_get('channels', ''), '#size' => 25, '#maxlength' => 128, '#description' => t("channel_theme"), '#required' => TRUE, ); return system_settings_form($form);}
hook_perms
/** * Implements hook_perm(). */function channels_perm() { return array( 'access channel content', 'administer channels', );}
hook_menu
/** * Implements hook_menu(). anne/function channels_menu() { $items = array(); $items['admin/settings/channels'] = array( 'title' => 'channel settings', 'description' => 'select channel', 'page callback' => 'drupal_get_form', 'page arguments' => array('channels_admin'), 'access arguments' => array('administer channels'), 'type' => MENU_NORMAL_ITEM, ); return $items;}
hook_block
/** * Implementation of hook_block(). */function channels_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': $blocks[0]['info'] = t('current_channel'); return $blocks; case 'view': $totals = _channels_get_theme(); if (!empty($webstream)) { $content = theme('channels_current_theme', $webstream); } $blocks['subject'] = t('You're What's On!'); $blocks['content'] = $content; return $blocks; }
hook_menu_alter
/** Implementation of hook_menu_alter(). */
function noaccess_menu_alter(&$items) { $items['node']['access arguments'] = array('access node path');
}
/** Implementation of hook_perm(). */
function noaccess_perm() { return array('access node path');}
Hook Soup
Does Drupal have a Learning Curve...
…or a Learning Brick Wall ?
“Community Plumbing”
Drupal is a Pushme - Pullyou
Framework!Product!
What's aNode?
Field API
“Drupal Isn't 'Classy”'?
H o r r i b l e T r u t h 9
“Drupal isn't Object
Oriented?”
H o r r i b l e T r u t h 10
Drupal Design PatternDRUPAL DESIGN PATTERN
Drupal Design PatternREALITY CHECK.
Drupal Anti-Pattern
“Load Everything then
Cherry Pick What You Need.”
Drupal Encourages
Slavery
H o r r i b l e T r u t h 11
Making Drupal “Slave Safe!”
Actions* & Triggers
*(not slave safe)
Database TNG
Performance & Scaling
Sample Metrics from a large Drupal site:
50 million page views per month
6.5 million site visitors per month
150,000 page views per hour
load tests to levels of greater than 500,000 page views per hour
Drupal.org delivers approximately 1M/day/month
Object CachingAPC
Advantages Low latency No need to serialize/unserialize items Scales perfectly with more web servers
Disadvantages No enforced consistency across multiple web servers Cache is not shared; each web server must generate each item
memcached
Advantages Consistent across multiple web servers Cache is shared across all web servers; items only need to be
generated once
Disadvantages High latency Requires serializing/unserializing items Easily shards data across multiple web servers, but is still a big,
shared cache
Cache Headers
* Download and enable devel module: drush dl devel drush enable devel * Run cron: drush cron * Refresh modules and core updates informartion: drush refresh * Take a snapshot of the DB: drush sql dump > mydb.sql * Open a mysql console for running SQL commands into
Drupal DB: drush sql cli * Clear Drupal cache: drush cache clear
drush
drush
drush_makecore = "7.x"
projects[] = "drupal"
projects[] = "acquia_connector"
projects[apachesolr][download][type] = "cvs"
projects[apachesolr][download][module] = "contributions/modules/apachesolr"
projects[apachesolr][download][revision] = "DRUPAL-7--0"
projects[acquia_search][type] = "module"
projects[acquia_search][download][type] = "svn"
projects[acquia_search][download][url] = "https://svn.acquia.com/drupal/branches/1.x-
7.x/modules/acquia/acquia_search/"
libraries[SolrPhpClient][download][type] = "get"
libraries[SolrPhpClient][download][url] =
"http://solr-php-client.googlecode.com/files/SolrPhpClient.r22.2009-11-09.tgz"libraries[SolrPhpClient][destination] = "modules/apachesolr"
touch ~/.logrotate.state ~/.logrotate.config
emacs ~/.logrotate.config
~/backup/dev.sql.gz { rotate 7 daily nocompress nocopytruncate postrotate /usr/bin/drush -r ~/web.root.org/web/ sql dump | gzip > ~/backup/dev.sql.gz
endscript}
/usr/bin/drush -r ~/web.root.org/web/ sql dump | gzip > ~/backup/dev.sql.gz
Automated Backup