分类 PHP 下的文章

使用“搬瓦工”的vps已经接近半年了。期间升级过配置,拥有128m内存“大内存”(真是泪流满面)和2GB硬盘空间。于是把blog和自己的网站都丢上去,抛弃那个又慢又小的虚拟空间。把过程中的问题都记录一下。

域名
第一次绑定域名和IP,走了点弯路。一开始不知道域名提供商不提供DNS服务,要自己找一个。
1)申请DNSPod,国内的免费DNS服务。添加域名,然后针对该域名添加两条A类型的记录,主机分别是“@”和“www”。
2)设置域名的DNS服务器地址为DNSPod的地址:
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
3)剩下就只有等待了。不过不用等多久就开通了。

Nginx
主要是PHP相关的设置:

location ~ \.php(\/.+)?$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock; #用SOCK比较快
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_buffers 8 16k; #避免跳转报502错误
    fastcgi_buffer_size 32k; #避免跳转报502错误
}

后面还要设置HTTPS,用于部署OwnCloud。

PHP和PHP-FPM
这里基本用的是默认配置,后面再考虑优化。

MySQL
前面已经配好了,而且是针对小内存的机器来优化的。

VIM
增加支持显示中文字符。修改 /etc/vim/vimrc 文件,字啊末尾增加如下代码:

set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc

Wordpress迁移Typecho
主要是Wordpress太臃肿了,对于一个几乎只有自己看的Blog来说,不需要那么多东西。于是直接部署Typecho。利用相关的插件,导入Wordpress的数据即可。

大概就这样完成了迁移。后面的计划是部署OwnCloud,用来同步一些小文件。对了部署个私有SVN或者GIT服务器也是不错的。然后就是Laravel框架的学习了。

首先PHP没有自带定时器(例如每隔几秒自动执行一下某函数)。要实现这个功能,只有三个方法:1)利用外部脚本实现定时执行;2)利用客户端的JavaScript定时执行;3)根据访问请求来实现,但前提是网站的访问量足够大。利用外部脚本实现定时执行,只能是使用虚拟主机或者自己架设服务器才能使用(在虚拟空间上运行,就只能考虑使用JavaScript)。

网上搜到的资料,用PHP页面也可以实现定时器的。主要思路是使用死循环,再加延时执行(即sleep或者usleep函数)。相关示例代码如下:

//------------begin file: timer.php------------
<?php
//每半秒执行记录一下当前时间

//写文件函数
function write_txt() {
    $filePath = 'timer_test.txt';
    if(!file_exists($filePath)){
        $fp = fopen($filePath, 'ab');
        fclose($fp);
    }
    $str = "\r\n" . date('Y-m-d H:i:s');
    $fp = fopen($filePath, 'ab'); //a为打开文件后指向文件末尾,b为以二进制打开文件
    fwrite($fp, $str);
    fclose($fp);
}

ignore_user_abort(); //即使关掉浏览器,PHP也可继续执行
set_time_limit(0); //不设置脚本超时时间,可以无限执行下去
$interval = 30; //时间间隔为30秒
do{
    //定时执行的代码
    write_txt();
    sleep($interval); //等待,sleep的参数单位是秒,usleep的参数单位是毫秒
}while(true); //死循环
//------------end file: timer.php------------

执行时还有个问题,用浏览器打开运行后,网站的其它连接都卡住且不能打开。网上搜到的解析是,PHP不支持多线程。最后只有在服务器上,用以下命令运行:

php timer.php &

终于,在上个星期,匆匆发布了用PHP编写的网站。

其实,与其说是“编写”,还不如说是“搭建”────基于Codeignter框架,采用SQLite,构建而成。基本实现了用户登录、用户管理、简单的笔记管理等。总算实现了N年前,做个PHP网站的计划。

然后考虑了一下Javascript框架采用哪个的问题。Google了一下,主流框架都比较大,例如prototype、jQuery、ExtJs等,根本不适合手机访问,特别是我这种2.5G的网络。于是再找一些轻量级的,例如$dom、zepto、snack等,但都不能完全满足需求。最后,考虑还是自己写一个。很简单,屏蔽各种浏览器的差异,简化一些语句和功能。具体一点,就是统一获取常用数值的函数、$()函数和ajax函数。希望可以尽快开工吧。

今天很郁闷!做了个PHP页面,Chrome显示正常,IE显示却不正常。本来骂IE、骂微软是正常不过的了,但不是骂完就能解决问题的。

Google的答案是UTF-8的BOM问题。BOM(Byte Order Mark),即UTF-8签名(UTF-8 signature),是UTF编码方案里用于标识编码的标准标记。简单来说,PHP编译代码时,没有理会BOM,造成IE显示错误。也由于使用了CodeIgniter框架,即使改了View页面,也解决不了问题,最后修改了相关的文件,即系Route、Controller、Model等相关页面。简单来说,用UTF-8编码写PHP,就要统一使用无BOM的UTF-8。

感觉每次用新的东西都会这样那样的小问题。其实都是因为基于已有的经验来做,比如因为用Java而使用UTF-8。

Nginx中配置,去掉CodeIgniter URI中的index.php。参考了人家的文章和自己实践,得出配置如下(Nginx-1.2.0中通过):

location /php/ { # "/php" is the location of CodeIgniter
# Hide index.php in URI
rewrite ^(/php)/(?!index\.php|robots\.txt|images|js|style|fckeditor|upload)(.*)$ $1/index.php/$2 last;
}

把以上配置内容添加到Nginx的配置文件nginx.conf即可。

再看看这段配置,其实就是用URI跳转来实现,而且是用正则表达式匹配和替换。感觉很优美~

今天尝试使用CodeIgniter(一个高效的PHP框架)来做点东西,但是根据官方教程(http://codeigniter.org.cn/user_guide/)去做,也总是显示404页面。于是寻求Goolge帮助。原因很简单,就是Nginx不支持PATH_INFO,地址是一截一截的那种。最后找到的有效解决方法是http://linux008.blog.51cto.com/2837805/546489

主要的Nignx配置如下:

location ~ \.php { # no "$" at the end of "php"
# root f:/httpd/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$; #support PATH_INFO
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}

终于把空间整理了一下,发现这个空间提供的功能还满丰富的。然后挂了个WorPress上来,便开始了本空间的正式使用了。

首先这段时间应该开始学习PHP了——PHP是我多年前的LAMP梦想啊。在我做出自己的Blog之前,还是先拿WorPress来凑合用着吧(挺喜欢WorkPress简洁的界面)。希望起码当今年过去的时候,会学有所成!

本年的计划中,还有一个OA项目(Project Cuke)呢,继续努力~~~

PS. 本来想把本空间分割卖出去,以降低成本的,可是居然没人买!是不是50MB的空间,10RMB/年的条件不够吸引呢?