待续未完- 自己写后台内容管理程序的辅助内容

像/sbin/nologin的用户既不能 登录, 也不能 用su 进行切换, 比如apache是 服务httpd的运行用户, 但是 它是 sbin/nologin的 所以 它也不能用 su apache

硬链接和 软链接的表示区别?
软连接可以用 ls -l来查看, 如果是软连接的话, 会显示 一个l, 而且有箭头指向.
但是 硬链接 即使用 ll 也没有什么显示符号. 因为他们是两个 (虽然相关联的 )实体文件. 所以要判断两个文件是否是 硬链接, 要看他们 的 inode 节点编号是否一致.
默认的 ln命令 创建的是 硬链接: ln f_sourece f_ln_destination

[root@localhost html]# diff --side-by-side /bin/chmod /usr/bin/chmod
[root@localhost html]# ll -i /bin/chmod
18482702 -rwxr-xr-x. 1 root root 65692 Sep 17  2015 /bin/chmod
[root@localhost html]# ll -i /usr/bin/chmod
18482702 -rwxr-xr-x. 1 root root 65692 Sep 17  2015 /usr/bin/chmod      // 由于 这两个文件的 inode是相同的,所以 他们是 硬链接. 
[root@localhost html]#                                  // 由此也可以知, /bin/*  和 /usr/bin/* 的关系, 其实 它们 之间(目录下的很多命令) 就是 硬链接的 关系. 这个是为了 用户使用和管理上的方便而这样设置的 


linux 下, 提示 目录权限不够, 不能写入 ./Application, 需要手动创建目录, 通常就是 两个原因 , 一个是目录 的权限, 一个是 selinux 的影响, setenforce 不正确, 关闭selinux或正确设置 enforce 就能够完成.

一个很简单的问题, selinux通常 只对 服务 程序做出限制,比如 httpd 等, 对一般 的 应用程序 不做限制; 而 恰恰httpd这种应用会受到selinux的影响.

ll -Z 中的 selinux属性, 通常限定3个方面的内容: _u(user), _r(role), _t(type) 最重要的就是这个type 因为selinux的核心思想就是 限定服务程序如httpd等 只能 操作 特定类型的 文件(就像那个比喻一样, 一种工具如锤子, 没有selinux限定时可以用来 砸任何东西,包括你的 电视机手机钻石等, 这样就非常危险, 而有了selinux的限定, 锤子就只能用来砸石头, 木头等不能用来砸前面那些贵重的物品, 这样的工具就安全了). type 通常是根据 文件/包括 目录的位置, 功能/ 用途来决定的. 比如 ~/Downloads+Documents等目录下的文件的类型都是 user_home_t, 而 /etc下面的文件和目录很多都是 etc_t的类型. 很多服务软件的 selinux 的类型是 : system_u:object_r:httpd_sys_content_r:s0, 或 相应的配置文件的selinux是: system_u:object_r:httpd_config_t:s0

### 而很多时候, 开发网站的时候, 文件(index文件, 其他框架tp等 ) 都是从其他目录 拷贝过来的. (不会是自己去一个一个手动创建的...) 所以 通常不会是 和 /var/www/html 或 /var/www 的context属性相同的. 所以 会 出现访问问题. 但是这种 限制和 问题, 通常并没有多大的实际意义. 所以 是可以将 selinux关闭的 : setenforce 0 就好了. 如果不关闭, 也可以 参考 /var/www 或 /var/www/html目录的 context属性 进行设置 就好了

即使是在 nautilus资源管理器中,如果当前登录用户是普通用户foo, 那么你在删除 非foo用户的 文件/目录时, 按"del" 是没有反应的, 这是因为 用户的 权限 permission 不够.

在使用 su -c 命令的时候, 要注意两个特殊符号的意义表示的不一致: 相对目录符号 ./, ../,表示的是 相对于 当前目录pwd而言的, 跟root用户无关, 但是 其中的 ~家目录符号表示的则是 root用户的家目录. 不再是当前用户的家目录.

[foo@localhost html]$ su -c 'cp ~/Downloads/thinkphp_3.2.3_full.zip  ./'
Password: 
cp: cannot stat ‘/root/Downloads/thinkphp_3.2.3_full.zip’: No such file or directory
[foo@localhost html]$ pwd
/var/www/html
[foo@localhost html]$ su -c 'cp /home/foo/Downloads/thinkphp_3.2.3_full.zip  ./'
Password: 
[foo@localhost html]$ ls 
Test  thinkphp_3.2.3_full.zip

在html中的文件和目录, 不一定 必须设置为 apache:apache所有, 只要 apache用户能读 (目录能x)就可以.

如果有大量的工作, 都是需要 root权限来 完成的, 那么就应该 切换到root来做, 而不宜 老是用 su -c 或 sudo来做. 后者只是用在 临时的工作用root权限来完成时适用, 而不应该那么死板.

所谓的重写规则, 主要目的就是 " 省略 index.php这个入口文件" 重写条件是 : RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f 重写规则是 在 请求内容url的前面加上index.php RewirteRule ^.*$ index.php/$1 这里的 $1就是一个后向引用前面的正则匹配, 很简单的.

要注意的是,如果你事先删除了tp解压缩后的目录 Applicatioon 和 Public目录, 然后你执行 localhost的时候, 只会生成 应用目录Application/, 而不会 再 自动生成 Public目录, tp建议的 应用的公共资源文件(如img,css,js等) 应放在Public目录中, 这个Public目录就要自己手动去创建了.


js的匿名函数,是指省略了函数名的函数, 如 function foo(){...} 写成匿名函数,则是: function() {..} 而闭包, 则是调用匿名函数时, 在 匿名函数 定义的同时 进行调用, 在匿名函数的外面加上括号就好了. (function(a, b){return a+b;})(10,20);

php代码和html代码可以完全的, 任意的 混合书写. 一是如果php代码中 只有少量的html代码, 可以把html代码放在echo语句中输出.
但是如果html代码较多, 则不能用php的echo, 要直接写,把html代码放在 php的外面;
这时, 要注意,在书写if, foreach while等 结构体的时候, 由于包括大括号, 如果大括号 中间的内容, 包含有 html代码时, 结尾有一个php的 结束大括号, 那么这个 结束大括号 "}" 要放在 php中,比如: <?php } ?>

php5.0中的魔术方法? 参考: https://zhidao.baidu.com/question/239519931669879124.html

  1. 魔术方法都是针对 php5.0后面向对象/支持对象feature特征 而使用的;
  2. 魔术方法的表示 跟 魔术常量的 表示不一样! 魔术常量是 两端都有两个下划线, 比如: _ FILE _, 而魔术方法则只是在方法名的前面加两个下划线;
  3. 大多数魔术方法是表示在 某个操作不存在时, 调用该魔术方法, 但也有不一致的.具体表示:
__construct() **魔术**构造函数, 当有和类同名的 构造函数时, 优先调用 __construct
__deconstruct() 魔术析构函数.
__set() __get(), 这两个函数, 当成员变量存在时, 直接使用成员变量, 当成员变量不存在时就调用这两个函数.
__tostring()在调用 echo $obj, print $obj时调用__tostring函数.
__clone()是在 执行 $foo2= clone $foo1;  克隆语句时自动调用的.
__call()函数, 和 __autoload() 函数的区别是, __call是用来调用类的成员函数, 当成员函数不存在时就调用这个__call()函数.而__autoload是调用类, 当 $obj = new fooClass()   类不存在时, 就会调用该 __autoload函数.
还有一个 __sleep()和 __wakeup()的魔术函数, 它是在类 序列化和反序列化的时候, 调用的, 分别做一些辅助/准备工作
__isset和 __unset俩个魔术函数, 是在判断 类的 成员变量 是否设置时,或 删除 一个类的成员变量时 会 自动调用他们, 比如 if(isset($class_obj->memName))  和  unset($obj->memName) 

tp中的 "加载" 术语,表示的 实际上就是 指 "包含include/或require" 某个 核心文件, 比如 在 ThinkPHP.php文件中, 加载核心类, 实际上就是 : require CORE_PATH.'Think'.EXT;

thinkphp里面包含的东西, 有的是实用的, 有的是并不多大意义, 不必完全看的. 只要掌握最重要的东西就行了.

thinkphp3.2.3四种url模式的形式: 修改url模式方法是: 设置 URL_MODEL= URL_PATHINFO;

http://servername/index.php?m=module&c=controller&a=action&var=value 也支持直接的问号,在servername斜杠后面直接写问号... 比如:http://servername/?m=module....
普通模式 只解析m/a/c其他的参数名称 全都解析成普通变量的含义. 而且参数之间没有顺序. 像` http://localhost/?sm=Home&v=dex&m=Home&dd=s&c=Index 这样的地址是正常访问的`

pathinfo模式, **就是将 参数的 `名称=值` 对, 将其中的等号 写成分隔符的形式**, 比如: `localhost/?m=Home&c=Index 就写成: localhost/m/Home/c/Index`
在(URL_PATHINFO=1)pathinfo模式下有两种路径模式, 一种是普通路径模式: PATH_MODEL =1 必须写 参数名称的, 另一种是 对模块/控制器/操作这三个名称/键值对可以省略m,c, a这三个名称的, 但是后面的普通变量和值,必须写全 名称和值, 比如: `localhost/ Home/ Index/ Index/ id/1`

Rewrite模式, 跟pathinfo一样, 只是可以省略入口文件, 和可以使用正则重定向地址

Compat模式.  http://servername/?s=/Module/Controller/Action/var1/value1就是 普通模式和 pathinfo模式的 混合. 这里要注意的是, 默认的 兼容模式下的 参数变量名称是 "s" 这个不能记错了, 除非你去修改它 VAR_PATHINFO => 其他兼容模式的参数变量名...

url模式中, 一般不需要配置, 除非你多事: 可以配置的变量名称有: VAR_MODULE => ..., VAR_CONTROLLER, VAR_ACTION, VAR_PATHINFO, URL_PATHINFO_DEPR

thinkphhp的think_exception.tpl中的$e来自哪里?

整个配置文件, 除了tp本身的配置文件外, 包括 应用配置文件(整个的,总的 配置文件, 这个适用于各个模块都相同 的, 都使用的配置 ), 和 模块配置文件(这个是只适用于当前这个模块的配置, 而不适用于其他模块的配置项目)... 这两个配置文件是有区别的! 比如 url_pathinfo模式中的 参数变量VAR_MODULE名称配置 就只能在 应用配置文件中配置, 其他VAR-....可以在应用配置文件中,也可以在模块配置文件中配置.

tp中的 系统 规定的常量 , 和 模板中规定的常量 有多个 重名的 , 要注意他们表示的 含义和 返回的字符串是不同的! 比如:APP, URL, __ROOT__等等.


模块(即以前的分组)中的 控制器, 命名空间的相对路径?

  1. 使用相对路径, 写法更简洁. 只要能正确 区分和表达控制器就行
  2. 因为不管哪个控制器, 都是在应用程序目录下, 但是可能是在不同的模块中, 所以控制器的namespace 是相对于 应用程序目录. 但是从模块名称开始. 比如 namespace Home\Controller;

同样的, use引用核心 类 (Think)中的 控制器 类 的相对路径?
是 相对于 ThinkPHP下的 LIB_PATH, 因为我们引用的核心类, 都是在 THINK_PATH.'Library'下, 但是可能是Think下的,也可能是 Behavior下的, 或是 Org, Vendor下的. 所以, 引用库 类的 相对路径是 LIB_PATH, 即use 路径从 核心类库名称开始,如:use Think\Controller; 或者: use Behavior\FooBehavior

在tp3.2.3中, 所有的类 只有两个地方(按建议) 可以放置: 一个是 LIB_PATH 下, 应该 另外创建目录,比如 Foo, 或直接将类文件放在 原有的 Think目录下. 不能(不应该) 直接放在 LIB_PATH中. 另一个位置 是 Home的Controller目录下

从tp3.2.3后, 所有的类 在创建时, 都应该 声明命名空间.(防止跟其他命名空间的类重名), 如果是直接在 LIB_PATH的目录, 命名空间就直接写一个: namespace Foo; 如同Think目录下的类文件, namespace Think; 在引用类的时候, 应该从 根路径开始( tp系统类的根路径是 LIB_PATH, 写的时候, 用 "\" 表示. 比如: $page = new \Page\Pager()

不管是win还是 linux, 命名空间和use 引用类都 要使用 反斜杠, 不是 正斜杠.


  1. a的几个伪类的顺序? 参考: http://www.cnblogs.com/laixiangran/p/5245353.html
    原理就是 在考虑css样式的时候 有三个规则: 特殊性,继承性, 层叠性.
    a的几个伪类的特殊性和继承性相同, 所以 就要考虑层叠性, 如果不按这样的顺序 LoVe-HAte 排列. 则有些规则就不能使用.

另一种理解方法是:
首先页面载入时的初始状态, 要么没有被访问a:link, 要么是上一次已经被访问过的即a:visited
然后是链接操作,首先必须是hover, 然后才能active. 所以a的伪类顺序是:
a:link, a:visited, a:hover, a:active

当然,现代的浏览器都能够自动识别a的相关伪类了,所以这个也不必过分计较,只是一般情况下最好按照这个顺序写就是了。

  1. background的几个属性, 就是 -color, -image, 然后是 "重复和位置", background-repeat, background-position

  2. css中的 text-decoration: line-through是删除线,即文字的中间划线.
    text-transform是对文字的首字母或大写/小写的规定:
    capitalize: 是让每个 英文单词的首字母大写;
    uppercase: 是让所有的字母都大写, 同理的, lowercase是让所有的字母都小写

word-spacing, letter-spacing, 表示的是单词之间的间距, 和字母之间的间距 white-space: 空格的处理 但是, 这三个css属性基本上没有多大的影响.


<?php
$g = $_GET;
print_r($g);   // 在html之前就可以使用 php语句了。        
?>   
<html>
<head>
<title><?php echo $g['title'] ?></title>  <!-- 在任何地方,包括title处使用 变化的php量值  -->
</head>

<body>
<?php var_dump($g); ?>  <!-- 如果要表达php代码,一定要加上?php,否则会当做普通html内容输出 -->

<ul style="color: red;">  <!-- ul后面的li 会继承css属性 全都成red-->

<?php foreach($g as $k => $v){ ?>    <!-- 注意foreach中的$k 和 $v之间用的是 => 而不是等号,而且等号和箭头之间不能加空格,$v也可以使用引用& -->

<li> <?php echo $v; ?></li>

<?php } ?>  <!--结构化的} 是不需要输出的,所以不用echo -->

</ul>

</body>
</html>




<body>
<?php
echo '<br>';
echo  $_SERVER['SCRIPT_FILENAME'];
echo '<br>';

echo  $_SERVER['SCRIPT_NAME'];
echo '<br>';

echo  $_SERVER['PHP_SELF'];
echo '<br>';

echo  $_SERVER['REQUEST_URI'];
echo '<br>';

echo  $_SERVER['QUERY_STRING'];
echo '<br>';

var_dump($_SERVER);
?>

</body>

要注意的是, 不管是对win还是linux, $_SERVER 及其 索引都是 大小写 严格敏感的!


tp的错误显示模板 文件是: THINK_PATH.'/Tpl/think_exception.tpl'
处理错误的文件类可能有: CORE_PATH.'Dispatcher.class.php'文件,'App.class.php'文件,'Controller.class.php'文件等,

  • 如果是模块路由错误, 则会由 Dispatcher.class.php报错, 错误message是: '无非加载模块:...'
  • 如果是 控制器 错误, 则会由 App.class.php报错, 错误message是: '无非加载控制器:...'
  • 如果是 控制器中的 非法操作/不存在的操作 错误, 则会由 Controller.class.php报错, 错误message是: '非法操作:...'

php中使用未定义的常量, 会有Notice提示, 不是: error!
提示是: use of undefined constant: FOO. assumed FOO (assumed 可以认为是 "假冒的", 意思是 假冒的常量??)

tp的执行过程是: 总是从 index.php入口文件开始执行, 执行了中间 所有的过程后, 最后还是从 index.php入口文件中退出来的. 这个从你在index.php文件的最后 echo "something" 就可以 看得出来.

关于配置/设置 URL中, 模块/控制器/操作变量的问题?

首先, 在tp中, 几乎所有的 **配置项的名称** 都是大写的, 而且必须要加单引号, 如果不加引号, 不会报错, 会被当做是常量处理,但是配置项就不会生效,比如: `'VAR_MODULE' => 'module', `

其次, 在tp中, 如果要修改 模块变量/控制器变量/操作变量的名称, 必须在 应用配置文件 Application/Common/Conf/config.php 中设置, 如果在 模块配置文件 Application/Home/Conf/config.php中设置 'VAR_CONTROLLER' => 'controller' 是不会生效的. 但是tp3.2.3的说明文档中说的controller和action变量可以在 模块配置文件中配置, 这个跟实际 情况不符???

再次, 配置变量 'URL_MODEL' => 2 好像也要放在 应用配置文件中才能生效???


怎样查看 rewrite模块是否已经加载, 以及如果没有加载 , 如何加载 : 参考: https://www.howtoing.com/how-to-set-up-mod-rewrite-for-apache-on-centos-7/

apache的模块 加载配置 是在 /etc/httpd/conf.modules.d/目录下的. 而且, apache的大多数基础模块 是在 这个目录下的 00-base.conf 文件中, 被加载了. 包括 mod_rewrite.so重载模块

注意区别的是, 模块的名称 都是 ???module , 但是, 模块文件不一定都是 mod???.so
比如:

  • rewrite模块的名称 是 : rewrite_module, 对应的文件是: modules/mod_rewrite.so
  • 但是, php5模块的名称是 php5_module, 但是 它对应的文件不是 modules/ mod_php5.so 而是: libphp5.so libphp5-zts.so

**在httpd中, 要查看已经加载了哪些 httpd的模块, 可以通过命令选项 -M来查看( -M 就是 Modules的意思) , 比如: httpd -M, 就会列出 已经在 conf.modules.d/00-based.conf中加载了的 模块名称, 包括: rewrite_module, php5_module.. **


普通的html文件和php文件等也可以放在localhost目录下, 和tp共同相处,并不会矛盾,也不会冲突,即使放一个和tp完全不相关的test文件夹, apache也是可以 正常 访问到的

Dispatcher类的 非构造函数 ,有一个 dispatch()函数?

static和 public的位置随意的, 可以记住其中一个就行了. 在tp323中, 使用的是 static public/private function...

think_exception.tpl文件, 标题是"系统发生错误", 内容部分: 全部都有的是 <?php echo strip_tags($e['message']); ?>, 只有当设置了 $e的'file' 和 'trace' 信息后才会显示出错文件和 跟踪信息.

??? 魔术函数实例

配置文件加载次序:(有5个配置文件)
ThinkPHP/Conf/convention.php
应用配置文件 Application/Common/Conf/config.php
tp的语言配置文件, THINK_PATH.'/Lang/zh-cn.php'
调试配置文件 THINK_PATH.'Conf/debug.php'
模块配置文件 Home/Conf/config.php

显示页面跟踪信息?

  1. 这个是非常有用的信息 包括基本http交互请求信息, 文件的加载顺序(这个对理清tp的执行 加载次序有很大的帮助,流程和错误调试等对出错调试排错, sql对数据库操作等有很大帮助)
  2. 要显示页面右下角的页面跟踪按钮, 需要做如下配置.
必须开启程序的调试模式, 包括 APP_DEBUG => true , APP_STATUS => debug  SHOW_PAGE_TRACE => true等.
其中, APP_STATUS配置项可以不要

Tp的执行次序?(未完)?

入口文件: index.php -> ThinkPHP.php -> CORE_PATH.'Think.class.php'
确定存储引擎/驱动 CORE_PATH.'Storage.class.php' -> CORE_PATH.'Storage/Driver/File.class.php'
加载通用函数: THINK_PATH.'Common/functions.php'

依次执行 CORE_THINK.Hook.class.php -> App.class.php -> Dispatcher(获取模块/控制器/方法的名称) -> Route.class.php -> Controller.class.php -> View.class.php

准备好模板文件: THINK_PATH.BuildLiteBehavior.class.php -> ParseTemplateBehavior.. -> ContentReplaceBehavior
加载各种配置文件...

tp中函数的执行分两种情况?

如果直接写函数名称, 则表示 全局函数, 整个应用命名空间中的函数.
如果要引用 类的函数, 则一定要加限定符: 如果是静态函数, 加类名限定符: Foo::staticFunc, 如果是对象的函数 则要用$this->

php的对象全部 都是用 new 创建的, 全部都是指针, 全部都用 -> 箭头引用成员...

如果在部署和上线阶段, 为了屏蔽出错信息, 通常是要 设置 'APP_DEBUG' => False 来达到目的. 这时,think_exception.tpl只输出 系统发生错误, 但是不会输出具体的 $e['message'], 更不会输出错误文件和行 $e['file'], $e['line'], $['trace']等信息.

关于配置变量和语言变量.

  1. 获取或设置他们, 是使用对应的单字母函数, 配置用C函数 语言用 L函数.
  2. 都支持批量配置, 即用数组 来配置. 如: C(\(config_arr), L(\)lang_arr);
  3. 如果在模板中输出, 使用格式是: {$Think.Lang.lang_var} 注意的是, 大括号必须放在最外面,而不是$ 后面.

thinkphp的单字母函数?

在 使用 vim的某些插件, 比如 NERDTree等, 真的 是多么方便的~~ 好像?? 只有 root用户 才可以使用, 才有效! 所以, 如果你使用普通用户, 那么就可能用不起, 但是 vim也不报错, 也没有任何反应. 所以, 如果是自己的机器, 而且是 熟练用户, advanced user 高级用户的时候, 应该 是切换到 root用户 来操作的, 这样才能最大程度的 提高 工作效率.

在初始化tp的时候, 如果没有指明 APP_PATH时, 默认的appication是安装在 www/html的根目录下的!即Home, Common,和 Runtime 都将在同一目录, 并且和 ThinkPHP在同一目录中。

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

调整修改/切换 vim的多个子窗口, 参考: http://blog.csdn.net/shuangde800/article/details/11430659, 但是这些 多窗口的切换, 移动, 大小调整 其实 对 窄屏笔记本来说, 是不大合适的, 还是直接切换 缓冲区是比较 合适的 ...

^WHJKL: 是分别向左右上下移动窗口, 同时占据全部的高 , 全部的宽.
修改尺寸: ^w +-resize +-n这个是调整高度, ^w<,>vertical resize +-n是调整宽度. 有两个比较特殊的: = 是所有窗口全部大小相同. ^W| 是将当前子窗口 的宽度...调到最大, 其他窗口尽量缩小
注意去吧 窗口的光标切换和 床本身的移动: ^w t,b,w,p, 是切换, 而 ^W r/R x是 移动 .


很方便的 minibuffer插件, 其中星号表示的是当前编辑的文档, 每个buffer标签前面的数字,表示buffer的number, 可以直接用 :b?来切换, 另外, minibuffer上的标签排列顺序, 就是 可以用 bp, bn来表示 上一个/下一个的标签顺序.

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

在php中的 this, self, parent?

  1. 通常类中的 私有函数, 只有一个目的, 就是 供 本类的 (通常是公有的)成员函数来调用.

  2. this指向的是 类的 实例, 而如果要调用类的 静态函数或 静态成员, 就不能使用 this了, 因为静态成员不属于实例, 只属于类, 所以这时候, 就要用self::staticfunc, self::staticMember来调用了

  3. 要注意的是 调用静态成员的写法: self::$my_static_member. $符号要放在后面 , 而不像$this一样把$ 放在前面

  4. 静态函数的优缺点: 静态函数/成员 的效率比实例函数更高, 但是静态成员/函数, 不能 自动释放.

  5. 静态函数/成员, 由于始终占用的是同一块内存, 而实例成员每个成员占用的内存都不重复, 不一样, 所以, 静态函数/成员通常用于 统计/和累加的 地方.

  6. parent 主要是用来 调用父类的 构造函数!

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

配置参数中的 'URL_MODULE_MAP' 和 'URL_ROUTE_RULES', 'URL_MAP_RULES' ?

posted @ 2018-01-20 11:43  noitanym  阅读(229)  评论(0编辑  收藏  举报