1 / 45

“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 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””.

garnet
Download Presentation

“Drupal is written in PHP, which is uttterly offensive to people.”

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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.”

  2. H o r r i b l e T r u t h 2 “Drupal loads too much code” -rasmus

  3. Is Drupal too Modular?

  4. 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””

  5. drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); index.php includes/bootstrap.inc - load necessary functions drupal_page_header() starts timer, sets up caching, module callout includes/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()

  6. 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();

  7. 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

  8. Scream API

  9. H o r r i b l e T r u t h 7 The Dreaded Hooks of Torture

  10. 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

  11. module_invoke_all • <?php • function 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; • } • ?>

  12. 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); • }

  13. hook_perms • /** • * Implements hook_perm(). • */ • function channels_perm() { • return array( • 'access channel content', • 'administer channels', • ); • }

  14. 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; • }

  15. 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; • }

  16. 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'); • }

  17. Hook Soup

  18. Does Drupal have a Learning Curve...

  19. …or a Learning Brick Wall ?

  20. “Community Plumbing”

  21. Product! Framework! Drupal is a Pushme - Pullyou

  22. Field API • What's • a • Node?

  23. H o r r i b l e T r u t h 9 “Drupal Isn't 'Classy”'?

  24. H o r r i b l e T r u t h 10 “Drupal isn't Object Oriented?”

  25. DRUPAL DESIGN PATTERN Drupal Design Pattern

  26. REALITY CHECK. Drupal Design Pattern

  27. Drupal Anti-Pattern “Load Everything then Cherry Pick What You Need.”

  28. H o r r i b l e T r u t h 11 Drupal Encourages Slavery

  29. Making Drupal “Slave Safe!”

  30. Actions* & Triggers *(not slave safe)

  31. Database TNG

  32. 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

  33. Object Caching • APC • 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

  34. Cache Headers

  35. drush • * 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

  36. drush

  37. drush_make core = "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"

  38. Automated Backup • 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

More Related