使用 gitosis 管理 git 服务器

通过apt安装,gitosis使用SSH key来认证用户,但用户不需要在主机上添加账号,而是使用服务器上的一个受限账号。 安装的过程需要在客户端和服务器之间切换,留意操作步骤之前的说明。这里服务器和客户端都是使用ubuntu linux。

服务器端(ip:192.168.1.254)
1. 安装 git
sudo apt-get install git-core

2. 安装  python 和 python-setuptools
sudo apt-get install python python-setuptools

3. 安装gitosis

cd /tmp
sudo git clone https://github.com/tv42/gitosis.git
cd gitosis
sudo python setup.py install

PS:git://eagain.net/gitosis 已经失效了,找了好久才有一个新的。

4. 创建git用户

sudo adduser
–system
–shell /bin/sh
–gecos ‘git user’
–group
–disabled-password
–home /home/git
git

客户端(也需要先安装 git)
5. 在 gitosis 管理员的机器上生成 密钥,把公钥重命名为comet@3GCOMET.pub,这里用scp传到服务器上
ssh-keygen -t rsa
mv id_rsa.pub comet@3GCOMET.pub
scp comet@3GCOMET.pub comet@192.168.1.254:comet@3GCOMET.pub

6.在 ~/.ssh/config 添加以下内容,以便连接到服务器
Host 192.168.1.254
Compression yes
IdentityFile ~/.ssh/id_rsa

服务器端
7.使用上面的 comet@3GCOMET.pub 初始化 gitosis
sudo -H -u git gitosis-init < comet@3GCOMET.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

客户端
8.获取服务器上的 gitosis-admin 项目,会有keydir 文件夹和gitosis.conf
git clone git@192.168.1.254:gitosis-admin.git

9.添加新组jichuteam、用户comet@HP、项目jichu,并推送到远程服务器

注:如果客户端是windows,使用Puttygen生成公钥和私钥:参数为SSH-2 RSA,1024位,按需加上密码。

如果之前是使用ssh-keygen生成的,在这里直接Load private key,然后save private key,保存为ppk格式才能用。

复制puttygen显示的公钥保存为*.pub文件,注意不是”save public key”,保证公钥文件只有1行内容,否则不正确。把公钥给git的管理员,让他用gitosis-admin之类的方法把公钥加入git服务器,并设置好对应项目的权限。

在新的客户端生成密钥,并把公钥放到 gitosis-adminkeydir ,这里是comet@HP.pub
cd gitosis-admin
vi gitosis.conf

修改为下面内容,其中[gitosis]可以看gitosis/example.conf的说明,members 的 comet@HP 就是 comet@HP.pub 的文件名,多个用户用空格隔开
[gitosis]
gitweb = no
daemon = no
loglevel = DEBUG

 

[group gitosis-admin]
writable = gitosis-admin
members = comet@3GCOMET

[group jichuteam]
members = comet@HP
writable = jichu

git push

10.到其他地方建立项目根目录,并设置默认用户和邮箱,在.git/config添加远程服务器URL
mkdir jichu
cd jichu
git init
git config user.name Comet
git config user.email iamcomet@3gcomet.com
git remote add origin git@192.168.1.254:jichu.git

11.在 jichu 目录下进行开发,这里新建了 log.txt(一定要有新文件),提交到index,加上”initial import”信息并提交到本地仓库,最后是推送到远程服务器。
echo “begin develop” > log.txt
git add .
git commit -a -m “initial import”
git push origin master

服务器端
12.在服务器的 /home/git/repositories/ 可以看到有 jichu.git 的版本库。

linux常用svn命令

yum install subversion

安装完成之后, 你可以通过以下命令查看是svnversion版本信息:

svn –version

1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn addtest.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)

你不能直接使用 svn add * 命令,必须使用 “svn add * –force” 命令。
请放心,–force参数没有看上去的那么可怕,svn会自动判断,看这个文件是否值得添加,–force参数只不过是驱使 svn 去检查一个子目录,而不管这个子目录是否已经纳入管理
3、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [–no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
4、加锁/解锁
svn lock -m “LockMessage“ [–force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
svn info path
例如:svn info test.php
10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面写几个不经常用的
——————————————————————————
13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法:
1、mkdir PATH…
2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改

svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH…]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

随机数的生成函数,这里贡献给大家。

首先是要用mt_rand()函数生成指定个数的随机数字;

然后使用array_unique()函数去重;

因为去重了;所以得到的数字就不够指定个数了;

所以;核心是要用while循环;直到得到指定个数的数字;

到这里基本可以是结束了;

对于追求完美的人来说;还可以再用个sort();

目的不是要用来排序;主要是将得到的数组key格式化;

用代码来说话;就如下;

<?php
/**
* 生成不重复的随机数
* @param  int $start  需要生成的数字开始范围
* @param  int $end    结束范围
* @param  int $length 需要生成的随机数个数
* @return array       生成的随机数
*/
function get_rand_number($start=1,$end=10,$length=4){
$connt=0;
$temp=array();
while($connt<$length){
$temp[]=mt_rand($start,$end);
$data=array_unique($temp);
$connt=count($data);
}
sort($data);
return $data;
}

当然;重点不是这个函数;重点是这个函数的思路;可以解决很多类似的问题;

6f8cd40d-4516-4c6d-b602-fb8671ab5530

作为PHP开发者请务必了解Composer

Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的.

对于使用者来说Composer非常的简单,通过简单的一条命令将需要的代码包下载到vendor目录下,然后开发者就可以引入包并使用了.

其中的关键在于你项目定义的composer.json,可以定义项目需要依赖的包(可能有多个),而依赖的包可能又依赖其他的包(这就是组件的好处),这些都不用你烦心,Composer会自动下载你需要的一切,一切在于composer.json的定义.

Composer对于使用者来说是很透明,但是其背后的理念还是需要了解一下的,其的诞生也不是偶然的,得益于Github的快速发展,PHP语言也越来越现代化,显得更高大上了.

为了理解Composer,先大概了解下其结构:

Composer的结构

  • Composer命令行工具:

    这个理解就比较简单了,通过使用者定义的Composer.json去下载你需要的代码,假如只是简单的使用Composer,那么掌握一些具体命令就完全可以了

  • Autoloading代码加载器:

    通过Composer,开发者可以通过多种方式去使用,而其中的关键在于PHP的命名空间概念,以及PSR-4标准的发展,Composer只是根据这二者开发了一个代码自动加载器

  • Github:

    有了Github,PHP开发人员可以将开源的代码托管在这上面,而Composer的发展源于Github,Composer本质上就是将Github上的代码下载到本地.

  • Packagist:

    对于使用者来说使用的是Composer的命令行工具,那么命令行工具怎么知道有多少包可以被用户使用呢,这主要就是依赖于Packagist,Packagist是Composer主要的一个包信息存储库,包开发者将具体代码托管到Github上,将包信息提交到Packagist上,这样使用者就可以通过Composer去使用.

  • Composer根据本地定义的composer.json信息去查询Packagist,Packagist根据Composer.json/Package.json信息解析,最终对应到github仓库,Composer最终下载代码的时候还要依赖于Github仓库上的Composer.json,这里涉及到三种类型的composer.json,含义是不一样的.
  • Composer.json:

    这是Composer的核心,是Composer的规则,上面也提到了三种类型的Composer.json,在使用的时候一定要注意区分,我初学的时候就总是搞乱.

Composer命令行工具

composer init

使用者可以在自己的项目下创建composer.json以便定义你项目的依赖包,也可以通过composer init交互式的创建composer.json.

composer install

应该是最常用的命令,composer会根据本地的composer.json安装包,将下载的包放入项目下的vendor目录下,同时将安装时候的包版本信息放入到composer.lock,以便锁定版本.

其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包.

composer update

那么如何更新composer.lock以便获取到最新版本的包呢?通过这个命令即可更新最新版本的包

composer config

这个命令还是建议了解下,全局的配置保存在COMPOSER_HOME/config.json,非全局的配置信息则存储在本项目目录下.

composer configlistg

composer configg notifyoninstall false

composer global config bindirabsolute

composer create-project

这个命令不常用,但是个人觉得还是很重要的,使用普通的install命令是将项目所有的依赖包下载到本项目vendor目录下.而通过这个命令则是将所有的代码及其依赖的包放到一个目录下,相当于执行了一个git clone命令,一般是包的开发者可能为了修复bug会使用该命令.

composer global

这是一个全局的安装命令,它允许你在COMPOSER_HOME目录下执行Composer的命令,比如install,update.当然你的COMPOSER_HOME要在$PATH环境下.

比如执行composer global require fabpot/php-cs-fixer,现在php-cs-fixer命令行可以全局运行了,如果稍后想更新它,只需要运行composer global update

composer dump-autoload

当你修改项目下的composer.json的文件,并不一定要运行composer update命令进行更新,有的时候可以使用该命令来更新加载器,比如你要引用本地自定义的包(不是来自于packagist),后面会通过实践来说明该命令.

composer require

假如手动或者交互式创建composer.json文件,可以直接使用该命令来安装包

composer require  cerdic/csstidy:1.5.2

composer require “ywdblog/phpcomposer:dev-master”

–prefer-source和–prefer-dist参数

–prefer-dist:对于稳定的包来说,一般Composer安装默认使用该参数,这也能加快安装,比如有可能直接从packagist安装了相应的包,而不用实际去Github上下载包.

–prefer-source:假如使用该参数,则会直接从Github上安装,安装包后vendor目录下还含有.git信息

composer require “ywdblog/phpcomposer:dev-master”prefersource

#在vendor/ywdblog/phpcomposer目录下含有.git信息

如何给Composer添加代理

在国内使用Composer下载特别慢,可以通过二个方法进行加速

  • composer config repo.packagist composer “https://packagist.phpcomposer.com“
  • 编辑composer.json

“repositories”: {

  “packagist”: {

      “type”: “composer”,

      “url”: “https://packagist.phpcomposer.com”

  }

}

Autoloading代码加载器

composer本身集成一个autoloader,支持PSR-4,PSR-0,classmap,files autoloading.

这里通过一个例子来说明通过Composer如何引用classmap,files,本地符合PSR-4标准的代码

编辑composer.json

“autoload”: {

  “classmap”: [“othsrc/”,“classsrc.php”],

  “files”: [“othsrc/filesrc.php”],

  “psr-4”: {“Foo\Bar\”: “src}

}

composer dump-autoload

通过上述的操作,对于PSR-4来说等同注册了一个PSR-4 autoloader(从FooBar命名空间)

假如不想使用Composer的autoloader,可以直接包含vendor/composer/autoload_*.php 文件,配置自己的加载器.

具体的例子托管在github上,可参考.

Repositories

关于Repositories,了解其不是必须的,但是假如掌握则更能理解Composer,对于Repositories,其中文文档和英文文档解释的很好,这里也进行了一些摘抄.

基本概念

包:

Composer是一个依赖管理工具,它在本地安装一些资源包和包的描述(比如包名称和对应的版本),比较重要的元数据描述是dist和source,dist指向一个存档,该存档是对一个资源包的某个版本的数据进行的打包.source指向一个开发中的源,这通常是一个源代码仓库(比如git)

资源库:

一个资源库是一个包的来源.它是一个packages/versions的列表.

Composer将查看所有你定义的repositories以找到项目需要的资源包(这句话很重要).

默认情况下已经将Packagist.org注册到Composer(或者理解为Packagist.org是Composer资源库默认的仓库类型)

Composer资源库类型

Composer资源库包括四种类型,默认的是composer类型,也就是packagist.org所使用的资源类型.

它使用一个单一的packages.json文件,包含了所有的资源包元数据.当你将包发布到pckagist.org上,则默认系统会创建一个packages.json,不过我没有找到我的包对应的文件.

VCS资源库类型

假如你想构建一个私有的Composer私有资源库类型,可以使用该类型,这里举一个例子,比如你在自己项目的composer.json定义如下,则就可以使用对应的Github上的代码了.

{

    “repositories”: [

    {

        “type”: “vcs”,

        “url”: “https://github.com/ywdblog/phpcomposer”

    }

    ],

    “require”: {

        “ywdblog/phpcomposer”: “dev-master”

    }

}

当运行composer update的时候,Comoser实际上是从Github上下载包而不是从pckagist.org上下载.

另外假如需要使用Package资源库类型或者PEAR资源库类型,参考官方文档即可,一般在composer.json中定义name、version属性即可.

Composer.json

在本文上面也多次提到了composer.json,比如你希望使用第三方包则需要在本地定义composer.json,Composer安装第三方包后,也会在第三方包目录下发现composer.json,那么这二者都叫composer.json,有什么区别呢?理解这非常的重要.

假如你在自己的项目下面定义一个composer.json,则这个包称之为ROOT包,这个composer.json定义你项目需要的条件(比如你的项目可能依赖一个第三方包).

composer.json中有些属性只能被ROOT包使用,比如config属性只在ROOT包中生效.

一个资源包是不是ROOT包,取决于它的上下文,比如你git clone ywdblog/phpcomposer,则这时候本地phpcomposer目录就是ROOT包,假如你在本地phpcomposer目录下composer require ywdblog/phpcomposer,则这时候你的项目phpcomposer就是ROOT包.

了解composer-schema.json可参考该网址,Laravel作为一个成熟的框架,其定义的composer.json非常经典

关于包的版本

当使用者在本地配置composer.json的时候,可以指定需要包的特定版本,Composer支持从Github仓库中下载Tag或者分支下的包.

对于Github上的Tag来说,Packagist会创建对应包的版本,它符合X.Y.Z,vX.Y.Z,X.Y.Z-包类型,就是说Github上虽然只有一个特定版本的包,但Composer支持多种形式的引用方式,比如:

composer require monolog/monolog  1.0.0RC1

composer require monolog/monolog  v1.0.0RC1

composer require monolog/monolog  1.0.*

composer require monolog/monolog  ~1.10

对于Github上的分支来说,Packagist会创建对应包的版本,假如分支名看起来像一个版本,将创建{分支名}-dev的包版本号,如果分支名看起来不像一个版本号,它将会创建dev-{分支名}形式的版本号

composer require monolog/monolog  masterdev

composer require monolog/monolog  master.xdev

总结:

理解Composer,最重要的是实践,最后也能明白PSR-4和命名空间,也可以尝试将你的项目发布到pckagist.org上.

搭建Git服务器

在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7×24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

假设你已经有sudo权限的用户账号,下面,正式开始安装。

第一步,安装git

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git

第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git

$ sudo chown -R git:git sample.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

管理公钥

如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限

有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。

小结

  • 搭建Git服务器非常简单,通常10分钟即可完成;
  • 要方便管理公钥,用Gitosis;
  • 要像SVN那样变态地控制权限,用Gitolite。

Vsftp的安装,Vsftp添加用户linux/windows

关于Vsftp的安装以及配置方法现总结如下(包括vsftp如何添加用户)不多说,直接看操作流程:

设置方法:

aliyun Linux(Redhat)安装vsftp软件

1.更新yum源

首先需要更新系统的yum源,便捷工具下载地址:update_source.zip。这里需要注意的是,目前文件无法传输,所以想要运行 update_source.sh 只能用文本打开,复制粘贴到阿里云服务器系统运行。

2.安装vsftp

使用yum命令安装vsftp

#yum install vsftpd -y

3.添加ftp帐号和目录

先检查一下nologin的位置,通常在/usr/sbin/nologin或者/sbin/nologin下。

使用下面的命令创建帐户,该命令指定了/ftp为用户test的家目录,您可以自己定义帐户名和目录:

#useradd -d /ftp -s /sbin/nologin test

修改该帐户密码:

#passwd test

修改指定目录的权限

#chown -R test:test /ftp

4.配置vsftp

编辑vsftp配置文件,命令如下:

#vi /etc/vsftpd/vsftpd.conf

将配置文件中”anonymous_enable=YES “改为 “anonymous_enable=NO”

取消如下配置前的注释符号:

#local_enable=YES

#write_enable=YES

#chroot_local_user=YES

#ascii_upload_enable 允许使用ascii码上传

#ascii_download_enable 允许使用ascii码下载

保存修改,按ESC键,输入:wq

5.修改shell配置

vi编辑/etc/shells,如果该文件里没有/usr/sbin/nologin或者/sbin/nologin(具体看当前系统配置)则追加进去

6.启动vsftp服务并测试登录

使用命令启动vsftp服务:

#service vsftpd start

然后用帐号test测试下是否可以登陆ftp。目录是/ftp  推荐用filezilla比较流行的ftp工具。

dedecms后台删除不了文章,文章删除之后,提示成功,但是实际未删除_dedecms

前些日子给一朋友用dedecms套用了一个站点,因为都是用的模板,套起来非常快,三两小时就搞定,搞完之后马上交稿。好景不长,没过多久,这朋友找上门来说:dedecms后台删除不了文章,文章删除之后,提示成功,但是实际后台未删除。

后来我给检查了一番,因为对dedecms这种cms,一些问题基本都是站长摸透了的,这类问题应该可以说是家常便饭吧。于是baidu,google了一下,寥寥无几的答案,大都是无关紧要的答案,亦或是答非所问,也许都是抱着灌水的态度把,却而止步。

决定对程序进行排查了,得得看看删除程序是怎么进行的吧,查了几个php页面:archives_do.php

QQ图片20160708151305

发现这里用了的函数  DelArc

然后继续往下找到这个函数,函数来自inc_batchup.php文件

QQ截图20160708151534

 

看到这里就基本一目了然了,将sql进行执行查询出来,发现这里表里面的数据让人大吃一惊。

将表中的数据进行校对处理,最终得以解决了。

win下xampp配置memcache,Mac请看下回分解

关于memcache安装网上教程很多,但是呢,很多人按照教程安装后,出现一系列的报错,不知所踪,然后百思不得其解,我明明已经按照教程,从头到尾进行了安装呀,怎么还是不行呢?出现这个错误,只跟php_memcache.dll这个文件,已经php.ini的配置有关系。

先说安装memcache服务:

1、选择一个你想要安装的memcache服务端版本,有63位与32位的。这里你可以根据你自己的机子来进行选择。这并不影响php的配置。

2、进入doc命令,先dir到你memcache解压的目录

3、执行服务注册命令:memcached.exe -d install

4、卸载服务的命令:memcached.exe -d uninstall

5、启动服务的命令:memcached.exe -d start

6、停止服务器的命令:memcached.exe -d stop

7、检查你的memcache是否安装成功,使用start explorer命令查看:start explorer 127.0.0.1 11211  在执行这个命令后,如果打开了一个新窗口,OK那么说明memcache的安装是成功了。现在可以将精力放在php的配置上了。

php中memcache的配置步骤很简单,就分为三步:

1、找到合适的php_memcache.dll,放入到php/ext目录下。下载地址:http://pecl.php.net/package/memcache/3.0.8/windows

2、打开php.ini文件,写入配置信息

  1. extension=php_memcache.dll
  2. [Memcache]
  3. memcache.allow_failover=1
  4. memcache.max_failover_attempts=20
  5. memcache.chunk_size=8192
  6. memcache.default_port=11211</span>

这部分配置信息来源php手册,地址:http://php.net/manual/zh/ref.memcache.php(文章最底部)

3、重新启动服务器,进行测试

网上的教程基本上就是这三步,如果我只是想说到这里,那这篇博客也没有必要写了,我最开始也是按照这三步进行的,但是测试时,发生了最上面的错误。其实步骤并没有错,这里的关键是如何找到自己所需要的php_memcache.dll,以及php.ini中的配置(因为有的集成环境包含的不仅仅只有一个php.ini)。

这里我将自己的方法分享一下:

1、首先通过phpinfo()将我们的php相关信息显示出来,查看以下几个关键信息:

好的,从这里,我们可以知道,我们的php版本是5.5.15,我们使用的配置文件位置在:D:\xampp\php\php.ini(我们自己的配置信息也要写入到这个php.ini文件中去)

最后这段文字:API20121212,TS,VC11。TS:表示我们这个服务是线程安全,NTS:表示是非线程安全。VC11你只要记住就好了。x86是你这个服务的版本,也可能是x64。

然后了解到这些信息后,你就可以到:http://pecl.php.net/package/memcache/3.0.8/windows这个地址中,找到你对应的版本。比如,以我截图为例,我应该选择的版本

php5.5 ts x86的。就通过这几个信息就可以定位了。

下载后,解压文件,里边有很多文件,你只需要把php_memcache.dll拷贝到php/ext文件中去,然后填写配置文件即可。然后重新启动,100%可以了。

转自:菜鸟coder博客。经过本人修正。

将在这篇文章里面整理linux之常用命令

  • cd命令

这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:
cd /root/Docements # 切换到目录/root/Docements
cd ./path          # 切换到当前目录下的path目录中,“.”表示当前目录  
cd ../path         # 切换到上层目录中的path目录中,“..”表示上一层目录
  • ls命令

这是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多,下面就列出一些我常用的参数吧,如下:
-l :列出长数据串,包含文件的属性与权限数据等
-a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
-d :仅列出目录本身,而不是列出目录的文件数据
-h :将文件容量以较易读的方式(GB,kB等)列出来
-R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来
注:这些参数也可以组合使用,下面举两个例子:
ls -l #以长数据串的形式列出当前目录下的数据文件和目录
ls -lR #以长数据串的形式列出当前目录下的所有文件
  • grep命令

该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为
grep [-acinv] [--color=auto] '查找字符串' filename
它的常用参数如下:
-a :将binary文件以text文件的方式查找数据
-c :计算找到‘查找字符串’的次数
-i :忽略大小写的区别,即把大小写视为相同
-v :反向选择,即显示出没有‘查找字符串’内容的那一行
# 例如:
# 取出文件/etc/man.config中包含MANPATH的行,并把找到的关键字加上颜色
grep --color=auto 'MANPATH' /etc/man.config
# 把ls -l的输出中包含字母file(不区分大小写)的内容输出
ls -l | grep -i file
  • find命令

find是一个基于查找的功能非常强大的命令,相对而言,它的使用也相对较为复杂,参数也比较多,所以在这里将给把它们分类列出,它的基本语法如下:
find [PATH] [option] [action]

# 与时间有关的参数:
-mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件;
-mtime +n : 列出在n天之前(不含n天本身)被更改过的文件名;
-mtime -n : 列出在n天之内(含n天本身)被更改过的文件名;
-newer file : 列出比file还要新的文件名
# 例如:
find /root -mtime 0 # 在当前目录下查找今天之内有改动的文件

# 与用户或用户组名有关的参数:
-user name : 列出文件所有者为name的文件
-group name : 列出文件所属用户组为name的文件
-uid n : 列出文件所有者为用户ID为n的文件
-gid n : 列出文件所属用户组为用户组ID为n的文件
# 例如:
find /home/ljianhui -user ljianhui # 在目录/home/ljianhui中找出所有者为ljianhui的文件

# 与文件权限及名称有关的参数:
-name filename :找出文件名为filename的文件
-size [+-]SIZE :找出比SIZE还要大(+)或小(-)的文件
-tpye TYPE :查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、
             目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p);
-perm mode :查找文件权限刚好等于mode的文件,mode用数字表示,如0755;
-perm -mode :查找文件权限必须要全部包括mode权限的文件,mode用数字表示
-perm +mode :查找文件权限包含任一mode的权限的文件,mode用数字表示
# 例如:
find / -name passwd # 查找文件名为passwd的文件
find . -perm 0755 # 查找当前目录中文件权限的0755的文件
find . -size +12k # 查找当前目录中大于12KB的文件,注意c表示byte
  • cp命令

该命令用于复制文件,copy之意,它还可以把多个文件一次性地复制到一个目录下,它的常用参数如下:
-a :将文件的特性一起复制
-p :连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份
-i :若目标文件已经存在时,在覆盖时会先询问操作的进行
-r :递归持续复制,用于目录的复制行为
-u :目标文件与源文件有差异时才会复制
例如 :
cp -a file1 file2 #连同文件的所有特性把文件file1复制成文件file2
cp file1 file2 file3 dir #把文件file1、file2、file3复制到目录dir中
6、mv命令
该命令用于移动文件、目录或更名,move之意,它的常用参数如下:
-f :force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件已经存在,就会询问是否覆盖
-u :若目标文件已经存在,且比目标文件新,才会更新
注:该命令可以把一个文件或多个文件一次移动一个文件夹中,但是最后一个目标文件一定要是“目录”。
例如:
mv file1 file2 file3 dir # 把文件file1、file2、file3移动到目录dir中
mv file1 file2 # 把文件file1重命名为file2
  • rm命令

该命令用于删除文件或目录,remove之间,它的常用参数如下:
-f :就是force的意思,忽略不存在的文件,不会出现警告消息
-i :互动模式,在删除前会询问用户是否操作
-r :递归删除,最常用于目录删除,它是一个非常危险的参数
例如:
rm -i file # 删除文件file,在删除之前会询问是否进行该操作
rm -fr dir # 强制删除目录dir中的所有文件
  • ps命令

该命令用于将某个时间点的进程运行情况选取下来并输出,process之意,它的常用参数如下:
-A :所有的进程均显示出来
-a :不与terminal有关的所有进程
-u :有效用户的相关进程
-x :一般与a参数一起使用,可列出较完整的信息
-l :较长,较详细地将PID的信息列出
其实我们只要记住ps一般使用的命令参数搭配即可,它们并不多,如下:
ps aux # 查看系统所有的进程数据
ps ax # 查看不与terminal有关的所有进程
ps -lA # 查看系统所有的进程数据
ps axjf # 查看连同一部分进程树状态
  • kill命令

该命令用于向某个工作(%jobnumber)或者是某个PID(数字)传送一个信号,它通常与ps和jobs命令一起使用,它的基本语法如下:
kill -signal PID
signal的常用参数如下:
注:最前面的数字为信号的代号,使用时可以用代号代替相应的信号。
1:SIGHUP,启动被终止的进程
2:SIGINT,相当于输入ctrl+c,中断一个程序的进行
9:SIGKILL,强制中断一个进程的进行
15:SIGTERM,以正常的结束进程方式来终止进程
17:SIGSTOP,相当于输入ctrl+z,暂停一个进程的进行
例如:
# 以正常的结束进程方式来终于第一个后台工作,可用jobs命令查看后台中的第一个工作进程
kill -SIGTERM %1 
# 重新改动进程ID为PID的进程,PID可用ps命令通过管道命令加上grep命令进行筛选获得
kill -SIGHUP PID
  • killall命令

该命令用于向一个命令启动的进程发送一个信号,它的一般语法如下:
killall [-iIe] [command name]
它的参数如下:
-i :交互式的意思,若需要删除时,会询问用户
-e :表示后面接的command name要一致,但command name不能超过15个字符
-I :命令名称忽略大小写
# 例如:
killall -SIGHUP syslogd # 重新启动syslogd
  • file命令

该命令用于判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了,它的用法非常简单,基本语法如下:
file filename
#例如:
file ./test
  • tar命令

该命令用于对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压。它的常用参数如下:
-c :新建打包文件
-t :查看打包文件的内容含有哪些文件名
-x :解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
-j :通过bzip2的支持进行压缩/解压缩
-z :通过gzip的支持进行压缩/解压缩
-v :在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename :filename为要处理的文件
-C dir :指定压缩/解压缩的目录dir
上面的解说可以已经让你晕过去了,但是通常我们只需要记住下面三条命令即可:
压缩:tar -jcv -f filename.tar.bz2 要被处理的文件或目录名称
查询:tar -jtv -f filename.tar.bz2
解压:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
注:文件名并不定要以后缀tar.bz2结尾,这里主要是为了说明使用的压缩程序为bzip2
  • cat命令

该命令用于查看文本文件的内容,后接要查看的文件名,通常可用管道与more和less一起使用,从而可以一页页地查看数据。例如:
cat text | less # 查看text文件中的内容
# 注:这条命令也可以使用less text来代替
  • chgrp命令

该命令用于改变文件所属用户组,它的使用非常简单,它的基本用法如下:
chgrp [-R] dirname/filename
-R :进行递归的持续对所有文件和子目录更改
# 例如:
chgrp users -R ./dir # 递归地把dir目录下中的所有文件和子目录下所有文件的用户组修改为users
  • chown命令

该命令用于改变文件的所有者,与chgrp命令的使用方法相同,只是修改的文件属性不同,不再详述。
  • chmod命令

该命令用于改变文件的权限,一般的用法如下:
chmod [-R] xyz 文件或目录
-R:进行递归的持续更改,即连同子目录下的所有文件都会更改
同时,chmod还可以使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(删除)、=(设置)跟rwx搭配来对文件的权限进行更改。
# 例如:
chmod 0755 file # 把file的文件权限改变为-rxwr-xr-x
chmod g+w file # 向file的文件权限中加入用户组可写权限
  • vim命令

该命令主要用于文本编辑,它接一个或多个文件名作为参数,如果文件存在就打开,如果文件不存在就以该文件名创建一个文件。vim是一个非常好用的文本编辑器,它里面有很多非常好用的命令,在这里不再多说。你可以从这里下载vim常用操作的详细说明。
  • gcc命令

对于一个用Linux开发C程序的人来说,这个命令就非常重要了,它用于把C语言的源程序文件,编译成可执行程序,由于g++的很多参数跟它非常相似,所以这里只介绍gcc的参数,它的常用参数如下:
-o :output之意,用于指定生成一个可执行文件的文件名
-c :用于把源文件生成目标文件(.o),并阻止编译器创建一个完整的程序
-I :增加编译时搜索头文件的路径
-L :增加编译时搜索静态连接库的路径
-S :把源文件生成汇编代码文件
-lm:表示标准库的目录中名为libm.a的函数库
-lpthread :连接NPTL实现的线程库
-std= :用于指定把使用的C语言的版本

# 例如:
# 把源文件test.c按照c99标准编译成可执行程序test
gcc -o test test.c -lm -std=c99
#把源文件test.c转换为相应的汇编程序源文件test.s
gcc -S test.c
  • time命令

该命令用于测算一个命令(即程序)的执行时间。它的使用非常简单,就像平时输入命令一样,不过在命令的前面加入一个time即可,例如:
time ./process
time ps aux
在程序或命令运行结束后,在最后输出了三个时间,它们分别是:
user:用户CPU时间,命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
system:系统CPU时间,命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和;
real:实际时间,从command命令行开始执行到运行终止的消逝时间;
  •  lsblk命令

lsblk“就是列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。

lsblk -l”命令以列表格式显示块设备(而不是树状格式)。

  • md5sum命令

md5sum”就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。

 

  • uname命令

uname“命令就是Unix Name的简写。显示机器名,操作系统和内核的详细信息。

root@raspberrypi:/# uname -a
Linux raspberrypi 3.6.11+ #528 PREEMPT Tue Aug 20 00:25:53 BST 2013 armv6l GNU/Linux
  • history命令

history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。

注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以在你写命令时自动补全。

  • sudo命令

sudo”(super user do)命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

 

  •  mkdir命令

mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了”(“cannot create folder, folder already exists”)

root@raspberrypi:/opt/labpark# mkdir raspbox

注意:目录只能在用户拥有写权限的目录下才能创建。mkdir:不能创建目录`tecmint`,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住我开头所说的-在linux中,文件,文件夹,驱动,命令,脚本都视为文件)

  • touch 命令

touch”命令代表了将文件的访问和修改时间更新为当前时间。touch命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。

root@raspberrypi:/opt/labpark# touch rasp.txt

注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

  • apt命令

Debian系列以“apt”命令为基础,“apt”代表了Advanced Package Tool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。

  • pwd 命令

pwd”(print working directory),在终端中显示当前工作目录的全路径。

root@raspberrypi:/opt/labpark# pwd
/opt/labpark

  •  命令: Find

搜索指定目录下的文件,从开始于父目录,然后搜索子目录。

root@raspberrypi:/opt/labpark# find book*
book_backup.txt
book.txt

 

root@raspberrypi:/opt/labpark# find -name *.c
./hello.c

 

root@raspberrypi:/opt/labpark# find -iname FACE*
./facebook.txt

 

注意: `-name‘选项是搜索大小写敏感。可以使用`-iname‘选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;‘.sh‘你可以使用文件名或者文件名的一部分来制定输出结果)

 

  • 命令: grep

 

grep‘命令搜索指定文件中包含给定字符串或者单词的行。举例搜索‘/etc/passwd‘文件中的‘pi’

root@raspberrypi:/opt/labpark# grep pi /etc/passwd
pi:x:1000:1000:,,,:/opt/wwwroot:/bin/bash

使用’-i’选项将忽略大小写。

root@raspberrypi:/opt/labpark# grep -i  'PI' /etc/passwd
pi:x:1000:1000:,,,:/opt/wwwroot:/bin/bash

使用’-r’选项递归搜索所有自目录下包含字符串 “localhost“.的行。

root@raspberrypi:/opt/labpark# grep -r "localhost" /etc/php5/
/etc/php5/cgi/php.ini:SMTP = localhost
/etc/php5/cli/php.ini:SMTP = localhost
/etc/php5/fpm/php.ini:SMTP = localhost

注意:您还可以使用以下选项:

  1. -w 搜索单词 (egrep -w ‘word1|word2‘ /path/to/file).
  2. -c 用于统计满足要求的行 (i.e., total number of times the pattern matched) (grep -c ‘word‘ /path/to/file).
  3. –color 彩色输出 (grep –color server /etc/passwd).

 

  •  命令: man

man‘是系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页

  • 命令: ps

ps命令给出正在运行的某个进程的状态,每个进程有特定的id成为PID。

  • 命令: whereis

whereis的作用是用来定位命令的二进制文件\资源\或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页

  • 命令: service

service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。

  • 命令: alias

alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。

我经常用ls -l‘命令,它有五个字符(包括空格)。于是我为它创建了一个别名‘l’。

  • 命令: df

报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。

  • 命令: du

估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。

注意: ‘df‘ 只显示文件系统的使用统计,但‘du‘统计目录内容。

  • 命令: passwd

这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。

root@raspberrypi:/opt/wwwroot# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

 

  • 命令: lpr

这个命令用来在命令行上将指定的文件在指定的打印机上打印。

root@raspberry:~# lpr -P deskjet-4620-series 1-final.pdf

 

注意: “lpq“命令让你查看打印机的状态(是开启状态还是关闭状态)和等待打印中的工作(文件)的状态。

 

  • 命令: cmp

比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。

  • 命令: wget

Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTPHTTPSFTP协议和 HTTP 代理。

 

  • 命令: mount

mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。

在插入你的文件系统后,首先运行”lsblk“命令,识别出你的设备,然后把分配的设备名记下来。

  • 命令: ifconfig

ifconfig用来配置常驻内核的网络接口信息。在系统启动必要时用来设置网络适配器的信息。之后,它通常是只需要在调试时或当系统需要调整时使用。

  •  命令: netstat

netstat命令显示各种网络相关的信息,如网络连接,路由表,接口统计,伪装连接,组播成员身份等….

  • 命令: uptime

你连接到你的 Linux 服务器时发现一些不寻常或恶意的东西,你会做什么?猜测……不,绝不!你可以运行uptime来验证当服务器无人值守式到底发生了什么事情。

root@raspberrypi:~# uptime
 04:09:59 up 7 min,  1 user,  load average: 0.01, 0.31, 0.24

 

  • 命令:w

是否觉得命令’w’很滑稽?但是事实上不是的。它是一个命令,尽管只有一个字符长!命令”w“是uptimewho命令,以前后的顺序组合在一起。

  • 命令: top

显示CPU进程信息。这个命令自动刷新,默认是持续显示CPU进程信息,除非使用了中断指令(Ctrl+c)。

  • 命令: mkfs.ext4

这个命令在指定的设备上创建一个新的ext4文件系统,如果这个命令后面跟的是个错误的设备,那么整个设备就会被擦除和格式化,所以建议不要运行这个命令,除非你清楚自己正在干什么。

Mkfs.ext4 /dev/sda1 (sda1 block will be formatted)
mkfs.ext4 /dev/sdb1 (sdb1 block will be formatted)
  • lsof -i:80  找出80端口

  • tail -f  filename      监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。

linux下vi的复制,黏贴,删除,撤销,跳转等命令

一,模式
vi编辑器有3种模式:命令模式输入模式末行模式。掌握这三种模式十分重要:

命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。

输入模式:在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“–INSERT–”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。

末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。

二,复制
a,复制整行
命令模式下,光标位于要复制的当前行,输入 yy
b,复制一个单词
命令模式下,光标位于要复制的当前单词的第一个字母,输入 yw

三,黏贴
命令模式下,输入 p

四,删除
a,删除整行
命令模式下,光标位于要删除的所在行,输入 dd

b,删除一个单词
命令模式下,光标位于要删除的单词的第一个字母,输入 dw

五,撤销
命令模式下,输入 u

六,跳转
命令模式下,输入 要跳转的行数,然后再输入 gg
如:要跳转到当前文件的第150行,输入 150gg