PHP 安装和配置
PHP 介绍:
PHP是Hypertext Preprocessor的缩写,是一种开源的服务器端脚本语言,特别适用于网页开发。
PHP特点:
1、PHP属于解释型语言, PHP 代码在执行时由 PHP 解释器实时解释和执行
2、跨平台,PHP可以在多种操作系统上运行,如Windows、Linux和Mac OS。
3、语法简单,易于学习
脚本(Script):
在戏剧和电影行业中,Script叫作剧本,后来这个概念被引入计算机领域时,脚本的含义转变为一系列指令,指导计算机执行一定的任务或操作。所以简单的计算机程序就叫作脚本,编写这种程序的语言叫作脚本语言。
安装 PHP 解释器
包管理器安装
# redhat系列
sudo apt-get install php
# debian系列
sudo dnf install php
源码编译安装
1、下载源码包
下载地址:https://www.php.net/releases/
2、安装编译工具
sudo apt install gcc make
3、生成makefile
./configure --prefix=/usr/local/php \
--enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl \
--with-zlib --enable-mbstring --enable-xml --enable-sockets \
--with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \
--enable-fpm --enable-maintainer-zts --disable-fileinfo
说明:即使某些源码没有安装,后面也可以编译扩展模块源码的方式进行安装的。
4、编译和安装
sudo make -j 4 && sudo make install
5、准备配置文件
编译安装完成后,会在源码包里生成两个配置文件模板
-
php.ini-development:这个配置文件是为开发环境优化的。可能会启用一些不适合生产环境的设置,例如显示错误到输出到屏幕
-
php.ini-production:这个配置文件是为生产环境优化的。此配置文件通常配置为将错误记录到服务器日志中,而不是显示在用户的浏览器上。
因为在编译的时:
-
通过
--with-config-file-path
指定 PHP 查找主配置文件(php.ini)的路径。在运行 PHP 时,它会在这个指定的路径下寻找 php.ini 文件。 -
通过
--with-config-file-scan-dir
指定一个目录,PHP 会在这个目录下扫描并解析所有 .ini 格式的额外配置文件。
所以需要将 php.ini-development 或 php.ini-production (根据您的环境选择适当的一个)
复制到 /etc 目录下,并重命名为 php.ini。
sudo cp php.ini-production /etc/php.ini
如果 /etc/php.d 目录不存在需要进行创建。
sudo mkdir /etc/php.d
6、其它配置
例如:配置PATH变量
# echo 'PATH=/usr/local/php/bin:$PATH' > /etc/profile.d/php.sh
$ source /etc/profile.d/php.sh
输入 php -v
,如果能显示版本信息就说明PHP解释器安装成功了。
php -v
PHP 解释器配置
配置文件管理
查看配置文件默认位置:
如果需要查看配置文件的所在配置,可以通过 php --ini
查看配置文件路径。
php --ini
查看(php.ini)文件内容:
直接使用命令 php -ini
可以查看 PHP 的配置信息,这相当于在命令行环境下执行了 phpinfo()
函数
基础配置
隐藏PHPPHP版本信息
通过 expose_php 指令
可以实现版本信息的隐藏,有两个默认值:
-
On:响应报文显示首部字段x-powered-by: PHP/x.y.z,暴露php版本
-
Off:不显示PHP版本信息
例如:
expose_php = Off
设置 PHP 中所有日期/时间函数使用的默认时区
通过 date.timezone 指令
可以实现
例如:
date.timezone =Asia/Shanghai
设置是否开启短标签
通过 short_open 指令
指定是否开启短标签模式。
-
On:启用短标签模式,
短标签则是 <? 和 ?>
-
Off:不启用短标签模式
例如:
short_open_tag=on
设置最大内存
通过 memory_limit 指令
可以控制 PHP 脚本可以消耗的最大内存量。常用于限制单个脚本的内存使用,以防止耗尽所有可用内存。
例如:
memory_limit = 128M
设置单个PHP脚本的最长执行时间
通过 max_execution_time 指令
可以实现。
例如:
max_execution_time = 30
上传数据大小设置:
如果需要设置上传数据的大小,一般需要设置以下三个选项。
-
upload_max_filesize
指定了单个文件上传的最大尺寸。如果您尝试上传一个大小超过这个限制的文件,上传将会失败。 -
post_max_size
:指定了整个 POST 请求体的最大尺寸,包括所有的文件和其他 POST 数据。意味着,整个 POST 请求的大小(包括所有的文件和其他表单数据)必须小于或等于 post_max_size 的值。 -
max_file_uploads
:设置同时可以上传多少个文件
例如:
上传一个 100MB 的文件,而 upload_max_filesize 大于 100MB 但 post_max_size 小于 100MB,则上传会失败,因为虽然单个文件的大小在限制范围内,但整个 POST 请求的大小超过了 post_max_size 的限制。
错误日志管理
PHP解释器的错误日志可以通过以下参数选项来进行设置。
-
error_reporting
:定义要记录哪些类型的错误。 -
display_errors
:控制是否在屏幕上显示错误。在生产环境中通常设置为 Off,以防止错误信息暴露给用户。 -
log_errors
:启用或禁用错误日志记录。 -
error_log
:定义错误日志文件的路径。一般用绝对路径。如果是相对路径则是相对于 PHP 当前的工作目录(从命令行运行 PHP 脚本,那么 PHP 的工作目录是您在终端中运行 PHP 命令时的当前目录。)
例如:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
Session存储管理
PHP 的 session 是一种用于在多个页面请求或多个页面访问之间保持用户数据的方法。
-
当用户访问一个使用 PHP session 的网站时,PHP 会创建一个唯一的 session ID。这通常在 PHP 脚本中调用 session_start() 时发生。
-
Session ID 通常通过 cookie(名为 PHPSESSID)发送到用户的浏览器,并随后的每个请求一起发送回服务器。这样服务器就能识别不同的用户。
-
服务端根据 session ID 存储和访问与每个用户相关联的 session 数据。这些数据存储在服务器上,例如在文件、数据库或其他存储系统中。
PHP 的 php.ini 文件包含了与 session 相关的配置选项。这些配置控制着 session 的行为。
Session 存储
session.save_handler 选项
:决定了 session 数据是如何被保存的。
-
files
:使用文件系统来存储 session 数据。 -
user
:允许您定义自己的 session 存储机制 -
其他值,如 memcache、memcached 或 redis,这些需要安装和配置相应的 PHP 扩展,并且允许将 session 数据存储在内存中,以提高性能。
session.save_path 选项
:指定了 session 数据的存储位置,这个值取决于session.save_handler的值。
例如:
session.save_handler = files
session.save_path = "/tmp"
Session 生命周期
session.gc_maxlifetime
:session 数据在服务器上存储的最长时间,单位是秒
session.gc_probability
:触发垃圾回收进程的概率,和session.gc_divisor 配合使用。设置为 0 会完全禁用自动的垃圾回收过程,而设置为大于 0 的值将启用垃圾回收。
session.gc_divisor
:用于设定概率计算的除数。每次 PHP session 启动时,PHP 会执行一个随机概率计算,以决定是否运行垃圾回收进程。
例如:表示如果session 数据在服务器上存储的最长时间是1440秒。每次 PHP session 启动时会触发1%概率计算来回收垃圾
session.gc_maxlifetime=1440
session.gc_divisor=100
session.gc_probability=1
启动 session的几种情况:
1、新的 session 创建:当一个用户首次访问使用了 session 的 PHP 应用时,会创建一个新的 session。
2、已存在的 session 继续使用:当一个用户再次访问应用时,PHP 会尝试通过 session ID 来继续已存在的 session。
所以在任一情况下,当 session_start() 被调用时,PHP 将根据 session.gc_probability 和 session.gc_divisor 的设置来决定是否执行 session 垃圾回收。
扩展模块管理
PHP解释器和apache一样,也是基于模块化设计的。在 PHP 中,模块化主要体现在对扩展的支持上。PHP 核心提供了基本的语言功能,而额外的功能,如数据库连接、图像处理、加密功能等,则通过各种扩展(extensions)提供。
PHP 扩展是一种动态库(如 .so 文件在 Unix/Linux 系统上,或 .dll 文件在 Windows 系统上),可以在 PHP 安装时静态编译进 PHP,或者在运行时动态加载。
查看当前已经启用的扩展模块:
<?php
phpinfo();
?>
php -m
扩展模块安装位置:
通过 extension_dir 指令
可以指定扩展模块的安装存放位置,如果配置文件中没有指定,PHP 将使用其默认值。默认值取决于 PHP 在编译时的配置。
php -i | grep extension_dir
例如:
extension_dir = "/usr/local/php/lib/php/extensions
获取扩展模块方式:
方式一:包管理工具获取
如果PHP解释器是通过包管理器进行安装的,可以通过对应的包管理工具来安装扩展模块。
例如:ubuntu安装 MySQL 扩展
sudo apt-get install php-mysql
方式二:从PHP 官方源代码获取
对于一些核心扩展,它们的源代码包含在 PHP 的官方源代码发布中。当从 PHP 官方网站 下载 PHP 源代码时,这些核心扩展的源代码通常已包含在内。
这些模块存放位置是在:源码目录下的/ext目录中
方式三:从 PECL 获取
PECL是 PHP Extension Community Library 的缩写,包含各种 PHP 扩展的仓库。这些扩展通常提供了 PHP 不自带的额外功能,比如特定的数据库支持、加密方法等。
编译安装扩展模块流程
这种方式特别适合于PHP解释器是源码编译安装的,当然即使 PHP 解释器是通过包管理器(如 apt、yum)安装的,仍然可以通过编译扩展模块的方式来安装新的 PHP 扩展。
-
下载扩展模块源码包,如果PHP解释器的ext目录下存在,就进入指定模块源码目录。
-
在源码目录下执行phpize命令,为扩展的编译准备必要的配置文件和脚本。
-
通过configure脚本生成Makefile文件
-
通过make && make install 安装扩展模块
-
在配置文件中通过extension选项启用扩展模块
执行phpize的作用:
-
生成配置脚本:phpize 会生成 configure 脚本(需要提前装好autoconf),这个脚本用于配置扩展的编译过程,以确保扩展正确地与当前安装的 PHP 版本兼容。
-
准备编译环境:它设置必要的环境变量和编译选项,以便正确地编译 PHP 扩展
-
确保兼容性:phpize 确保扩展可以与您当前安装的 PHP 版本一起编译和运行。它会检查 PHP 的版本和编译参数,并生成适合这些参数的配置和构建文件。
-
创建 config.m4 文件:对于需要编译的 PHP 扩展,phpize 会创建或更新 config.m4 文件,这是自动工具用来管理扩展编译过程的文件。
例如:编译安装 readline 模块
1、获取源码
因为redline属于PHP的核心模块之一,在源码目录下的ext目录下就存放有readline的源码
cd php-7.4.33/ext/readline/
2、执行phpize,生成configure脚本(需要提前安装好autoconf)
phpize
3、生成makefile文件(相关依赖需要自行解决)
./configure
4、进行编译安装
sudo make
sudo make install
5、修改配置文件
sudo vim /etc/php.ini
[readline]
extension = readline.so
说明:
1、 [readline] 表示接下来的配置选项是关于 readline 扩展的。(这个配置可以省略)
2、 如果 extension_dir 在 php.ini 中被指定,则 PHP 将在该目录下搜索 readline.so,如果没有就使用安装时的默认路径来查找 readline.so。