php readfile无法访问七牛图片的问题

今天国庆有空,所以抽空定位下之前发现的七牛头像文件接口访问失效的问题。接口以前是正常的,中间无代码修改,最近发现有错误日志,同时app头像加载异常。

经过服务器业务日志分析,是php 的readfile函数失效。

在出问题的服务器用wget 和curl测试都无法很快下载,需要等非常长时间,但是我本地的浏览器正常,能很快访问。所以接口失败就应该是超时导致的。刚开始没有头绪,以为是七牛的安全相关的问题,后面根据wget的日志,发现每次都优先解析的是ipv6地址,于是怀疑可能是ipv6的问题。

于是禁用服务器的ipv6:

编辑文件/etc/sysctl.conf,
vi /etc/sysctl.conf

添加下面的行:
net.ipv6.conf.all.disable_ipv6 =1
net.ipv6.conf.default.disable_ipv6 =1

如果你想要为特定的网卡禁止IPv6,比如,对于enp0s3,添加下面的行。
net.ipv6.conf.enp0s3.disable_ipv6 =1

保存并退出文件。

执行下面的命令来使设置生效。
sysctl -p

再次尝试wget,curl,皆正常,于是测试php接口,恢复正常。

php下支持redis

phpredis

phpredis 版本:2.2.5
下载地址:http://pecl.php.net/package/redis
更新PHP后,原有的php redis组件失效,需要重新配置。

phpredis的判断方法:

phpinfo 获取php版本号,根据 PHP Extension的时间,在pecl页面寻找最贴近的新版本。比如我们的是20121226 我们就找 2.2.5 stable 2014-03-19 对应的2.2.5版本。

生成redis.so

拿到phpredis的代码包后,要用当前的php环境重新编译:

  1. 进入phpredis源码目录
  2. 生成配置,已下示例请根据实际路径调整:
    # /usr/local/php/bin/phpize
    # ./configure --with-php-config=/usr/local/php/bin/php-config
    # make && make install
  3. make
  4. 手动将modules目录下的redis.so 拷贝到php的组件目录,比如:
    cp modules/redis.so /usr/lib64/php/modules/

重启php-rpm

php下使用redis

php下使用redis

client的选择

先去官网看了下php的client支持,选择了:https://github.com/hiproz/php-redis-client
根据文档描述,只支持到redis4.0,所以我们需要安装redis4.0

安装redis4.0

下载 redis4.0

编译:

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar xzf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make

编译完成后,执行文件就在 src目录下,启动redis server

src/redis-server

安装好后,就可以用本地内置的client来测试:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

开机服务自启动

make install 后,reids在源码的util目录下提供了可以直接创建系统service的脚本install_server.sh。直接执行,就可以安装成系统服务:

[root@sz-svr1 utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli

设置成开机自启动:

[root@sz-svr1 /]# systemctl enable redis_6379
redis_6379.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig redis_6379 on

增加密码后的停止

在设置密码后,在我们用systemctl stop redis_xxxx时,redis不会停止,一直输出:

Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

所以我们需要在结束指令中,增加密码参数。具体修改自行参看/etc/rc.d/init.d/reids_xxxx

测试

至此,我们的环境完成了,我们执行测试代码 examples/raw_commands.php,在浏览器输入路径后,页面显示:

result: bar result: bar result: or value with spaces

观察php日志,确认代码,我们知道页面的结果是正确的。

支持php环境下的redis支持就完成了,剩下的就是码业务逻辑了。

hanve fun!

centos系统lnmp(nginx,mysql,php)环境搭建

新拿到vps,基本是裸机环境,如果要搞wordpress或者php后台,就需要php环境。

本来想手动安装,结果发现lnmp的一键脚本有更新。作者已经更新了1.2版本,基本都可以选择最新的版本了。http://lnmp.org/install.html

安装成功!

如果你担心以上脚本的安全性,也可以自己亲手安装官方的版本

  • 安装mysql
yum install -y mysql-server mysql mysql-deve

开机启动

chkconfig mysqld on

设置密码

mysqladmin -uroot password 'newpassword'
  • 安装nginx

设置 yum源

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=

安装

yum install nginx

如果需要添加www 用户和组

groupadd -f www
useradd -g www www
  • 安装apache

安装apache 主要是因为wordpress的静态url路由需要相应的组件。

yum install httpd
chkconfig httpd on