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中国]群友 "冉强军"的帮助!