Shell 快捷键

在使用 Shell 进行 Linux 操作时,经常需要编辑大段的代码,如果仅仅使用键盘的
Delete 和 Backspace 键,那是一件非常折磨人的事情。我们以 Linux 默认的 Bash
Shell 为例,他可以设定为多种 Mode,使其操作习惯类似于一些熟悉的编辑器,比如
emacs 或 vi。

  • 列出所有 Mode

    set -o

  • 使用 vi 操作习惯來操作 Bash Shell

    set -o vi

  • 使用 emacs 的操作习惯来操作 Bash Shell,默认即为此 Mode

    set -o emacs

下面总结以下 Bash Shell 采用默认 emacs Mode 时可用的一些快捷键,能够极大提高
Shell 的操作效率。

继续阅读Shell 快捷键

sshfs的配置

上个月新买了一个本本电脑,所以女人的旧电脑就算淘汰下来了。但我还得用我那07年的老爷机,在做开发上还是有些吃力,因此决定把原来共存于同一个系统的桌面环境和服务器环境分开,将服务器环境转移到淘汰下来的老爷机上,所以在上面装了个FreeBSD,以方便维护。但也因此出现一个问题,服务器的数据应该放在哪里,桌面机上还是服务器机器上。由于淘汰下来的机器可能会被我用来折腾,如挨个装发得版,或测试其它东西,所以我想把数据还是放在桌面机上;问题又来了,服务器如何能快速有效地访问这些数据,而不影响服务器的正常运作呢。

首先,想到的是用netbeans的远程站点功能。随后,又想到了利用 ssh 挂载远程文件系统的功能,把 Desktop 上的文件系统通过 sshfs 挂载到 Server 上。由于第一种方案需要依赖netbeans,所以我打算用第二种方案。

一、安装配置 SSHFS

安装 sshfs ,这个在 Arch 下用 pacman 安装即可,其它发行版应该都有相应的包管理器可以解决。在安装好 sshfs 之后,可以使用 # sshfs [USER]@[HOST]:[DIR] [MOUNTPOINT] [OPTIONS] 挂载远程的文件系统,使用 # fusermount -u [MOUNTPOINT] 进行卸载。当然,前提是远程系统上有 ssh daemon 运行。另外一个比较有用的参数是 -o allow_other,否则挂载的文件系统只有当前用户可用,其他用户无法访问。这样,就可以像操作本地文件一样来操作远程文件了。

继续阅读sshfs的配置

open_basedir restriction in effect: eAccelerator与open_basedir

今天在查阅apache的错误日志时发现有很多的warning,都跟open_basedir有关,如:

2011/09/25 21:27:54 [error] 3927#0: *146 FastCGI sent in stderr: “PHP Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/) in /srv/http/xxx.php on line 913” while reading upstream, client: x.x.x.x, server: example.com, request: “GET / HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php-fpm/php-fpm-kelltan.sock:”, host: “example.com”, referrer: “http://example.com/”

检查php.ini的配置也没发现什么问题,google一番也没有有用的信息,只好自己动手找原因。重新查看了日志,发现这个警告出现在我安装eAccelerator之后,所以觉得这个错误应该跟eAccelerator有关。

在阅读了eAccelerator的wiki,然后又做了一番研究后发现,默认的eAccelerator编译选项跟open_basedir是不相容的,根据wiki上介绍,只要在编译的时候加上参数“ –without-eaccelerator-use-inode”,便可解决这个问题:

$ cd /PATH/TO/eaccelerator-0.9.6.1
$ make clean
$ ./configure --without-eaccelerator-use-inode
$ make
# make install

好了,重新编译完后,记得删掉eAccelerator之前产生的文件,然后重新启动apache:

# rm -rf /var/cache/eaccelerator/*
# /etc/rc.d/httpd restart

好了,一切重归宁静。

PHP运行于fcgid模式时,上传大文件抛500错误

我在pma上试图导入一个SQL文件时,pma抛给我一个500错误,看日志后发现错误日志为:

mod_fcgid: HTTP request length 135225 (so far) exceeds MaxRequestLen (131072)

我的php是运行在mod_fcgid模式下的,看上去是因为HTTP的请求长度太长,大于现有的131072最大请求长度。看了fcgid的配置文件后,发现并没有配置过MaxRequestLen的参数。看来这个131072的配置是默认的了。于是在fcgid的配置文件里加入这个配置,15728640是15M,因为我的php.ini中设置的最大POST长度是15M,所以把它们设置长一样的:

  MaxRequestLen 15728640

重启APACHE后,上传,导入,OK~

diff的使用及制作patch

VPS上的LANMP都是自己编译出来的,因为个人比较追求新的发布,所以一有新的版本发布,就会上down下来编译更新。之前都会对源码做些个人化的修改后再编译,就经常要对新的发布版本做一样的修改。经常性地这样手动更改很麻烦,所以就想到了制作patch补丁。

diff工具的使用

diff [OPTION]... FILES

FILES 表示多个文件或目录
说明:该命令告诉使用者,为了使文件,如FILES一致,需要修改它们的哪些行。如果用 “-“表示 FILES,则表示标准输入。如果 FILES 是目录,那么 diff 将使用该目录中的同名文件进行比较。
继续阅读diff的使用及制作patch

php中preg_*函数关于”\”的一个问题

记得之前,我在php中有要写一个正则匹配:要匹配一个字符串中的的一个反斜杠’\’,开始写的是

preg_match("%.+\\%",$str);

但却报了No ending delimiter ‘%’ found in Command line code的错误。于是写成了:

preg_match("%.+\\\\%",$str);

程序正常了,当时也没多管它。昨天翻看PHP手册的时候发现preg_replace函数中有说

To use backslash in replacement, it must be doubled (“\\\\” PHP string).

想了下,这里的”\\\\”应该是在php字符串中,”\\\\”先被转义成了”\\”,然后在正则中,”\\”才又被转义成了”\”。

无聊两代码

我承认很蛋痛。

<?php
define('猪','头');
define('头','猪');
function 猪(){return 头;}
function 头(){return 猪;}
$头='猪';
$猪='头';
$constant = 'constant';
echo "你就是一${$constant($猪())}${$constant(头)}";
<?php
$a = 1;
function f(){
    global $a;
    $a = 2;
    unset($a);
}
f();
var_dump($a);

php之异步执行

近来做一网站因为需要在提交一个表单的时候发邮件给N多人,但用户反映每次提交表单总是要等好久,所以用户体验不好。

一般情况下,处理这样的表单提交的流程可以分解为:
用户提交表单→ 将表单内容写入数据库→发邮件给收件人→提示表单提交完成。
而往往在发邮件的过程中会消耗掉一大部分时间,造成用户体验不好。

这里可以用到php的异步执行方法:在提交表单后将内容写入到数据库,然后把发邮件的任务交给了另一个用来发信的php程序处理,接着提示用户已经提交表单完成咯。。。

异步执行的过程就变成了:
用户提交表单→ 将表单内容写入数据库→提示表单提交完成。
             |- 发邮件给收件人

php本不具备多线程执行能力,所以就用异步执行来模拟多线程解决问题,也就是利用php的fsockopen()、fputs()两个函数来重新提交一个url的请求,所以不需要等待它的返回。代码如:

<?php
//getpost.php
function sendmail() {
    $fp=fsockopen('localhost',80,&$errno,&$errstr,10);
	$para = "mail=".$_POST['mail'];
    $header = "POST /sendmail.php HTTP/1.0 \r\n";
	$header .= "Content-Type: application/x-www-form-urlencoded \r\n";
	$header .= "Content-Length:".strlen($para). "\r\n";
    fputs($fp,$header.$para); //请求sendmail程序处理
    fclose($fp);
} 
/*
//处理表单并写入数据库中。
*/
sendmail();
echo "表单提交完成咯";

?>

另一个程序:

<?php
//sendmail.php
set_time_limit(0); //设置脚本超时时间为不超时
/*
// 处理发邮件代码
*/
?>