php.ini 文件配置

        前面已经拷贝了一个 php.ini 文件到 /usr/local/php/etc 目录下面,这是已经知道 php.ini 所在路径在哪里,但有时候并不知道 php.ini 所在路径,这时候就需要命令来查一查在哪里

1
[root@lamp ~]# /usr/local/php/bin/php -i |head

阅读全文 >>

php-fpm配置文件

        之前给出了 php-fpm.conf 的内容,下面给出一个模版,配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
user = php-fpm
group = php-fpm
listen.owner = nobody //和后面的nginx一致
listen.group = nobody //同上
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

        说明

  • [global] 部分是全局配置,指定 pid 文件路径以及 error_log 路径。
  • [www] 是一个 pool ,还可以再写第二个 pool ,第二个 pool 和第一个不易演的的地方,首先 pool 的 name ,比如叫做 [www2] 。然后 listen 肯定就不能一样了,比如 可以 listen = /tmp/php-fcgi2.sock 。而 user , group 也可以和 [www] 中定义的不一样。 listen.owner 这个是定义 /tmp/php-fcgi2.sock 这个文件的所有者是谁,在 php5.4 版本之后监听的 socket 文件权限默认变成了 600,如果不定义 listen.owner 那么 nginx 调用这个 socket 的时候就没有权限了,所以在这里定义 listen.owner 为 nginx 的子进程监听用户。
  • pm = dynamic 表示以动态的形式启动,在 php5.3 版本以后它可以支持动态和静态了,如果是静态,即 pm = static 时,下面的配置只有 pm.max.children 管用。
  • pm.max.children 表示启动几个 php-fpm 的子进程。如果是 dynamic ,下面的配置会生效,pm.max.children 表示最大可以启动几个子进程。
  • pm.start_servers 表示一开始启动几个子进程。
  • pm.max_requeste 表示一个子进程最多可以接受多少个请求,比如设置为500那么一个子进程手里500个请求后自动销毁。
  • rlimit_files 表示每个子进程打开的多少个文件句柄。
1
2
slowlog = /tmp/www_slow.log
request_slowlog_timeout = 1

        表示一个脚本执行时间超过 1秒就要记录这个slow.log ,记录这个可以看到这个脚本哪里执行慢,可以通过slow.log排查网站慢的原因,根据这个原因做一定的优化。

1
php_admin_value [open_basedir] = /data/www/:/tmp

        apache 可以设置 open_basedir ,php-fpm也可以,不同的 pool 设置不同的 open_basedir 可以针对不同的域名进行不同的限制。多个目录用 :分割。

LNMP- php编译安装

        首先针对 nginx 的 php 安装和针对 apache 的 php 安装是有区别的,因为 nginx 中的 php 是以 fastcgi 的方式结合 nginx 的。可以理解为 nginx 代理了 php 的 fastcgi ,而 apache 是把 php 作为子机的模块来调用的。php官方下载地址

1.下载 php 源码包

1
2
[root@lnmp ~]# cd /usr/local/src
[root@lnmp src]# wget http://aul.php.net/distributions/php-5.4.44.tar.bz2

2.解压源码包

1
[root@lnmp src]# tar jxf php.5.4.44.tar.bz2

3.创建相关帐号

1
[root@lnmp src]# useradd -s /sbin/nologin php-fpm

4.依赖包安装

1
yum install -y bzip2-devel curl-devel db4-devel libjpeg-devel libpng-devel libXpm-devel gmp-devel libc-client-devel openldap-devel unixODBC-devel postgresql-devel sqlite-devel aspell-devel net-snmp-devel libxslt-devel libxml2-devel pcre-devel mysql-devel unixODBC-devel postgresql-devel pspell-devel net-snmp-devel freetype-devel libtomcrypt-devel.x86_64 php-mcrypt libmcrypt libmcrypt-devel

5.配置编译参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@lnmp src]# cd php-5.4.44
[root@lnmp php-5.4.44]# ./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=php-fpm \
--with-fpm-group=php-fpm \
--with-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-ftp \
--enable-mbstring \
--enable-exif \
--disable-ipv6 \
--with-pear \
--with-curl \
--with-openssl

        在该过程中,若出现和 lamp 安装 php 的错误一样的错误参照 lamp 的方法来解决,若出现如下错误,参考下面解决办法:

        错误信息:

1
2
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/

        解决办法:

1
yum install -y libcurl-devel

6.编译 php

1
[root@lnmp php-5.4.44]# make

        在这一步,通常会遇到一些错误:

1
2
3
/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [sapi/fpm/php-fpm] 错误 1

        解决办法:

1
yum install -y libtool-ltdl-devel

7.安装 php

1
[root@lnmp php-5.4.44]# make install

        以上每一步骤,如果没有完全执行正确,那么下一步是无法进行的,使用 echo $? 看结果是否为 “0”,如果不是,就是没有执行正确。

8.修改配置文件

1
2
cp php.ini-production /usr/local/php/etc/php.ini
vim /usr/local/php/etc/php-fpm.conf

        添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

        保存配置文件后,检验配置是否正确的方法为:

1
/usr/local/php/sbin/php-fpm -t

        如果出现诸如 “test is successful” 字样,说明配置没有问题。

9.启动 php-fpm

        首先要拷贝一个启动脚本到 /etc/init.d 下

1
cp /usr/local/src/php-5.4.44/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

        更改权限为755

1
2
chmod 755 /etc/init.d/php-fpm
service php-fpm start

        如果要它开机启动,执行:

1
chkconfig php-fpm on

        检测是否成功:

1
ps aux |grep php-fpm

        看看是不是有很多进程

php中几个和mysql相关的扩展模块

        在编译php的时候,有这么几个和mysql相关的编译选项:

1
2
3
4
--with-mysql
--with-mysqli
--with-pdo-mysql
--enable-mysqlnd

        那这几个选项到底有什么不同呢?

        php官方文档上有这么一段话:

MySQL:This extension is deprecated as of PHP 5.5.0, and has been removed as of php 7.0.0.
MYSQLI: mysql Improved Extension
MySQLND: MySQL Native Drive
PDO:The PHP Data Objects。extension defines a lightweight, consistent interface for accessing databases in PHP。

        翻译成中文大概意思是:

MySQL扩展:在5.5.0版本中开始废弃,7.0.0版本中已经移除(也就是不支持了)
MySQLI扩展:是mysql扩展的增强版
MySQLnd:这是官方驱动,或者叫做原生驱动
PDO:PHP Data Objects,是PHP应用中的一个数据库抽象层规范

        在PHP扩展的角度上看,MYSQL和MYSQLi还是比较上层的扩展,依赖更底层的库去连接和访问数据库。 MYSQLND 就是所说的底层的数据库驱动。

        从应用的层面上看,我们通过PHP 的MYSQL或者MYSQLi扩展提供的API去操作数据库。

        从底层来看,MYSQLND提供了底层和数据库交互的支持(可以简单理解为和MySQL server进行网络协议交互)。

        而PDO,则提供了一个统一的API接口,使得你的PHP应用不去关心具体要连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。比如MYSQL,SQLITE任何数据库都行。

        即从大部分功能上看,PDO提供的API接口和MYSQLI提供的接口对于普通的增删改查效果是一致的。

        最后再贴几个php的代码,来区分几个扩展的用法:

  1. mysql连接
1
2
3
4
5
6
<?php
$conn = @ mysql_connect("localhost", "root", "") or die("数据库连接错误");
mysql_select_db("bbs", $conn);
mysql_query("set names 'utf8'");
echo "数据库连接成功";
?>
  1. mysqli连接
1
2
3
4
5
6
7
8
9
<?php
$conn = mysqli_connect('localhost', 'root', '', 'bbs');
if(!$conn){
die("数据库连接错误" . mysqli_connect_error());
}
else{
echo"数据库连接成功";
}
?>
  1. PDO连接
1
2
3
4
5
6
7
8
9
<?php
try{
$pdo=new pdo("mysql:host=localhost;dbname=bbs","root","");
}
catch(PDDException $e){
echo"数据库连接错误";
}
echo"数据库连接成功";
?>