分类目录归档:PHP

CentOS的Nginx下安装高版本php+mysql

1. 首先安装 Remi Repository

## Install Remi & Epel Repository on RHEL/CentOS 6.4-6.0 - 32 Bit ##
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 

## Install Remi & Epel Repository on RHEL/CentOS 6.4-6.0 - 64 Bit ## (6.5也可用)
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 

## Install Remi Repository on RHEL/CentOS 5.9-5.0 - 32 Bit ##
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

## Install Remi Repository on RHEL/CentOS 5.9-5.0 - 64 Bit ##
rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

2. 安装mysql

yum --enablerepo=remi,remi-test install mysql mysql-server

3. 配置mysql的root密码并开机启用mysql,这里密码我用123456

service mysqld start
/usr/bin/mysqladmin -u root password '123456'
chkconfig mysqld on

4. 安装php,php-fpm和php扩展

yum --enablerepo=remi,remi-test install php php-fpm php-common php-mysql php-gd php-mbstring php-xml

5. 启动php-fpm并设置为开机启动

service php-fpm start
chkconfig php-fpm on

回到你nginx的配置文件,也就是nginx.conf,如果你不是编译安装的也有可能是/etc/nginx/conf.d/的default.conf,把下面这部分的#号(注释)都去掉。

location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
}

然后重新加载nginx配置文件

/etc/init.d/nginx reload

注意:

这时如果你访问php文件出现file not found错误,请返回nginx配置文件,将下面这部分的文字

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

替换成下面

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

然后重新加载nginx配置文件,刷新浏览即可恢复正常

/etc/init.d/nginx reload

提示:

如果想让conf包含其他的conf,可以写追加

include /opt/nginx/conf.d/*.conf;

CentOS编译安装nginx-1.8.0

首先去http://nginx.org/en/download.html下载nginx-1.8.0,这里我下载到opt目录

后面我要设置nginx使用nginx用户和nginx用户组,所以执行下面命令

groupadd nginx
useradd -g nginx -s /sbin/nologin -M nginx

接下来安装编译环境

yum -y install pcre-devel
yum -y install gcc gcc-c++ ncurses-devel perl
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel

然后解压文件准备编译

cd /opt
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0

开始编译和安装

./configure --user=nginx --group=nginx --prefix=/opt/nginx --with-http_stub_status_module  --with-http_ssl_module  --with-http_flv_module --with-http_gzip_static_module
make
make install

编译完成之后,测试安装效果,出现版本号为安装成功

cd /opt/nginx/sbin
./nginx -v

QQ截图20150720002918

将以下脚本保存为nginx文件就在/etc/init.d目录下,注意如果你用外部编辑器请确认换行符为LINUX的,编码正确,其中/opt/nginx/请替换成你的安装目录

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# this script create it by jackbillow at 2007.10.15.
# it is v.0.0.2 version.
# if you find any errors on this scripts,please contact jackbillow.
# and send mail to jackbillow at gmail dot com.
#
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /usr/local/nginx/logs/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
 
nginxd=/opt/nginx/sbin/nginx
nginx_config=/opt/nginx/conf/nginx.conf
nginx_pid=/opt/nginx/logs/nginx.pid
 
RETVAL=0
prog="nginx"
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
 
[ -x $nginxd ] || exit 0
 
 
# Start nginx daemons functions.
start() {
 
if [ -e $nginx_pid ];then
   echo "nginx already running...."
   exit 1
fi
 
   echo -n $"Starting $prog: "
   daemon $nginxd -c ${nginx_config}
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
   return $RETVAL
 
}
 
 
# Stop nginx daemons functions.
stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid
}
 
 
# reload nginx service functions.
reload() {
 
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
 
}
 
# See how we were called.
case "$1" in
start)
        start
        ;;
 
stop)
        stop
        ;;
 
reload)
        reload
        ;;
 
restart)
        stop
        start
        ;;
 
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $"Usage: $prog {start|stop|restart|reload|status|help}"
        exit 1
esac
 
exit $RETVAL

然后执行下列命令,把nginx加入系统服务并设置成开机启动。如果你的配置跟我不一样请注意目录,用户名和用户组的替换

chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on
chown -R nginx:nginx /opt/nginx

最后启动nginx就可以了,别忘了开放80端口

service nginx start
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
service iptables save
chkconfig iptables on

CSS3的position: fixed;带来的闪烁等奇怪问题

前段时间博主发现自己网页中所有CSS属性含position: fixed;都出现了奇怪的问题,这些问题总结如下:

1. 在bootstrap中的modal中,有的时候出现无法输入显示文字的情况。录入光标会卡住,但是文本实际已经录入进去了,只不过UI没反应。

2. 还是上一个modal的问题,弹出modal之后背景会变黑掉这个效果,有的时候会出现部分区域不显示的情况。不是高度或者层被遮挡,而且是一块一块的不显示。

3. fixed的元素在页面滚动时出现时隐时现,元素闪烁的情况。

具体的解决方法是,往所有position: fixed;的元素添加

-webkit-transform: translateZ(0);

如下图恢复正常的效果:
QQ截图20150114125349

这样上面这些奇怪的问题就能解决,经过查阅网上也有资料说这是jquery-1.11.0会造成这种情况而7就不会,博主未加尝试。

七牛批量删除空间内的所有文件

最近在使用七牛的免费云存储服务,官方的工具好像并没有提供批量删除的功能,于是根据SDK简单写了一个批量删除的程序。

需要在php环境上使用,网盘传送门http://pan.baidu.com/s/1bntnxgV

配置好delete.php文件的bucket,accessKey和secretKey,运行即可,页面会自动刷新到全部删除完毕(删除过程中最好关闭空间的缓存,要不然会删不完啊喂!)

UMeditor为粘贴QQ截屏增加等待图片

一直在用百度的UMeditor,但是发现这个编辑器相比同出师门的Ueditor,更新频率差了很多。

在Ueditor中我们粘贴QQ截屏的时候,会先在编辑器中显示一个加载的GIF,如下图显示

QQ截图20141203170612

而在UM中完全没有这个效果,导致在实际部署中用户虽然使用了粘贴功能却不知道是否有文件正在上传。本地测试不容易发现因为上传速度太快了。

所以我们在UM中把这个功能加上即可,定位到umeditor.js,找到拖放文件到编辑区域,自动上传并插入到选区这个注释后面autoupload中的sendAndInsertImage函数

替换成如下代码

var sendAndInsertImage = function (file, editor) {

//创建模拟图片
var loadingId = 'loading_' + (+new Date()).toString(36);
var loadingHtml = '';
editor.execCommand('inserthtml', loadingHtml);

//模拟数据
var fd = new FormData();
fd.append(editor.options.imageFieldName || 'upfile', file, file.name || ('blob.' + file.type.substr('image/'.length)));
fd.append('type', 'ajax');
var xhr = new XMLHttpRequest();
xhr.open("post", me.options.imageUrl, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.addEventListener('load', function (e) {
    try {
        var json = eval('('+e.target.response+')'),
            link = json.url,
            picLink = me.options.imagePath + link;
       /* editor.execCommand('insertimage', {
            src: picLink,
            _src: picLink
        });*/
        var loader = me.document.getElementById(loadingId);
        if (loader) {
            loader.setAttribute('src', picLink);
            loader.setAttribute('_src', picLink);
            loader.removeAttribute('id');
         }
    } catch (er) {
    }
});
xhr.send(fd);
};

另外别忘了在themes\default\images文件夹下面放一个loading.gif,另存为下面这个就是了。
loading

再次测试,就可以看到效果了

QQ截图20141203171400

奇怪的两种@符号所引起的问题

最近笔者在编写移动端程序的时候,发现原先是用的@+命令没有效果,一直纳闷是什么原因?

最后发现问题出在安卓上的百度输入法!

百度输入法在中文和英文中提供了两种@符号,请看下图。

Screenshot_2014-04-22-00-04-59Screenshot_2014-04-22-00-05-05

经过分析,这两种@符号明显不同,中文版的at符号实际上为:,在经过unicode解析后,我们发现的编码为\uff20,而不是我们常见英文@的\u0040。这就导致如果我们PHP写下面的代码,就无效了。我们必须要对另外一种@符号进行判断

笔者之前一直以为@符号是中英文通用,也许是笔者之前的想法是错误的,不过这个符号的确给我带来了一些困扰,不知道百度输入法为什么要使用另外一个@符号呢?

 

使用Kses PHP 过滤HTML类 适配THINKPHP

根据HTML标签,属性来进行过滤的类,用于安全处理用户的富文本
在用户前台应用了富文本编辑器,这就使得HTML输出时面临XSS等危险代码的风险。为了解决这个问题,互联网上有很多正则替换的方法,但是都不是很保险且扩展性不高。

后来我在代码仓库中找到了Kses类,这是一个可以根据HTML标签,属性来进行过滤的类,修改了一下就可以适配THINKPHP了。

Kses的版权和相关协议归原作者所有。

———————–我是华丽丽的分割线—————————

Kses大家应该都不陌生,wordpress的富文本内容的过滤应用的就是这个东西。它的安全性还是可以保障的(如果有漏洞希望大家也反馈反馈!,我没进行具体的测试)

我修改后的类文件需要PHP5+THINKPHP3.2环境,如果你不是,请根据源文件和我的修改说明二次开发即可(原作者提供了PHP4的版本….)

下面我只讲解一下常用的方法,更多的方法可以参考附件里面的原作者提供的文档(是英文)。

首先,在配置文件中加入KSES_ALLOWED_PROTOCOLKSES_ALLOWED_HTMLKSES_ALLOWED_GLOBAL_ATTR元素,他们的意义分别为:允许的协议,允许的HTML元素及其属性,和允许的全局属性。

下面举个例子:

第一,我们允许用户在富文本中使用p元素和a元素,并且p元素不允许使用任何属性,a元素只允许使用href、name和target属性,我们在KSES_ALLOWED_HTML这么写:

'KSES_ALLOWED_HTML' => array(
        'p' => array(),
        'a' => array(
            'href' => true,
            'name' => true,
            'target' => true,
        )),

第二,我们允许用户在富文本中使用http、ftp和mailto连接协议,比如在a元素的href和img元素的src,我们在KSES_ALLOWED_PROTOCOL这么写:

'KSES_ALLOWED_PROTOCOL' => array(
        'http',
        'ftp',
        'mailto',
        )),

第三(可选),我们允许用户在富文本中所有HTML元素里使用title,style属性(这回覆盖我们设置的第一个步骤),我们可以在KSES_ALLOWED_GLOBAL_ATTR里这么写:

'KSES_ALLOWED_GLOBAL_ATTR'=>array(
        'style' => true,
        'title' => true,
        ),

然后我们在需要执行HTML过滤的地方实例化Kses类

命名空间(这个可能每个人不一样):

use Common\Api\Kses;

然后实例化,使用Parse方法

类似下面这个样子:

$kses = new kses;
        exit($kses->Parse('

测试

'));

那么如果我们是按照上面3步来设置的,最终会输出

测试

有人问为什么p元素支持style属性,请看第三步

———————–我是华丽丽的分割线—————————

上面是一个全部通过过滤的例子,再举几个不通过的。

如果我们的代码为

测试

那么style2连同后面都会被过滤掉,因为P元素和全局都没有设置允许使用style2属性。

如果我们代码:


整个img元素会被过滤掉,因为我们没有允许使用img元素(请看第一步)

附加!!全局属性请注意:

如果全局属性允许了style,那么系统只允许使用部分安全的CSS属性,比如上面的text-align就可以,但text-align2就不可以了。具体的这个项目在类文件的safecss_filter_attr方法,我已经内置了常用的CSS属性,如果需要扩展请自行修改。

比如我们写代码

测试

那么text-align2这个会被过滤掉

———————–我是华丽丽的分割线—————————

其实Kses还支持很多功能,比如还可以限制某个HTML元素属性填写多少字符的内容,更多的方法请参考附件中Kses的手册。

下面说一下我在类中修改了那些内容,我是从oop/php5.class.kses中修改过来的,只支持PHP5 + THINKPHP3.2哦!

修改日志 ( 2014-4-13 )
1. 增加命名空间,和配置等以适应THINKPHP
2. 修改类名。
3. 2014-4-13 01:21:01 修正参数名称BUG一个。
4. 增加了全局属性,以及CSS检测(也就是例子中的步骤三实现的功能)

大家注意看第三条,这是原作者版本中诡异的拼写错误,在oop/php5.class.kses的958行中,请把string2参数换成string。

我在附件中提供的原版是没有修改这个BUG的(THINKPHP适配版本肯定已经修改了),所以如果你要看原版演示,先把这个拼写错误修复了。

———————–我是华丽丽的分割线—————————

如果有什么问题大家可以再问!谢谢

下载KSES原版和THINKPHP适配版本