解决 Codeigniter 1.7.2 中文 URL 问题

继承 Codeigniter URI 的 URI 类,在 application/libraries/ 下创建 MY_URI.php:

<?php

class MY_URI extends CI_URI {

	/**
	 * Filter segments for malicious characters
	 *
	 * @access	private
	 * @param	string
	 * @return	string
	 */
	function _filter_uri($str)
	{
		if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
		{
			mb_regex_encoding($this->config->item('permitted_uri_chars_encoding'));
			if ( ! mb_eregi("^[".$this->config->item('permitted_uri_chars')."]+$", $str))
			{
				show_error('The URI you submitted has disallowed characters.', 400);
			}
		}

		// Convert programatic characters to entities
		$bad	= array('$', 		'(', 		')',	 	'%28', 		'%29');
		$good	= array('&#36;',	'&#40;',	'&#41;',	'&#40;',	'&#41;');

		return str_replace($bad, $good, $str);
	}

}

修改 config.php 配置:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\x{2E80}-\x{9fa5}';
$config['permitted_uri_chars_encoding'] = 'utf8';

permitted_uri_chars_encoding 是我新增的,表示 URL 的字符编码。
我整站使用 utf8,所以这里设置 permitted_uri_chars_encoding 为 utf8。

原理?这是什么原理?
不要问我原理,自己去看代码去,哥最近比较忙。

— EOF —

PHP Fatal error: Call to undefined function imagettfbbox()

在测试机上装了 yiiframework 玩了玩,没想到验证码显示不出来。
PHP 错误日志:

PHP Fatal error: Call to undefined function imagettfbbox() in …

php -m 发现 GD 已经编译进去了,而 freetype 在编译配置时也加了 –with-freetype-dir 。
不得其解,重新运行下编译配置看看:

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr –with-mysqli=/usr/bin/mysql_config –enable-fpm –enable-sockets –enable-pdo –with-pdo-mysql=/usr –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –with-zlib

配置输出:

checking for GD support… yes
checking for the location of libjpeg… yes
checking for the location of libpng… yes
checking for the location of libXpm… no
checking for FreeType 2… yes
checking for T1lib support… no
checking whether to enable truetype string function in GD… no
checking whether to enable JIS-mapped Japanese font support in GD… no
checking for fabsf… (cached) yes
checking for floorf… (cached) yes

注意其中有一行“whether to enable truetype string function in GD… no”,应该就是这个问题了吧。
加上 –enable-gd-native-ttf,重新编译并重启 PHP-FPM,问题依旧……

最后把 GD 相关的选项全选上了:

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr –with-mysqli=/usr/bin/mysql_config –enable-fpm –enable-sockets –enable-pdo –with-pdo-mysql=/usr –with-gd –with-jpeg-dir –with-png-dir –with-xpm-dir –with-freetype-dir –with-t1lib –enable-gd-native-ttf –with-zlib

问题依旧!

……没折,该不会编译过程又抽风了吧。
清空,并重新编译:

make clean
./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr –with-mysqli=/usr/bin/mysql_config –enable-fpm –enable-sockets –enable-pdo –with-pdo-mysql=/usr –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –with-zlib
make && make install

问题解决了,感谢党和人民的支持!

更多PHP安装过程请参考:《Gentoo 下搭建 Nginx+ MySQL + PHP (fastcgi) 环境》

— EOF —

Nginx + MySQL + FastCGI + PHP + eAccelerator 简易安装配置手册

(本文所介绍的安装方法在 Debian 下进行,主要介绍用编译方式进行安装的方法,使用 package 安装较为简单,本文不做介绍。)

第一部分 安装指南

基本步骤:

a. 解压源码包:

tar zxf foobar.tar.gz

b. 运行配置脚本:

cd foobar/

./configure –option=xxx ….

c. 编译源码:

make

d. 安装:

make install

具体编译安装步骤请参考以下安装脚本(点此下载):

# install script for mysql, php, nginx
# writed by hilyjiang 20080718

# mysql
apt-get install -y libncurses5-dev
tar zxf mysql-5.0.51b.tar.gz
cd mysql-5.0.51b/
./configure –prefix=/usr/local/mysql –without-debug –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –enable-assembler –with-extra-charsets=gbk,gb2312,utf8 –with-pthread –enable-thread-safe-client
make
make install
cp support-files/my-medium.cnf /usr/local/mysql/my.cnf
cd ../

# php lib
cd php
tar zxvf libiconv-1.12.tar.gz
cd libiconv-1.12/
./configure –prefix=/usr/local
make
make install
cd ../

tar zxvf freetype-2.3.7.tar.gz
cd freetype-2.3.7/
./configure
make
make install
cd ../

tar zxvf libpng-1.2.29.tar.gz
cd libpng-1.2.29/
./configure
make
make install
cd ../

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure –enable-static –enable-shared
make
make install
make install-lib
cd ../

tar zxvf libxml2-2.6.32.tar.gz
cd libxml2-2.6.32/
./configure
make
make install
cd ../

tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8/
./configure
make
make install
/sbin/ldconfig
cd libltdl/
./configure –enable-ltdl-install
make
make install
cd ../../

tar zxvf mhash-0.9.9.tar.gz
cd mhash-0.9.9/
./configure
make
make install
cd ../

cp /usr/local/lib/libmcrypt.* /usr/lib
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2

tar zxvf mcrypt-2.6.6.tar.gz
cd mcrypt-2.6.6/
./configure
make
make install
cd ../

tar zxf gd-2.0.35.tar.gz
cd gd-2.0.35/
./configure
make
make install
cd ../

tar zxf libssh2-0.12.tar.gz
cd libssh2-0.12/
./configure
make
make install
cd ../

# php
apt-get install -y libcurl3-dev
apt-get install -y bzip2
tar jxf php-5.2.6.tar.bz2
gzip -cd php-5.2.6-fpm-0.5.8.diff.gz | patch -d php-5.2.6 -p1
cd php-5.2.6/
./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –with-iconv-dir=/usr/local –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir –enable-xml –disable-debug –disable-rpath –enable-discard-path –enable-safe-mode –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl –with-curlwrappers –enable-mbregex –enable-fastcgi –enable-fpm –enable-force-cgi-redirect –enable-mbstring –with-mcrypt –with-gd –enable-gd-native-ttf –with-openssl –enable-ftp
make
make install
mkdir /usr/local/php/etc
cp php.ini-recommended /usr/local/php/etc/php.ini
cd ../

# php extensions
# memcache
apt-get -y install autoconf
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3/
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install
cd ../

# ssh2
tar zxf ssh2-0.10.tgz
cd ssh2-0.10/
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install
cd ../

# eaccelerator
tar jxf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3/
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install
cd ../
cd ../

# nginx
cd nginx
dpkg -i libgoogle-perftools0_0.98-1_i386.deb
dpkg -i libgoogle-perftools-dev_0.98-1_i386.deb

tar zxf pcre-7.7.tar.gz
cd pcre-7.7
./configure
make
make install
cd ../

tar zxf nginx-0.6.32.tar.gz
cd nginx-0.6.32/
./configure –prefix=/usr/local/nginx –with-http_stub_status_module –with-google_perftools_module
make
make install
mkdir /usr/local/nginx/logs/logbydate/
cd ../
cd ../

维护要点:

a. 编译软件或库时,最好在 configure 时配置使用默认的安装路径如 –prefix=/usr/local,以避免和使用包安装的软件冲突。也可以专门建立一个独立的目录,如 /usr/local/mysql 或 /home/apache。

b. 对冗繁的安装操作,最好写个安装脚本以便日后在多个服务器上自动部署。

第二部分 配置和维护

主要配置文件打包于此:etc.zip

1. Nginx

·主要配置文件路径:

/usr/local/nginx/conf/nginx.conf

/usr/local/nginx/conf/fastcgi_params

/usr/local/nginx/conf/sites/*

·启动 nginx:

/usr/local/nginx/sbin/nginx

·停止 nginx:

kill -TERM `cat /usr/local/nginx/logs/nginx.pid`

·测试配置:

/usr/local/nginx/sbin/nginx –t

·重新加载配置:

kill –HUP `cat /usr/local/nginx/logs/nginx.pid`

·增加新站点:

在 conf/sites/ 下为新站点建立一个配置文件,命名规则为 sitename.enable。

(在 nginx.conf中设置只有以.enable结尾的配置文件才会被加载)

测试配置:

/usr/local/nginx/sbin/nginx –t

重新加载配置:

kill –HUP `cat /usr/local/nginx/logs/nginx.pid`

·按日切分日志:

使用以下脚本按日切分Nginx的日志:

#! /bin/sh

log_dir="/usr/local/nginx/logs"

date_postfix=`date +%Y%m%d`

src_log=${log_dir}/test.access.log

tmp_log=${log_dir}/test.access.log.tmp

des_log=${log_dir}/logbydate/test.access.${date_postfix}.log

if [ ! -f ${des_log} ]; then

mv ${src_log} ${des_log}

else

mv ${src_log} ${tmp_log}

cat ${tmp_log} >> ${des_log}

rm ${tmp_log}

fi

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

cron中设置每天 23:59 分执行该脚本:

$ crontab -uroot -e

# m h dom mon dow command

59 23 * * * /usr/local/nginx/logs/cronlog.sh

2. MySQL

·新建数据库服务器:

建立数据存放目录:

mkdir /home/db/testdb

chown mysql /home/db/testdb

安装 mysql 数据目录:

/usr/local/mysql/bin/mysql_install_db –basedir=/usr/local/mysql –datadir=/home/db/testdb/data –user=mysql

·拷贝并修改配置:

cp /usr/local/mysql/my.cnf /home/db/testdb/

/home/db/testdb/my.cnf:

[client]

port = 3306

socket = /home/db/testdb/mysql.sock

[mysqld]

port = 3306

socket = /home/db/testdb/mysql.sock

datadir = /home/db/testdb/data

pid-file = /home/db/testdb/mysql.pid

·建立启动和停止脚本:

/home/db/testdb/start.sh:

#! /bin/sh

/usr/local/mysql/bin/mysqld_safe –defaults-file=/home/db/testdb/my.cnf &

/home/db/testdb/stop.sh:

#! /bin/sh

/usr/local/mysql/bin/mysqladmin –defaults-file=/home/db/testdb/my.cnf -uroot -p shutdown

添加执行权限:

chmod +x /home/db/testdb/start.sh /home/db/testdb/stop.sh

·启动服务:

/home/db/testdb/start.sh

·停止服务:

/home/db/testdb/stop.sh

3. FastCGI-PHP(PHP-FPM

·主要配置文件路径:

/usr/local/php/etc/php.ini

/usr/local/php/etc/php-fpm.ini

·查看已加载PHP模块:

/usr/local/php/bin/php-cgi –m

·增加新的PHP模块:

编译安装:

tar zxf php-ext.tar.gz

cd php-ext/

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config

make

make install

修改 /usr/local/php/etc/php.ini 的配置,在尾部加上 extension="php-ext.so"。

·启动FastCGI:

/usr/local/php/sbin/php-fpm start

·停止FastCGI:

/usr/local/php/sbin/php-fpm stop

·重启FastCGI:

/usr/local/php/sbin/php-fpm restart

·重新加载 FPM 配置:

/usr/local/php/sbin/php-fpm reload

4. 修改启动脚本

使用Tarball安装的程序,如果需要在系统启动时自动启动,需要在系统的启动脚本 /etc/rc.local 中增加相应项,如:

mkdir /tmp/eaccelerator/

chmod 777 /tmp/eaccelerator/

/home/db/testdb/start.sh

/usr/local/php/sbin/php-fpm start

/usr/local/nginx/sbin/nginx

— EOF —

PHP热身

PHP和VBScript和JavaScript一样,也是一门脚本语言,它是Personal Home Page的缩写,而现在人们说的PHP则延用了GNU(Gnu’s Not Unix)的命名方法,它指的是PHP Hypertext Processor(PHP超文本预处理器)。

PHP的语法看起来更像Perl(也是一门脚本语言),变量前带了个$,最有特色的是它提供了一个与其它程序语言不同的概念——可变变量,即用一个变量的值作为另外一个变量的变量名(好好玩),这种思想虽然隐约包含在JavaScript中(可以用eval()),但是在PHP中得到了更好的体现和应用。

PHP提供了四种标记风格:
1. XML风格:
<?php echo ‘<p>Hello World!</p>’; ?>
2. 简短风格:
<? echo ‘<p>Hello World!</p>’; ?>
3. Script风格:
<script language=”php”>echo ‘<p>Hello World!</p>’;</script>
4. ASP风格:
<% echo ‘<p>Hello World!</p>’; %>
我个人还是比较喜欢第一种风格,而这恰恰也是PHP推荐使用的:)

PHP支持C、C++和Shell脚本风格的注释:
/*
C、C++风格
*/
echo ‘Hello Word!’; //C、C++风格
echo ‘Hello World!’; #Shell风格
看腻了斜杠,现在终于可以换换口味了……

另外,PHP里的有些比较操作符的作用是重复的,比如:
不等于 !=或<>
有些像SQL语句中的比较符,在SQL中是推荐后者,即<>,PHP中似乎没有明确规定。
个人偏好前者(是玩腻了VBScript…)。

另外PHP中还有数组比较操作符,可以判断两个数组中是否具有相同的元素,判断这些元素是否具有相同的顺序,这个比较吸引人。

还值得一提的是字符串连接符,在好多脚本语言中都是用+或者&连接两个字符串的,.号则是作为对象操作符使用的;而在PHP中却使用.来连接两个字符串,够新鲜吧:)

另外还要注意PHP中两个单引号引起来的表示的是纯字符串,双引号引起来的还必须经过解析,将里面的含有的变量标识符用这个变量的值替换,这个需要许多初学者注意(俺用JavaScript表示字符串时习惯用单引号了,hiahiahia,PHP真体贴俺…)

还有好多好多特性,好多好多新鲜的东西,今天就看了点儿语法身体里就已经翻江倒海了,不知道再看下去会不会流鼻血……

— EOF —