跳转到主要内容
sina_-hit 提交于 28 May 2015

public://是怎么生效的,在哪里定义?

大致步骤:

1.drupal bootstrap的引导阶段drupal_bootstrap_full里,会调用file_get_stream_wrappers() 来保证注册了所有的stream wrapper. //common.inc的5186行.

2. file_get_stream_wrappers函数是在includes/file.inc里定义,这个函数里会利用钩子原理调用module_invoke_all('stream_wrappers')来得到所有在其它模块里定义的stream wrapper.这时,核心模块system.module里的system_stream_wrappers()会被调用,这个函数里声明了public://的信息如下:

$wrappers = array(     'public' => array(       'name' => t('Public files'),       'class' => 'DrupalPublicStreamWrapper',       'description' => t('Public local files served by the webserver.'),       'type' => STREAM_WRAPPERS_LOCAL_NORMAL,     ),     'temporary' => array(       'name' => t('Temporary files'),       'class' => 'DrupalTemporaryStreamWrapper',       'description' => t('Temporary local files for upload and previews.'),       'type' => STREAM_WRAPPERS_LOCAL_HIDDEN,     ),   );

3.得到所有wrapper之后再通过PHP原生的函数stream_wrapper_register(协议名,类)来注册wrapper.

在file_get_stream_wrappers函数的146行有这样一句:stream_wrapper_register($scheme, $info['class']);这个$cheme就是指public,这个$info["class"]就是上面的DrupalPublicStreamWrapper.

这个类定义在includes/stream_wrappers.inc里,如下:

/**  * Drupal public (public://) stream wrapper class.  *  * Provides support for storing publicly accessible files with the Drupal file  * interface.  */ class DrupalPublicStreamWrapper extends DrupalLocalStreamWrapper {   /**    * Implements abstract public function getDirectoryPath()    */   public function getDirectoryPath() {     return variable_get('file_public_path', conf_path() . '/files');   }

  /**    * Overrides getExternalUrl().    *    * Return the HTML URI of a public file.    */   function getExternalUrl() {     $path = str_replace('\\', '/', $this->getTarget());     return $GLOBALS['base_url'] . '/' . self::getDirectoryPath() . '/' . drupal_encode_path($path);   } }

其实就是对PHP STREAM WRAPPER的实现。

---------------------------------------------------------------------------------------------------------

PHP Wrapper是什么 自PHP 4.3开始,PHP开始允许用户通过stream_wrapper_register()自定义URL风格的协议。用户使用fopen(), copy()等文件系统函数对封装协议进行操作时,PHP会调用注册协议时所提供的类中相应的函数。 PHP手册中给了一个例子,它将VariableStream类注册为var://协议,通过这个协议,用户可以使用文件系统函数直接读写全局变量。例如,用户可以通过 “var://foo” 读写 $GLOBALS['foo'] 。

---------------------------------------------------------------------------------------------------------

在此感谢[Drupal中国]群友 "冉强军"的帮助!

Drupal 版本