SVN命令补充

1.更新svn仓库不打印信息
svn update -q
2.更新svn仓库到指定版本
svn update -r{}
-r [–revision] ARG : ARG (一些命令也接受ARG1:ARG2范围)
版本参数可以是如下之一:
NUMBER 版本号
‘{‘ DATE ‘}’ 在指定时间以后的版本
‘HEAD’ 版本库中的最新版本
‘BASE’ 工作副本的基线版本
‘COMMITTED’ 最后提交或基线之前
‘PREV’ COMMITTED的前一版本

3.获取最新版本信息,并输出XML格式
svn info {SVN路径} –xml
4.获取提交历史并输出xml格式
svn log -xml -l 30查看最新30条记录
5.获取版本提交记录之间文件
svn diff -r6:2 –summarize
6.svn字母标示
A:add,新增
C:conflict,冲突
D:delete,删除
M:modify,本地已经修改
G:modify and merGed,本地文件修改并且和服务器的进行合并
U:update,从服务器更新
R:replace,从服务器替换
I:ignored,忽略

svnmanager安装

apt-get update
apt-get install apache2 subversion libapache2-svn
apt-get install apache2-utils
a2enmod dav_svn
apt-get install mysql-server mysql-client
apt-get install php5 php5-mysql php5-sqlite php-pear
pear install versionControl_svn
Failed to download pear/versionControl_svn within preferred state “stable”, latest release is version 0.5.2, stability “alpha”, use “channel://pear.php.net/versionControl_svn-0.5.2” to install
install failed
这样可能是软件的BUG,那就指定版本,注意不要安装0.5.0不然会报错
pear install versionControl_svn-0.4.0
apt-get install phpmyadmin
apt-get install php5-mcrypt
php5enmode mcrypt
创建SVN版本库父目录
mkdir /var/www/svn
创建验证用户访问权限文件
touch /var/www/svn/access
创建验证用户密码文件
touch /var/www/svn/passwd
更改文件权限
chmod 666 access passwd
新增站点
<VirtualHost *:80>
ServerName dev.svn
DocumentRoot /var/www/svn
<Directory /var/www/svn>
order allow,deny
Deny from all
</Directory>
Include /etc/apache2/svn/*.conf
</VirtualHost>
新建svn
<Location />
DAV svn
#如果是多个站点可以用这个
SVNParentPath /var/www/svn
Authtype Basic
AuthName ‘SVN’
AuthzSVNAccessFile /var/www/svn/access
AuthUserFile /var/www/svn/passwd
Require valid-user
</Location>

部署svnmanager
wget http://prdownloads.sourceforge.net/svnmanager/svnmanager-1.08.tar.gz
mkdir /var/www/html/svnadmin
搭建站点
<VirtualHost *:80>
DocumentRoot /var/www/html/svnadmin
ServerName svnadmin
<Directory /var/www/html/svnadmin>
Options -Indexes +FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
ErrorLog /var/www/logs/svnadmin.error.log
CustomLog /var/www/logs/svnadmin.access.log common
</VirtualHost>
为svnmanager创建数据库
create database svnmanager;
grant all privileges on svnmanager.* to ‘svnmanager’@’localhost’ identified by ‘123456’;
flush privileges;
exit
配置svnmanager
cp config.php.linux ./config.php
编辑config.php
$htpassword_cmd = “/usr/bin/htpasswd”;
$svn_cmd = “/usr/bin/svn”;
$svnadmin_cmd = “/usr/bin/svnadmin”;

//Subversion locations
$svn_config_dir = “/var/www/svn/svnconfig”;
$svn_repos_loc = “/var/www/svn”;
$svn_passwd_file = “/var/www/svn/passwd”;
$svn_access_file = “/var/www/svn/access”;
$dsn = “mysql://svnmanager:123456@localhost/svnmanager”;
错误提示
Fatal error: Class ‘PEAR_ErrorStack’ not found in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\
svnmanager\svnmanager\
RepositoryModule\UserPrivilegesEditPage.php on line 204

解决方法:
pear uninstall VersionControl_SVN-0.5.0 卸掉0.5.0
pear install PEAR-1.9.4
pear install VersionControl_SVN-0.4.0 重装0.4.0就没报这个错了

 

CSRF原理和防范

一.CSRF
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
二.影响
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
三.过程
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
四.CSRF的防御
1.所有表单都包含同一个伪随机值(TOKEN)
2.验证码
3.检测refer

PHP技术点A

1、合并数组(array_merge和+的区别)
array_merge如果两个数组存在相同的key,后面的会覆盖前面的
备注:如果是数字索引,则不会覆盖,每个元素会压入新堆栈中
+操作符如果两个数组存在相同的key,前面的会覆盖后面的
备注:效果类似代码foreach每个数组元素,然后将每个元素压入一个新堆栈当中,如果同样的key已经存在则不处理
2、判断是否整数

$arr = array(1,'1','+1', '-1',0x23, 0xab,octdec('77'));
foreach ($arr as $v) {
echo $v."===>";
var_dump(is_int($v));
var_dump(is_numeric($v));
var_dump(is_num($v));
echo '
';
}
function is_num($int){
if(is_numeric($int) === TRUE){
if((int)$int == $int){
return TRUE;
}
}
return FALSE;
}

3.字母转换大小写

= 97 && $v<= 122){  
            $v -= 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}
function mystrtolower($a){  
    $b = str_split($a, 1);  
    $r = '';  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 65 && $v<= 90){  
            $v += 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}
//字符串替换
$arr1 = array('a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$arr2 = array('A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$str = '中文aDb%3234&acd';
echo mystrtoupper($str);
echo '
'; echo mystrtolower($str); echo '
'; echo str_replace($arr1, $arr2, $str);

PHP5.3~PHP5.5新特性汇总

一.PHP 5.3中的新特性

1. 支持命名空间 (Namespace)
2. 支持延迟静态绑定(Late Static Binding)
3. 支持goto语句
4. 支持闭包、Lambda/Anonymous函数
5. 新增两个魔术方法__callStatic()和__invoke()
6. 新增Nowdoc语法
7. 在类外也可使用const来定义常量
8. 三元运算符增加了一个快捷书写方式:
9. HTTP状态码在200-399范围内均被认为访问成功
10.支持动态调用静态方法
二、PHP5.4中的新特性
1. Buid-in web server内置了一个简单的Web服务器
2.Traits(灵活的代码重用机制)
3. 数组简短语法
4. Array dereferencing 数组值
5. Upload progress
Session提供了上传进度支持,通过$_SESSION[“upload_progress_name”]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
6. JsonSerializable Interface
实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。
7. Use mysqlnd by default
8.实例化类
9.支持 Class::{expr}() 语法
10.Callable typehint
11.函数类型提示的增强
12.新增加了$_SERVER[“REQUEST_TIME_FLOAT”],这个是用来统计服务请求时间的,并用ms来表示
13. 让Json更懂中文(JSON_UNESCAPED_UNICODE)
14. 二进制直接量(binary number format)
PHP 5.4.0 性能大幅提升, 修复超过100个bug.
废除了register_globals, magic_quotes以及安全模式。
另外值得一提的是多字节支持已经默认启用了,
default_charset从ISO-8859-1已经变为UTF-8.
默认发送“Content-Type: text/html; charset=utf-8”
三、PHP5.5新特性
1、放弃对Windows XP和2003 的支持
2、弃用e修饰符
3.新增函数和类
4.一个简单的密码散列API
5.新的语言特性和增强功能。
6.调用empty()函数(和其他表达式)一起工作
目前,empty()语言构造只能用在变量,而不能在其他表达式。
在特定的代码像empty($this->getFriends())将会抛出一个错误。作为PHP5.5 这将成为有效的代码
7.获取完整类别名称
8.参数跳跃
9.标量类型提示
10.Getter 和 Setter
11.生成器
12.列表解析和生成器表达式
13.finally关键字
14.foreach 支持list()
15.增加了opcache扩展
16.非变量array和string也能支持下标获取了

参考:

http://php.net/manual/zh/migration53.new-extensions.php

http://blog.csdn.net/black_ox/article/details/21163193

http://php.net/manual/zh/migration52.php

http://php.net/manual/zh/migration53.php

http://php.net/manual/zh/migration54.php

http://php.net/manual/zh/migration55.php

 

PHP5.4新特性trait

php 
//代码片段1
class Hello {  
    public $id = 2;  
    public function __construct() {  
        echo 'constructHello! 
'; } public function sayHello() { echo 'Hello
'; } } interface World { public function sayWorld(); //{ //echo 'World
'; //} } class MyHelloWorld extends Hello implements World{ public function __construct() { echo 'constructMyHelloWorld
'; } public function sayHello() { echo 'Hello
'; } //use Hello, World; public function sayWorld(){ echo 'World
'; } public function saySelf() { echo '!
'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->saySelf(); echo $o->id; //代码片段2 php trait Hello { public $id = 2; public function __construct() { echo 'constructHello!
'; } public function sayHello() { echo 'Hello
'; } } trait World { public function sayWorld() { echo 'World
'; } } class MyHelloWorld{ public function __construct() { echo 'constructMyHelloWorld
'; } public function sayHello() { echo 'Hello
'; } use Hello, World; public function saySelf() { echo '!
'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->saySelf(); echo $o->id;

 

xhprof使用说明

if (mt_rand(1, 10000) == 1) {  //采集请求的万分之一
   //xhprof_enable(XHPROF_FLAGS_MEMORY);//生产环境尽量不要统计CPU信息啊
   xhprof_enable(XHPROF_FLAGS_CPU+XHPROF_FLAGS_MEMORY);  
   $xhprof_on = true;  
} 
foo();
$data = xhprof_disable();
print_r($data);
//导入的这些文件都在下载的xhprof压缩包根目录下
include_once "../xhprof_lib/utils/xhprof_lib.php";
include_once "../xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHprofRuns_Default();
echo $run_id = $xhprof_runs----->save_run($data, "test");//test类似空间概念
function foo(){
    echo 'test';
}

打印数据说明
ct 函数调用次数,
wt 花费的时间,
cpu 花费的 CPU 时间(微秒即百万分之一秒),
mu 使用的内存(bytes),
pmu 使用的内存峰值(bytes)。
查看结果:
一)看单一运行报告

要查看run id是和命名空间是的报告,访问URL:

http:///index.php?run=&source=

例如,

http:///index.php?run=49bafaa3a3f66&source=test

二)查看diff报告

要查看命名空间下runid分别是< run_id1>和的两个报告,访问URL:

http:///index.php?run1=&run2=&source=

三)汇总报告

您也可以指定一组run id来汇总得到您想要的报告视图。

如果你有三个XHProf运行,都在”benchmark‘命名空间下,run id分别是1,2,3。要查看这些运行的汇总报告:

http:///index.php?run=1,2,3&source=test

加权汇总 :进一步假设,上述3个运特分别对应三种程序,p1.php,p2.php和p3.php ,通常以20%,30%,50%概率混合:要查看汇总报告所对应的加权平均数这些运行使用:

http:///index.php?run=1,2,3&wts=20,30,50&source=test

数据字段说明
Calls:函数的调用次数
Incl. Wall Time (microsec) :包含内部函数花费的时间,单位微秒
Excl. Wall Time (microsec):不包含内部函数花费的时间,单位微秒
及所占百分比(%)

注:Incl.:为 Including 包含的简写
Excl.:为 Excluding 不包含的简写
Wall Time:任务花费的时间

备注:当然实际生产环境不会每次都会统计,可以采集万分之一的请求,并且生产环境一般不会开启CPU计数信息

 

XHProf安装

下载地址:
https://pecl.php.net/package/xhprof
[xhprof-0.9.4]
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2
cd extension
phpize#如果没有则可以安装apt-get install php5-dev
./configure
make && make install
然后修改php.ini
添加
extension=xhprof.so
;保存目录 在页面输出测量得到的数据的时候
;它会自动到这儿来找输出的文件。
xhprof.output_dir=/tmp

PHP7参考:https://github.com/Yaoguais/phpng-xhprof