linux下php的安装和配置
一、PHP介绍
使用之前我们先了解一下什么是PHP,它的全称叫“PHP: Hypertext Preprocessor”,是一种开源的脚本语言,能够嵌入到HTML中运行实现一些动态处理功能。
实质上PHP文件就是一种嵌入了PHP代码的HTML文件,只是为了区别经常以.php为扩展名,当然使用.html扩展名也是没问题的。
大家还比较熟悉一种动态网页脚本语言JS(JavaScript),区别在于JS运行在客户端,而PHP运行在服务器端,相辅相成、互相成就。
在web应用之外,PHP还可以作为命令行脚本文件运行,只要安装php解析器,不需要浏览器和服务器即可运行。甚至可以构建具有图形界面的桌面应用程序(PHP-GTK),属实强大。
二、PHP安装
如果需要自己配置服务器和 PHP,有两个方法将 PHP 连接到服务器上。对于很多服务器,PHP 均有一个直接的模块接口(也叫做 SAPI)。这些服务器包括 Apache、Microsoft Internet Information Server、Netscape 和 iPlanet 等服务器。
如果你使用的 web 服务器不支持 PHP 模块接口,还可以使用 CGI 或 FastCGI 处理程序来处理服务器上的 PHP 文件请求。
本次我们主要讲解如何在Linux的web服务器中使用 CGI 可执行程序。当然在开始前,我们有必要对几个名词做一些细节的认识:
- *php-fpm:用来管理php-fastcgi的管理程序;PHP-FPM运行时会创建一个主进程master,并根据实际需要控制何时/如何将HTTP请求转发给一个或多个子进程worker处理,同时还控制着何时创建/销毁PHP子进程。
- *php-fastcgi:一个cgi程序,用来解析php请求,并且返回结果,由于cgi程序只能解析,不会管理自身的运行,所以出现了上述的php-fpm管理程序。
之所以叫fastcgi,是因为在php5版本出现前,有一种相比之下效率低的cgi程序(php-cgi),每当一个请求过来后,cgi都要创建一个进程来读取php.ini里的基础配置信息,初始化执行环境,然后返回数据,退出进程,运行开销很大;
PHP5开始引入一种新的高效的处理机制(php-fastcgi),cgi只需启动一个主进程(master),主进程读取一次配置,然后在需要时启动多个工作进程(worker),这样当一个请求到来时,由master传递给worker,worker不需要重复读取配置文件。
1、包安装
使用包安装系统和命令实现全自动安装,可以得到一个标准配置的PHP,适合对PHP没有定制化配置要求的场景,比如我们要构建的个人动态站点和文件共享空间。
以CentOS 8系统为例,可以用以下一条命令,安装主应用和所需的所有扩展应用【72w代表版本号为7.2.x】。
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-odbc php72w-xml
安装后各个文件的路径
使用yum安装后,各文件将分散到多个路径中,如:
- /etc/目录下有php-fpm.d和php.d文件夹及php.ini配置文件
- 在php.fpm.d文件夹下有www.conf配置文件
- /usr/share/和/var/还有/run/下也有部分相关文件
2、编译安装
安装后各个文件的路径
三、PHP配置
1.配置php相关配置文件
在启动php服务之前,需要修改 php-fpm.conf 配置文件,确保 php-fpm 模块使用的用户名和用户组具有读写权限。CentOS中可使用nobody,Ubuntu中可使用www-data。
vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
;user = apache
user = nobody
; RPM: Keep a group allowed to write in log dir.
;group = apache
group = nobody
*为了确保服务器安全,建议将 /etc/php.ini 文件中的配置项 cgi.fix_pathinfo 设置为 0,这样当所访问的文件不存在时,将阻止 Nginx 将请求发送到后端的 PHP-FPM 模块, 以避免遭受恶意脚本注入的攻击。
vi /etc/php.ini
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
*在vi中可使用/cgi.fix_pathinfo
进行向后搜索,快速定位。
最后启动 php-fpm 服务:
php-fpm
*执行上述指令可能会出现以下报错,说明无权限创建文件php-fpm.pid,无法启动运行。
ERROR:Unable to create the PID file (/run/php-fpm/php-fpm.pid).: Read-only file system
ERROR: FPM initialization failed
这时可切换到root用户,在/run/php-fpm/目录手动创建一个php-fpm.pid文件来解决。
mkdir php-fpm.pid
2.配置 Nginx 使其支持 PHP 应用:
打开nginx配置文件
vi /etc/nginx/nginx.conf
找到http标签中server标签内的默认location块,使其支持 .php 文件:
location / {
root html; #网页根目录,可根据实际情况修改为其他目录
index index.php index.html index.htm; #默认访问的根目录下的文件,按顺序匹配
}
接下来配置使nginx支持将.php请求转发至php-fastcgi处理。
location ~* \.php$ {
fastcgi_index index.php; #可省略
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
检查配置文件中server标签中是否存在以下内容,若存在则将其注释掉,否则将使用默认配置,无法使用。
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf; #要注释掉该行
重启 Nginx。
sudo nginx -s stop
sudo nginx
创建测试文件。
echo "<?php phpinfo(); ?>" >> /usr/share/nginx/html/index.php
在客户端打开浏览器,访问服务器ip地址或域名,将会显示 phpinfo()相关信息 ,配置成功。
四、建立可浏览和下载的文件共享空间
在nginx.conf文件的server标签中,增加以下代码
location /files {
root html;
autoindex on;
}
在客户端打开浏览器,访问服务器ip地址或域名/files,就能够访问到files文件夹中的文件了。
五、实现文件上传
通过php可以实现文件上传,具体步骤如下:
1.添加上传页面
上传动作是通过向php脚本提交表单实现的。首先要在网页中添加表单,如下, 标签的 type=“file” 属性规定了应该把输入作为文件来处理,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮,点击后可选择要上传的文件。
<html>
<head>
<meta charset="utf-8">
<title>上传文件</title>
</head>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file_name">文件名:</label>
<input type="file" name="file_name" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
2.实现文件上传脚本
“upload_file.php” 文件就是含有上传指令的脚本文件。其内容主要包括:
<?php
if ($_FILES["file_name"]["error"] > 0)
{
echo "错误:" . $_FILES["file_name"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file_name"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file_name"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file_name"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file_name"]["tmp_name"];
// 判断当前目录下的 upload 目录是否存在该文件
// 如果没有 upload 目录,你需要创建它,并修改upload 目录权限为 777
if (file_exists("upload/" . $_FILES["file_name"]["name"]))
{
echo $_FILES["file_name"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file_name"]["tmp_name"], "upload/" . $_FILES["file_name"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file_name"]["name"];
}
}
?>
第一个方括号中的参数是所提交表单中要上传文件的 input标签的name,第二个方括号参数可以是 “name”、“type”、“size”、“tmp_name” 或 “error”。如下所示:
$_FILES["file_name"]["name"] - 上传文件的名称
$_FILES["file_name"]["type"] - 上传文件的类型
$_FILES["file_name"]["size"] - 上传文件的大小,以字节计
$_FILES["file_name"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file_name"]["error"] - 由文件上传导致的错误代码
其中$_FILES[“file_name”][“error”]返回值为0-7,分别代表不同的错误,在出现问题时方便我们排查:
UPLOAD_ERR_OK - 值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE - 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE - 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL - 值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE - 值:4; 没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR -其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE - 其值为 7,文件写入失败。PHP 5.1.0 引进。
通过一定的php编程,还可以对文件类型、文件大小、用户等进行限定,大家可自行学习php实现。
3.优化配置实现大文件上传
默认情况下,nginx只允许上传1M以内大小的文件,php只允许上传2M以内大小的文件,且脚本运行周期要在30秒内。这样当我们上传较大文件,或者上传速度受限时,就可能出现“413 Request Entity Too Large”等报错,这就需要我们对上述限制做一定的修改和优化,但要根据服务器的性能分配合适的限制值。以我的服务器为例:
首先打开nginx的nginx.conf文件,对nginx进行配置:
搜索“client_max_body_size”字段,如果有则改为“client_max_body_size 500M”,即客户端最大传输文件500MB;如果没有找到,就要手动添加该参数,添加在不同的位置,意义不同。配置保存后需要重启nginx服务才能生效:
http {
include mime.types;
#添加在http标签下,表示所有http页面的上传文件上限为500M
client_max_body_size 500M;
...
}
http {
include mime.types;
client_max_body_size 500M;
...
server {
listen 80;
server_name localhost;
...
#添加在server标签下,表示该站点页面的上传文件上限为500M
client_max_body_size 500M;
...
}
}
http {
include mime.types;
client_max_body_size 500M;
...
server {
listen 80;
server_name localhost;
...
location / {
root html;
index index.html index.htm;
...
#添加在location标签下,表示该页面的上传文件上限为500M
client_max_body_size 500M;
...
}
}
}
打开php.ini文件对php配置进行优化
找到“file_uploads = on”字段,该选项表示是否允许通过HTTP上传文件,默认为ON,需要我们合适一下。
找到“upload_max_filesize = 2m”,该选项表示允许上传文件大小的最大值,我们要修改为“upload_max_filesize = 500m”。
找到“post_max_size = 8m”,该选项指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值,默认为8M,我们要修改为“post_max_size = 508m”,比upload_max_filesize大一些。
找到“max_execution_time = 30” ,每个PHP页面运行的最大时间值(秒),默认30秒,我们要修改为合适的时长,也可以设置为0表示不限制。
找到“max_input_time = 60” ,每个PHP页面接收数据所需的最大时间,默认60秒,我们要修改为合适的时长,也可以设置为0表示不限制。
找到“memory_limit = 8m“,每个PHP页面所吃掉的最大内存,默认8M,我们要修改为合适的时长,也可以设置为0表示不限制。
找到“upload_tmp_dir”字段,即文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹,大对于大文件来说可能会直接报错未指定临时文件夹,所以我们最好手动设置一下,比如upload_tmp_dir = "/tmp/httpservercache"。
至此,配置优化完成,重新启动php服务使生效即可。