很早以前我就想用脚本去重启PHP服务,不过没用,因为之前一直用的crontab任务进行定时重启就行了。

为什么会有这个需求呢?因为穷,买不起高配置服务器,程序导致服务器内存太高之后,就无法正常运行了,所以就需要清理服务器内存,清理内存有很多方法,而最有效的方式就是重启数据库或者其他web服务,但是这其中最安全的就是重启php服务了,刚好php占用又算大头,所以就一直用的重启php服务来缓解我的内存需求。

我一直用的centos系统,所以就按照我所需的写了,之前不用脚本,直接定时重启的命令:

0 */4 * * * /bin/systemctl restart php-fpm.service > /dev/null 2>&1
#每4个小时重启一次

具体重启命令根据自己的系统来,不一定就是systemctl restart php-fpm.service

然后现在就改成用脚本了,其实用脚本更麻烦,因为除了还是需要用到crontab之外,还加了内存的判断,当发现服务器可用内存低于40%的时候才重启,否则就不会重启。

脚本使用方法:

1、将脚本命令保存为restartphp.sh(命令在下面,自己按需修改了保存)

2、把脚本放进/root文件夹

3、进入root文件夹,给脚本设置为可执行文件

chmod +x restartphp.sh

4、编辑定时任务

crontab -e
0 * * * * /root/restartphp.sh
#脚本每小时执行一次,也按自己的需求改时间就行

保存定时任务,重启下crontab任务。

脚本命令:

#!/bin/bash

# 设置内存使用阈值
threshold=40

# 获取当前内存使用情况
total_memory=$(free | awk '/^Mem:/{print $2}')
used_memory=$(free | awk '/^Mem:/{print $3}')
free_memory=$(free | awk '/^Mem:/{print $4}')
available_memory_percentage=$((free_memory * 100 / total_memory))

# 打印当前内存使用情况
echo "Total Memory: $total_memory kB"
echo "Used Memory: $used_memory kB"
echo "Free Memory: $free_memory kB"
echo "Available Memory: $available_memory_percentage%"

# 检查是否需要重启 PHP-FPM
if [ "$available_memory_percentage" -lt "$threshold" ]; then
    echo "Available memory is below $threshold%. Restarting PHP-FPM..."
    
    # 根据发行版选择不同的服务名
    if [ -x "$(command -v systemctl)" ]; then
        # CentOS 7+ 
        systemctl restart php-fpm
    elif [ -x "$(command -v service)" ]; then
        # CentOS 6 
        service php-fpm restart
    else
        echo "Failed to restart PHP-FPM: Unknown service management."
        exit 1
    fi
    
    if [ $? -eq 0 ]; then
        echo "PHP-FPM restarted successfully."
    else
        echo "Failed to restart PHP-FPM."
    fi
else
    echo "Available memory is above $threshold%. No action needed."
fi

里面的重启命令,根据你自己的实际系统来,就是换掉:systemctl restart php-fpm或者service php-fpm restart