linux下php的安装和配置 实现文件上传下载

本文详细介绍了在Linux环境下安装和配置PHP,包括包安装与编译安装方法,重点讲解了PHP配置,如修改php-fpm和nginx配置以支持PHP应用。此外,还阐述了建立文件共享空间和实现文件上传的步骤,包括添加上传页面、编写上传脚本以及优化配置以支持大文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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服务使生效即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值