PHP 异步执行

执行整个文件, 这样就会在系统后台悄悄的执行你的php文件了. 当然还可以fsockeopen或者curl

  1. exec("php cron.php > /dev/null &");
  1. pclose(popen("php cron.php &", 'r'));
发表在 PHP | 留下评论

GIT 移动分支到指定哈希值

此命令经常用于代码回滚,有了它你就可以回到过去

  1. $git reset –hard 哈希值
发表在 Git | 留下评论

Drupal Views exposed select list use chosen module

  1.  
  2. Drupal.behaviors.yourglobal = {
  3.    attach: function(context, settings) {
  4.       var div_id = '#myfield';
  5.       if(typeof settings.chosen !== 'undefined' && $(div_id, context).length > 0) {
  6.               settings.chosen = settings.chosen || Drupal.settings.chosen;
  7.  
  8.               // Prepare selector and add unwantend selectors.
  9.               var selector = settings.chosen.selector;
  10.  
  11.               // Function to prepare all the options together for the chosen() call.
  12.               var getElementOptions = function (element) {
  13.                 var options = $.extend({}, settings.chosen.options);
  14.  
  15.                 // The width default option is considered the minimum width, so this
  16.                 // must be evaluated for every option.
  17.                 if ($(element).width() < settings.chosen.minimum_width) {
  18.                   options.width = settings.chosen.minimum_width + 'px';
  19.                 }
  20.                 else {
  21.                   options.width = $(element).width() + 'px';
  22.                 }
  23.  
  24.                 // Some field widgets have cardinality, so we must respect that.
  25.                 // @see chosen_pre_render_select()
  26.                 if ($(element).attr('multiple') && $(element).data('cardinality')) {
  27.                   options.max_selected_options = $(element).data('cardinality');
  28.                 }
  29.  
  30.                 return options;
  31.               };
  32.               $(div_id, context).once('chosen', function() {
  33.                 options = getElementOptions(this);
  34.                 $(this).chosen(options);
  35.               });
  36.        }
  37.    },
  38. };
发表在 Drupal | 留下评论

Python 闭包

#!/usr/bin/python
#encode=utf-8

def addx(x):
    def addy(y):
        return x + y

    #返回一个可执行的函数.
    return addy

x = addx(8)

print x(10)
发表在 python | 留下评论

Drupal 7 behaviors

behavior主要用于Drupal Ajax前后可以调用. behavior 以 Drupal.behaviors.helloWorld的方式附加上去,helloWorld为一个函数,当页面加载完成以后Drupal会遍历每一个附件上去的函数. 并且会context和settings,context为当前的上下文。settings是Drupal.settings

在Drupal 7中通常的写法为:

  1. Drupal.behaviors.hehe = {
  2.   attach: function(context, settings) {
  3.     // Ajax后或页面加载完成执行.
  4.   },
  5.   detach: function(){context} {
  6.     // Ajax前执行.
  7.   }
  8. };

https://www.drupal.org/update/modules/6/7#drupal_behaviors

发表在 Drupal | 留下评论

Drupal 用户实现单一登陆

单一登陆什么意思呢?也就是一个账号同时只能在一个地方登陆. 实现方式是当用户登陆成功以后删除当前账号在其它的地方的登陆session

  1. /**
  2.  * Implements hook_user_login().
  3.  *
  4.  * User logged in callback.
  5.  */
  6. function mymodule_user_login(&$edit, $account) {
  7.   // 用户单一登陆实现.
  8.   db_query('DELETE FROM `sessions` WHERE uid=:uid AND sid!=:sid', array(
  9.     ':uid' => $account->uid,
  10.     ':sid' => session_name()
  11.   ));
  12. }
发表在 Drupal | 留下评论

Drupal 用户登陆

看之前请先看 Cookie与Session的工作原理

当运行session_start()时,会创建一个PHPSISSID的Cookie, 而且这个id也是随机生成
但是drupal中的这里有点不大一样. 这个id生成是由drupal_random_key()函数生成. 参考:

  1. session_id(drupal_random_key());

当用户正常登陆以后会根据用户的uid创建一个session. 请检查sessions表
屏幕快照 2015-01-09 16.21.02

当用户第二次打开网站的时候会去检查这个cookie是否存在,如果存在验证这个cookie然后初始化当用户. 如果不存在则重新登陆.
参考函数:
drupal_session_initialize()

Drupal中允许一个用户在多个地方登陆,如果想只能一个地方登陆可以这样:

  1. /**
  2.  * Implements hook_user_login().
  3.  *
  4.  * User logged in callback.
  5.  */
  6. function mymodule_user_login(&$edit, $account) {
  7.   // 用户单一登陆实现.
  8.   db_query('DELETE FROM `sessions` WHERE uid=:uid AND sid!=:sid', array(
  9.     ':uid' => $account->uid,
  10.     ':sid' => session_name()
  11.   ));
  12. }

在Drupal中如果中途改变了全局变量$user, 登陆用户将会切换 Why?

  1. global $user;
  2. $user = user_load(1);

drupal_page_footet()是默认html驱动器(drupal_deliver_html_page)最好执行的函数

global $user;
module_invoke_all('exit');
// Commit the user session, if needed.
drupal_session_commit();

在这个函数将会依次执行drupal_session_commit -> session_write_close -> _drupal_session_write
在_drupal_session_write中更新Session信息

  1.       db_merge('sessions')
  2.         ->key($key)
  3.         ->fields($fields)
  4.         ->execute();
  5.     }
发表在 Drupal | 2条评论

大巧若拙,大辩若讷

最有智慧的人,真正有本事的人,虽然有才华学识,但平时像个呆子,不自作聪明;虽然能言善辩,但好像不会讲话一样。无论是初涉世事还是位居高官,无论是做大事还是一般人际关系,锋芒不可毕露。有了才华固然很好,但在合适的时机运用才华而不被或少被人忌,避免功高盖主,才算是更大的才华,这种才华对社会、对人对己才有真正的用处。

发表在 ubuntu | 留下评论

Drupal Fatal error: Class name must be a valid object or a string in includes/common.inc on line 7680

如果出现Entity这种错误算是比较严重的了。这里只说如何调试
view

  1. /**
  2.  * Get the entity controller class for an entity type.
  3.  */
  4. function entity_get_controller($entity_type) {
  5.   $controllers = &drupal_static(__FUNCTION__, array());
  6.   if (!isset($controllers[$entity_type])) {
  7.     $type_info = entity_get_info($entity_type);
  8.     $class = $type_info['controller class'];
  9.     $controllers[$entity_type] = new $class($entity_type);
  10.   }
  11.   return $controllers[$entity_type];
  12. }

TRY

  1. $class = isset($type_info['controller class']) ? $type_info['controller class'] : 'DrupalDefaultEntityController';

TO

  1. /**
  2.  * Get the entity controller class for an entity type.
  3.  */
  4. function entity_get_controller($entity_type) {
  5.   $controllers = &drupal_static(__FUNCTION__, array());
  6.   if (!isset($controllers[$entity_type])) {
  7.     $type_info = entity_get_info($entity_type);
  8.     $class = $type_info['controller class'];
  9.  
  10.     // 增加一个debug调试,看看问题从哪里来.
  11.     if(gettype($class) == 'string' || gettype($class) == 'object') {
  12.       $controllers[$entity_type] = new $class($entity_type);
  13.     } else  {
  14.       print_r(debug_backtrace());
  15.     }
  16.     $controllers[$entity_type] = new $class($entity_type);
  17.   }
  18.   return $controllers[$entity_type];
  19. }
发表在 Drupal | 留下评论

PHP文件大小格式化与反格式化

此代码来自drupal

  1.  
  2. define('DRUPAL_KILOBYTE', 1024);
  3.  
  4. /**
  5.  * Parses a given byte count.
  6.  *
  7.  * @param $size
  8.  *   A size expressed as a number of bytes with optional SI or IEC binary unit
  9.  *   prefix (e.g. 2, 3K, 5MB, 10G, 6GiB, 8 bytes, 9mbytes).
  10.  *
  11.  * @return
  12.  *   An integer representation of the size in bytes.
  13.  */
  14. function parse_size($size) {
  15.   $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size.
  16.   $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size.
  17.   if ($unit) {
  18.     // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by.
  19.     return round($size * pow(DRUPAL_KILOBYTE, stripos('bkmgtpezy', $unit[0])));
  20.   }
  21.   else {
  22.     return round($size);
  23.   }
  24. }
  25.  
  26. /**
  27.  * Generates a string representation for the given byte count.
  28.  *
  29.  * @param $size
  30.  *   A size in bytes.
  31.  * @param $langcode
  32.  *   Optional language code to translate to a language other than what is used
  33.  *   to display the page.
  34.  *
  35.  * @return
  36.  *   A translated string representation of the size.
  37.  */
  38. function format_size($size) {
  39.   if ($size < DRUPAL_KILOBYTE) {
  40.     return str_replace('@count bytes', '@count', $size);
  41.   }
  42.   else {
  43.     $size = $size / DRUPAL_KILOBYTE; // Convert bytes to kilobytes.
  44.     $units = array(
  45.       '@size KB',
  46.       '@size MB',
  47.       '@size GB',
  48.       '@size TB',
  49.       '@size PB',
  50.       '@size EB',
  51.       '@size ZB',
  52.       '@size YB',
  53.     );
  54.     foreach ($units as $unit) {
  55.       if (round($size, 2) >= DRUPAL_KILOBYTE) {
  56.         $size = $size / DRUPAL_KILOBYTE;
  57.       }
  58.       else {
  59.         break;
  60.       }
  61.     }
  62.     return str_replace('@size', round($size, 2), $unit);
  63.   }
  64. }
  65.  
  66. var_dump(format_size(2003330));
  67.  
  68. 输入: 1.91KB
发表在 Drupal, PHP | 留下评论