hdfoo站点开发笔记-2

为了避免有些目录下没有生成deny.htm而显示列表, 可以直接给 /var/www/html目录去掉 Indexes选项

不能在 Options选项的Indexes前面 单独的添加 减号

[root@localhost conf]# httpd -t
AH00526: Syntax error on line 144 of /etc/httpd/conf/httpd.conf:
Either all Options must start with + or -, or no Option may.  

// 意思是:  不能单独给Options中的某一个选项添加 + 或 - , 必须给每个选项都加上加号或减号, 或者都不加符号.

  1. md5函数的应用?
  • md5函数是将任意长度的信息(字符串)作为输入, 将其输出 总是 为一个 128 bit 的"指纹信息", "报文摘要".

  • 因此, md5函数的格式是 md5(in_string, [raw]) raw是可选的, 指明是以原始的 二进制格式输出, 还是以16进制的格式输出. 默认的是false, 以16进制输出.

  • 如果raw为true, 以0~255的 二进制格式输出, 就是 128/8=16个字符, 如果以16进制格式输出, 则是32个字符.

  • 因为是二进制格式的, 所以如果输出md5的raw格式, 将会有很多 "不可读"的 控制字符(乱码), 所以 通常要以 16进制的可读字符来显示.

  • md5函数, 主要是在用户 注册/登陆 进行密码输入和 保存的时候使用. 注册时将密码经过md5处理保存在数据库中, 登陆验证时, 将用户的输入字符串经过md5处理后, 7然后与保存在数据库中的 注册时将密码经过md5处理保存在数据库中, 登陆验证时, 将用户的输入字符串经过md5处理后, 然后与保存在数据库中的密码进行比较... 这样就可以在不知道用户确切密码的情况下完成比对.


==============================================

vim中的点号可以重复上一次操作, 但是这个操作, 必须是一些 复制/粘贴/删除之类的操作. 如果是 移动/ 跳转 光标的操作, 比如: fa, ta, f( 等操作, 是不能用点号来重复的.

即使是在linux中, gvim也是非常有用的. 它支持laptop触摸屏的鼠标拖动.

  • gvim中关于窗口的所有 操作, 即使是窗口的关闭 ^W+c, 都不会影响(不会关闭)缓冲区的, 所以, 即使你用 ^W+o(others)关闭了其他所有窗口, 只有当前这个窗口, 其他的缓冲区内容并不会关闭仍然存在的.

  • gvim中, 窗口的宽度和高度调节是 通过 | 和 _ 来做的, 它们使窗口的宽度或高度最大化, 而对应的 最小化则是在前面加上1, 比如: 1| 宽度最小化, 1_ 高度最小化.

在php中, \(和{}的组合是不支持的, 包括: {\)var} 和 ${var}都不支持, 前者只有在模板中得到支持, 这种组合是在 bash的shell脚本中有意义. php中会报错.


tp的上传驱动, 类型很多, 比如local本地上传, ftp上传等, 通常用的是local

上传信息数组的 saveName 和 subName的命名方式, 有三种

  • 函数命名法. 用配置或动态赋值的方式: $upConfig = array( 'saveName' => 'uniqid'); 或 $Upload -> saveName = 'uniqid'; 如果有函数有参数, 就用
    数组的方式, 比如$u ->saveName = array('date', 'Ymd') 如果参数有多个,则参数也用数组的方式: $u ->saveName = array('date', array('Ymd', $t))

  • 直接字符串命名法, 字符串可以是 函数和字符串之间拼接而成的 比如: $u->saveNam = 'my'. date('Ymd') . mt_rand() ;

  • 保持原来的文件名称, 则 赋值为 空串: $u->saveName = '';

  • uniqid() 函数是php 从运行php脚本的服务器上, 获得的 基于微秒 的唯一 id数. 基本上就表示了 事件(比如发帖/操作数据库) 的时间 先后顺序, 所以, uniqid 既可以做
    id, 也可以做唯一的文件名, 还可以此为依据事件 进行排序.



1. php的rand函数? 每种语言的rand函数都不同, 有的是 返回0~1之间的小数... 而php中的rand函数很直接, - rand() 返回介于下限或0, 和上限或 getrandmax() 之间的 (包含端点边界值,相当于 闭区间) 随机 **整数** - 随机值 是自动 随机播种, 因此, 使用时就不用再自己去调用种子函数了 - 还有一个效率更高的随机函数,就是 mt_rand() .通常就用的这个mt_rand
  1. 要通过数字获得对应的 字符串, 这个其实也很简单, 将对应 的字符串定义为数组, 然后用数字对应取数组的下标就好了. `$week = array('日', '一', '

二', '三', '四', '五', '六'); echo '

今天是: 星期'. $week[date('w')];`

  • 对于date函数, 虽然也可以用数组对应的方法,取得 年月日的对应字符串, 但是人家已经提供了对应的格式字符, 直接使用就好了
    比如

  • 月份: m 两位数字不足要 补0, n 两位数字 不补0, M: 三个英文字母, F全名

  • 日: d 几日, 二位数字不足补零, j 二位数字不补零

  • 星期: w 0-6(星期日为0), l 英文全名, D三个字母.

  • 小时: h g 12小时制, 前者补0,后者不补0; H G24小时制, 前者补0, 后者不补0

  • 分钟: i, 秒s , 12小时制配合上午下午: 小写是a(只用一个a就表示 上午或下午了.), 大写是A.

关于date的时区?

  1. 时区支持, 亚洲只支持三个: Chongqing, Shanghai, Hong_Kong 其他任何 都不支持. 如果时区 不合法(invalid), 将会返回一个

E_NOTICE级别(共E_NOTICE, E_WARNING, E_ERROR)的 错误信息.

  1. 地区/时区, 不限大小写,比如: Asia/Chongqing, 和 asia/chongqing 都是可以的.
    修改时区有三种方法:
  • date_default_timezone_set('Asia/Shanghai');
  • ini_set('date.timezone', 'Asia/Shanghai'); // 这两种方法都是临时设置的, 不会改变 php.ini中的内容. 相当于 临时修改selinux: setenforce 1
  • 永久性的修改 [date] 节的 date.timezone = ...
    date节是配置 php在使用date函数的时候,的时区问题
  1. 时区 有很多种制度, 一种是UTC(世界协调上:universal time coordinate) 一种是GMT(Greenwich mean time格林尼治平均时) 两者看成是 基本上一样的.

不加以区分. 编程中都使用UTC 时间

  • 本地时间 = UTC + 时区时差.
  • 东区的时差为正, 西区的时差为负 ,比如我国的本地时间 都认为是: +0800, 相当于 08:00 分钟, 刚好比 UTC 快8个小时.
  • php.ini中默认的时区是 UTC, 所以 ,如果你不设置/修改时区, 那么得到的时间就 刚好比系统时间(当前时间)慢 8个小时.
  1. 关于时区的函数有:
    date_default_timezone_set(...), date_default_timezone_get()获取默认的时区(在php.ini配置中的)
    ini_set('name', value); ini_get('name')获取配置值.

  2. It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the

date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely

misspelled the timezone identifier. : (rely on: 依靠什么事物, 而depend on通常是依赖什么人, in case (of/that) 跟if的区别: in case是万一, 假

设说, 退万步来说...)

即: 如果你 使用time()或date函数, 那么你就要用 date_default_timezone_set(), ini_set()来设置, 否则你不设置就可能是不安全的...

杂项:

熵: 表示混乱程度: entropy ['entr2pi]
mime[maim], 表示资源的类型. 它本身也是有意义的单词" 哑剧, 哑剧演员; 演哑剧"

tp中的NOW_TIME 是什么

可以看出, $_SERVER服务器的信息, 还是很重要的, 很多程序中要用到的判断,比较等信息, 都是从 $_SERVER中得到的.

class App {

    /**
     * 应用程序初始化
     * @access public
     * @return void
     */
    static public function init() {
        // 加载动态应用公共文件和配置
        load_ext_file(COMMON_PATH);

        // 日志目录转换为绝对路径 默认情况下存储到公共模块下面
        C('LOG_PATH',   realpath(LOG_PATH).'/Common/');

        // 定义当前请求的系统常量
        define('NOW_TIME',      $_SERVER['REQUEST_TIME']);
        define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']);
        define('IS_GET',        REQUEST_METHOD =='GET' ? true : false);
        define('IS_POST',       REQUEST_METHOD =='POST' ? true : false);
        define('IS_PUT',        REQUEST_METHOD =='PUT' ? true : false);
        define('IS_DELETE',     REQUEST_METHOD =='DELETE' ? true : false);

retunr  NOW_TIME >=$start && NOW_TIME <=$end;


'SERVER_SIGNATURE' => string '' (length=0)
  'SERVER_SOFTWARE' => string 'Apache/2.2.17 (Win32) PHP/5.3.5' (length=31)
  'SERVER_NAME' => string 'localhost' (length=9)
  'SERVER_ADDR' => string '127.0.0.1' (length=9)
  'SERVER_PORT' => string '80' (length=2)
  'REMOTE_ADDR' => string '127.0.0.1' (length=9)
  'DOCUMENT_ROOT' => string 'C:/wamp/www/' (length=12)
  'SERVER_ADMIN' => string 'admin@localhost' (length=15)
  'SCRIPT_FILENAME' => string 'C:/wamp/www/test.php' (length=20)
  'REMOTE_PORT' => string '50364' (length=5)
  'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
  'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
  'REQUEST_METHOD' => string 'GET' (length=3)
  'QUERY_STRING' => string '' (length=0)
  'REQUEST_URI' => string '/test.php' (length=9)
  'SCRIPT_NAME' => string '/test.php' (length=9)
  'PHP_SELF' => string '/test.php' (length=9)
  'REQUEST_TIME' => int 1525318431



### strpos和strstr的区别? strpos是判断hay中是否含有needle? strstr 是返回 hay中needle第一次出现位置 到最后/或最前(search_before=true)的字符部分.

**在使用这两个函数时, 如果搜索字符串是 反斜杠, 要用两个反斜杠: '\' 如果只用一个反斜杠, 会报错! **

即 如果只是判断是否存在, 不返回子串, 就用 strpos就行了, 这个效率更高

检测自定义命名空间 否则就以 项目应用 APP_PATH: ./Application/ 为命名空间, 注意不是 httpd 的根目录/, 也不是模块 Application/Home或Admin. 也就是说, 不一定要完全定义命名空间, 项目根目录APP_PATH下的目录也可以autoload! 比如: APP_PATH . 'Component/'

在控制器的操作中, 如果不是以反斜杠 开头的类, 则是 认为 在 Controller目录下开始查找类.... 这个是反复提到的了!

namespace Think;

class Think{

	........
    public static function autoload($class) {
        // 检查是否存在映射
        if(isset(self::$_map[$class])) {
            include self::$_map[$class];
        }elseif(false !== strpos($class,'\\')){
          $name           =   strstr($class, '\\', true);
          
	// 求出路径信息 $path
	if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ 
              // Library目录下面的命名空间自动定位
              $path       =   LIB_PATH;
          }else{
              // 检测自定义命名空间 否则就以模块为命名空间
              $namespace  =   C('AUTOLOAD_NAMESPACE');
              $path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;  因为这个 即使没有在 AUTOLOAD_NAMESPACE中定义, 所以, 它是 以 APP_PATH即: Application/目录为起始路径的...

          }

	// 生成类文件名
          $filename       =   $path . str_replace('\\', '/', $class) . EXT;  // 就是 应用目录下的类.

	// 最后import导入类.
	.........
}


  1. 类的自动加载时由 ThinkPHP/Library/Think目录下的Think类 的 静态函数autoload: static public function autoload(){...} 来实现的.注意不是__auto. 这个里面实现了 "tp框架自动加载的"步骤和过程.

  2. 为了调试tp框架, 或者跟踪/查看框架的执行过程, 也可以在框架中(的某些函数里面)是有 echo, dump等 结合 段落p 分行线 hr等 进行输出. 比如Think::autoload函数中的 \(class. 经过echo就可以看出,他不包含: new \Component\Foo() 类, 最前面的反斜杠.\)class=Comopent\Foo.

  3. 为了不让tp框架输出自定义的 错误, 而是让php输出更详细的错误信息, 可以注释掉框架 Think::start()函数中的 错误和异常 "设置"语句 即: regitster_shutdown_function('Think\Think::fatalError'); set_error_handler('Think\Think::appError'); set_exception_handler('Think\Think::appException');

### 要跟踪tp框架的执行过程和步骤, 其实只需要看一个函数就好了, 就是Think::start() 这个里面有非常详细的执行过程和注释.
...
class Think{
...
  static public function start() {
      // 注册AUTOLOAD方法
      spl_autoload_register('Think\Think::autoload');      
      // 设定错误和异常处理
      register_shutdown_function('Think\Think::fatalError');
      set_error_handler('Think\Think::appError');
      set_exception_handler('Think\Think::appException');

      // 初始化文件存储方式
      Storage::connect(STORAGE_TYPE);
      
      // 部署模式下的运行时文件.
      $runtimefile  = RUNTIME_PATH.APP_MODE.'~runtime.php';

....

  public static function autoload($class) {
        // 检查是否存在映射
	// 打印实际传入的类名称, 结合段落标签 <p> 进行分段输出, 就 不必用br等来控制分行了. 每次都带一个 <p> 的话, 就不必用关闭标签</p>
        echo '<p>自动载入的类: '.$class.;    

        if(isset(self::$_map[$class])) {
            include self::$_map[$class];               // 注意 , 自动载入实际上 使用的是 include 语句. 注意 Think类的所有成员变量和成员函数 都是 静态的!!! 包括: static private $_map.
        }elseif(false !== strpos($class,'\\')){
          $name           =   strstr($class, '\\', true);
		  echo '<p>取得根命名空间名:'.$name.'  ';    // 这里显示的是根命名空间, 是 最前面的那个路径名称, 是第一个路径名称, 不包含子路径.

        // 根据上面的$name, 来确定 自动载入的 路径: $path
          if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){  // 如果是Libray下的目录(包括Think或非...目录), 则自动载入LIB_PATH
              // Library目录下面的命名空间自动定位
              echo $path       =   LIB_PATH;
          }else{
              // 检测自定义命名空间 否则就以模块为命名空间
              $namespace  =   C('AUTOLOAD_NAMESPACE');
              $path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;
             echo  '<p>自动转入的路径是: '. $path;
          }

         // 确定自动载入的类名 = 路径+类名
         $filename       =   $path . str_replace('\\', '/', $class) . EXT;
	  echo '<p>载入的文件名是:'.$filename.'</p> <hr>';    // 这里用 <hr> 来分区输出

自动载入的类文件 是 去掉最前面的 反斜杠: 比如: new \Component\ABC\Foo() 那么 类名就是 Component\ABC\Foo : 对应的\(name就是 Component, 于是走elseif路径, 得到的\)path就是 APP_PATH, 然后组装成的 完整类名 被 include的是: $filename= $path. str_replace('\', '/', \(class). EXT; 即: 根命名空间Component 和子目录和类名 ABC\Foo是由\)class得到的, 文件的扩展名是 由 EXT得到的 就是: ./Application/ + Component/ABC/Foo + .class.php


关于tp中的session的应用

session是一个类,可以创建很多个类实例化对象, 每个对象的属性就是设置参数, 包括id, name, expire, path, prefix, domain, use_cookie

type等

session的所有函数都是同一个函数, 只是参数的格式不同: 包括初始化(数组参数), 设置属性值, 获取属性值,删除用null, 判断用?, 管理用中

括号['...'](牢记null和''的不同了, ''你要记得它始终是一个字符串)

===============================

关于css中的问题?

body: min-width: 320px; min-width是在css2中就支持的属性了, 它是设置元素的最小宽度.

opacity: 不透明度, 可以单独设置, 那么会针对这个元素中的所有内容进行设置.比如: `h1{ color:rgb(0,0,0); backgournd-color: rgb

(255,255,255); opacity: 0.5; `
也可以根颜色值 相结合, 即使用 rgba属性来写. 比如: rgba(100,120, 140, .87);

rgb属性的写法其实根16进制的写法是一样的. 数字越大, 颜色越浅,比如:rgb(200,200,200)基本上就是灰色了. 要习惯用这种rgb的方式来写颜

色, 这是css3的写法.用#号来写的称为传统写法了

rgba的写法, 可以使用在任何需要 颜色的地方, 比如: color, background-color, border中的颜色等等.

**strpos除了可以作为 判断 字符串是否包含字符外, 还可以用来作为 截取字符串时的位置定位, 比如: ` substr(\(com, -strpos(\)com, '\

')+1, 4) ` 因为strpos本身返回的就是一个整数... **

blockquote????

line-height:1.4285em是多少像素


css: 数值为0 的时候, 可以加px ,也可以不加px
hr同样可以加 border, margin等属性. 如果没有border ,hr是一条很细的线,加了border后,线就变粗了

如何控制浏览器窗口的最小宽度和文本的最小宽度?

  1. 这是两个不同的事情, 用鼠标拖动改变浏览器窗口的最小宽度,是 鼠标事件, 因此要通过js的脚本来实现; 而 文本元素比如div, p等的最小宽度,是css控制的.

  2. css的元素dimension 不只是常见的height, width, 还有几个属性: max-width,min-width, max/min-height,line-height等.

min-width的作用最明显: 在布局时,我们常见的一种布局是: 左边一个导航栏(或其他辅助布局栏, 通常要固定宽度, 比如350px) + 中间一个main内容显示栏+ 右边右浮动的布局栏. 中间那个内容栏通常要求是 内容在宽度上自适应的. **怎样实现自适应? 很简单, 只要你不去设置内容div容器的宽度width属性,那么它就是 宽度自适应的.(当缩小浏览器窗口时, div中的内容自动向下排列就是自适应) **
这个有时候会产生问题: 当宽度自适应到很小的时候, 原来在水平方向上的布局就会被破坏, 从而使页面布局变得很坏.

这时候, 就可以设置内容容器的 min-width属性: 起先,div的内容宽度自适应, 然后当浏览器窗口缩小到某个位置时, 将要破坏水平布局的情况下, min-width 将阻止 "内容自适应", 即div中的内容不再 向下排列,而是出现一个水平滚动条, 水平方向上多余的内容 (部分元素) 将被遮挡住, 你需要拖动水平滚动条来浏览. (但是它的布局就能够保持不变!) 这个就是min-width的作用.

1.通常在页面的 header头部和footer尾部 以及main的内容部分, 使用 min-width, 能够确保布局的不被破坏, 改变.

但是, 你要注意, 这个 min-width属性 跟浏览器窗口 能否一直/继续 水平缩小, 是两码事. 在设置了 min-width的情况下, 窗口是仍然够 继续拖动缩小的! 除非你用js 来控制 窗口 的拖动缩小!

  1. 控制浏览器窗口拖动缩小的js代码是:
$(window).resize(function(){
	if(document.body.clientWidth<350){
	    window.resizeTo(document.body.clientHeight, 350);
}

});

posted @ 2018-05-02 19:53  noitanym  阅读(417)  评论(0编辑  收藏  举报