当前位置: 首页 > article >正文

浅析如何创建和使用Shell脚本实现PHP部署自动化

如果你的 PHP 部署流程是这样的SSH 登录服务器git pullcomposer install可能跑一下php artisan migrate清一些缓存重载 PHP-FPM 或 nginx双手合十祈祷这个流程能跑直到你要管理多台服务器你需要快速回滚你忘了某个小步骤然后生产环境炸了团队里其他人的操作方式跟你不太一样到那时候部署就不再是一个任务了——它变成了一种仪式脆弱、没有文档、而且只有知道确切步骤的那个人才能搞定。Shell 脚本是解决这个问题的一种非常简单的方式。你不需要 Kubernetes、Terraform也不需要一整套 CI/CD 平台来实现真正的部署自动化。一个写得好的 shell 脚本可以把 15 条手动命令变成一条可重复执行的命令让你的部署过程用代码记录下来减少人为错误和哎呀我忘了清缓存的时刻成为后续 CI/CD 流水线的构建基础在这篇文章中我们将讲解Shell 脚本基础从 PHP 开发者的角度为 PHP 应用构建一个简单的部署脚本用安全检查、日志、回滚来改进它用releases/和current/符号链接组织部署把脚本接入 Git 或 CI读完之后你会有一个可以适配到自己应用的部署脚本——无论是 Laravel 项目、自定义 PHP 后端还是其他业务系统。PHP 应用部署的核心步骤在写任何脚本之前先搞清楚在你的场景下部署具体意味着什么会很有帮助。在 Linux 服务器上一个典型的 PHP 部署可能需要获取代码克隆仓库或拉取最新更改切换到特定的分支或标签安装依赖composer install --no-dev --optimize-autoloader可选前端npm ci npm run build准备环境确保.env文件存在链接共享目录上传文件、storage、日志运行维护任务数据库迁移php artisan migrate --force清除/优化缓存php artisan config:cache、route:cache等切换版本并重启服务更新符号链接指向新版本重载 PHP-FPMsystemctl reload php-fpm可能需要重启队列 worker可选回滚如果出问题能够切换回上一个版本你脚本的工作就是把这一切用可靠、可重复的方式编码下来。Shell 脚本入门PHP 开发者视角如果你对 PHP 很熟悉但对 shell 脚本还不太了解这里有足够的 Bash 基础让你能上手干活。每个 shell 脚本都应该以一行开头告诉系统用什么解释器1#!/usr/bin/env bash这让你的脚本可以像其他命令一样执行。让脚本可执行创建一个文件1nano deploy.sh写入12#!/usr/bin/env bashechoDeploying PHP app...保存然后12chmodx deploy.sh./deploy.sh你应该会看到Deploying PHP app...这样你的第一个 shell 脚本就跑起来了。快速失败set -euo pipefail在脚本顶部shebang 之后加上1set-euo pipefail这做了三件重要的事-e如果任何命令返回非零退出码脚本就退出-u把未设置的变量当作错误-o pipefail如果管道cmd1 | cmd2中cmd1失败了整个管道都算失败这就像告诉你的脚本如果出了任何问题就停下来。别继续跑然后假装一切正常。变量和参数基本变量12APP_NAMEmy-php-appREPO_URLgitgithub.com:yourname/your-app.git访问位置参数1ENVIRONMENT${1:-production}# 如果没提供参数默认是 production运行1./deploy.sh staging在脚本里$ENVIRONMENT就是staging。函数你可以用函数来组织脚本1234567deploy() {echoDeploying to environment: $ENVIRONMENT}rollback() {echoRolling back...}调用它们123456789101112case${1:-deploy}indeploy)deploy;;rollback)rollback;;*)echoUsage: $0 [deploy|rollback]exit1;;esac这种模式让你的脚本更易读、更好维护。退出码exit 0→ 成功exit 1→ 通用失败其他代码可以表示特定错误可选但挺好知道了这些基础你就可以开始自动化真正的工作了。构建简单的 PHP 部署脚本单服务器让我们从一个直接的场景开始单台 Linux 服务器比如 UbuntuNginx PHP-FPMPHP 应用在/var/www/myapp你通过 SSH 登录服务器然后运行./deploy.sh来部署目录结构我们先保持简单/var/www/myapp/├── .git/├── public/├── vendor/├── storage/└── ...部署流程git pullcomposer install清缓存重载 PHP-FPM这是一个最小脚本123456789101112131415161718192021222324252627282930313233343536373839#!/usr/bin/env bashset-euo pipefailAPP_DIR/var/www/myappPHP_FPM_SERVICEphp8.2-fpm# 根据你的 PHP 版本调整BRANCH${1:-main}# 默认分支log() {echo[$(date %Y-%m-%d %H:%M:%S)] $*}cd$APP_DIRlogFetching latest code from branch $BRANCH...git fetch --allgit checkout$BRANCHgit pull origin$BRANCH--ff-onlylogInstalling PHP dependencies with Composer...COMPOSER_ALLOW_SUPERUSER1 composerinstall\--no-dev \--prefer-dist \--optimize-autoloader# 如果你用的是 Laravel 或其他框架添加框架特定的步骤if[[ -f artisan ]];thenlogRunning database migrations...php artisan migrate --forcelogClearing and caching Laravel configuration...php artisan config:clearphp artisan config:cachephp artisan route:cache ||true# route cache 在开发环境可能会失败filogReloading PHP-FPM service...sudosystemctl reload$PHP_FPM_SERVICElogDeployment completed successfully.用法123chmodx deploy.sh./deploy.sh# 部署 main 分支./deploy.sh production# 如果你想用名为 production 的分支这已经比手动运行每条命令好多了步骤在脚本里清晰可见如果出问题会快速失败任何有权限的人都能运行同样的流程但我们可以大幅改进它。增强安全性备份、检查与回滚上面的简单脚本有个大问题如果迁移挂了或者部署半途出问题你唯一的回滚方式是希望你有备份。让我们开始加安全网。

相关文章:

浅析如何创建和使用Shell脚本实现PHP部署自动化

如果你的 PHP 部署流程是这样的:SSH 登录服务器git pullcomposer install可能跑一下 php artisan migrate清一些缓存重载 PHP-FPM 或 nginx双手合十祈祷这个流程能跑,直到:你要管理多台服务器你需要快速回滚你忘了某个小步骤,然后…...

waifu2x-caffe终极指南:5分钟掌握AI图像放大降噪神器

waifu2x-caffe终极指南:5分钟掌握AI图像放大降噪神器 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 你是否曾经为模糊的动漫截图、低分辨率的老照片而苦恼?waifu2x-caffe正是为解…...

重新定义窗口管理:Traymond如何让混乱桌面变整洁

重新定义窗口管理:Traymond如何让混乱桌面变整洁 【免费下载链接】traymond A simple Windows app for minimizing windows to tray icons 项目地址: https://gitcode.com/gh_mirrors/tr/traymond 在现代数字工作环境中,我们常常被无数个打开的窗…...

避坑指南:达梦数据库Docker部署中的5个常见错误及解决方法

避坑指南:达梦数据库Docker部署中的5个常见错误及解决方法 在国产数据库技术快速发展的今天,达梦数据库凭借其优异的性能和兼容性,正成为越来越多企业的选择。而Docker技术的普及,则为达梦数据库的部署提供了更灵活、高效的解决方…...

AI模型嵌入式测试怎么做?:从Prompt注入到LLM幻觉捕获的5类新型缺陷拦截实战

第一章:AI原生软件研发质量保障体系构建 2026奇点智能技术大会(https://ml-summit.org) AI原生软件不同于传统软件,其核心逻辑高度依赖数据分布、模型行为与推理路径的动态性,导致传统基于确定性断言的质量保障手段失效。构建适配AI原生特性…...

LAN8720A硬件设计避坑指南:从原理图到吞吐量优化的7个关键点

LAN8720A硬件设计避坑指南:从原理图到吞吐量优化的7个关键点 在嵌入式以太网开发中,PHY芯片的设计往往成为项目成败的分水岭。作为Microchip旗下高性价比的10/100Mbps物理层收发器,LAN8720A凭借其低功耗和小封装特性,成为STM32等M…...

500kbps CAN总线调试实战:手把手教你用示波器测上升/下降沿时间(附某主机厂标准)

500kbps CAN总线信号完整性实战:从示波器设置到参数解读 在车载电子系统的开发与测试中,CAN总线的信号完整性直接关系到整个网络的通信可靠性。作为硬件调试工程师,掌握CAN差分信号的上升/下降沿时间测量技术,是排查通信故障、验证…...

Mermaid:基于文本驱动的图表生成架构,重塑技术文档的可视化协作范式

Mermaid:基于文本驱动的图表生成架构,重塑技术文档的可视化协作范式 【免费下载链接】mermaid Generation of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown 项目地址: https://gitcode.com/GitHub_Trend…...

5种方法彻底解决微信聊天记录备份难题:WechatBakTool技术解析与替代方案

5种方法彻底解决微信聊天记录备份难题:WechatBakTool技术解析与替代方案 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具,提供图形界面,解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/We…...

iOS开发必备:Xcode模拟国外定位全流程(附GPX文件制作教程)

iOS开发实战:Xcode模拟全球定位与GPX文件深度解析 想象一下,你正在开发一款面向全球用户的旅行社交应用,突然收到北欧用户的反馈:当他们在斯德哥尔摩打卡时,定位信息显示成了北京的某个商场。这种国际化定位问题&#…...

Java企业级应用开发:Phi-4-mini-reasoning辅助SpringBoot微服务构建

Java企业级应用开发:Phi-4-mini-reasoning辅助SpringBoot微服务构建 1. 当AI推理遇上企业级Java开发 想象一下这样的场景:你的电商平台突然遭遇订单激增,原有的业务逻辑开始出现各种边界情况。传统的硬编码规则已经难以应对,而手…...

实战指南:Retrieval-based-Voice-Conversion-WebUI语音转换框架深度解析与性能优化

实战指南&#xff1a;Retrieval-based-Voice-Conversion-WebUI语音转换框架深度解析与性能优化 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Re…...

OpenClaw配置优化:百川2-13B-4bits量化模型推理参数调优手册

OpenClaw配置优化&#xff1a;百川2-13B-4bits量化模型推理参数调优手册 1. 为什么需要参数调优&#xff1f; 第一次在本地部署百川2-13B-4bits模型时&#xff0c;我遇到了一个典型问题&#xff1a;同样的自动化任务&#xff0c;有时能完美执行&#xff0c;有时却会中途卡住或…...

C++的std--is_nothrow_swapable与异常安全保证在移动操作中的检查

C中的异常安全保证是编写健壮代码的重要考量&#xff0c;而移动操作的高效性更是现代C的核心特性之一。std::is_nothrow_swappable这一类型特性工具&#xff0c;为开发者提供了一种编译期检查手段&#xff0c;用于验证类型是否支持无异常的交换操作。本文将探讨这一特性如何与移…...

如何彻底解决Cursor AI试用限制:免费解锁Pro功能的完整技术方案

如何彻底解决Cursor AI试用限制&#xff1a;免费解锁Pro功能的完整技术方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached…...

SRWE:解锁Windows窗口无限可能的实时编辑神器

SRWE&#xff1a;解锁Windows窗口无限可能的实时编辑神器 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾经因为Windows应用程序的窗口限制而感到束手无策&#xff1f;想要调整游戏窗口大小获得高清截图…...

设置完成后如何将Android上的信息传输到iPhone?

许多用户在从Android手机切换到 iPhone时&#xff0c;会使用“转移到iOS ”功能来传输数据。然而&#xff0c;实际上&#xff0c;很多人在设置完成后才发现短信并未成功转移&#xff0c;或者他们当时可能跳过了这一步骤。因此&#xff0c;问题来了&#xff1a;设置完成后还能将…...

MacBook Air运行OpenClaw:百川2-13B-4bits量化版性能实测

MacBook Air运行OpenClaw&#xff1a;百川2-13B-4bits量化版性能实测 1. 为什么选择MacBook Air测试OpenClaw 去年我入手了一台M1芯片的MacBook Air&#xff0c;8GB内存版本。作为日常开发主力机&#xff0c;它轻便续航长的特点让我爱不释手&#xff0c;但一直有个疑问&#…...

SDC模调度框架

图-1 SDC模型调度图图-2 SDC架构流程图关键点说明&#xff1a;负环&#xff1a;在差分约束系统中&#xff0c;负环表示约束矛盾&#xff0c;当前 II 不可行。回溯&#xff1a;通过修改少量调度选择&#xff08;如操作绑定&#xff09;尝试解决矛盾&#xff0c;避免直接增加 II。…...

Unpaywall:三步解锁学术付费墙,让论文自由获取触手可及

Unpaywall&#xff1a;三步解锁学术付费墙&#xff0c;让论文自由获取触手可及 【免费下载链接】unpaywall-extension Firefox/Chrome extension that gives you a link to a free PDF when you view scholarly articles 项目地址: https://gitcode.com/gh_mirrors/un/unpayw…...

终极IDM永久激活解决方案:3种方法彻底解决试用期弹窗问题

终极IDM永久激活解决方案&#xff1a;3种方法彻底解决试用期弹窗问题 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xff08;IDM…...

专业级Minecraft世界数据恢复实战指南:Region Fixer深度解析与最佳实践

专业级Minecraft世界数据恢复实战指南&#xff1a;Region Fixer深度解析与最佳实践 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/…...

Artisan烘焙软件:咖啡烘焙师的终极数据可视化与分析平台

Artisan烘焙软件&#xff1a;咖啡烘焙师的终极数据可视化与分析平台 【免费下载链接】artisan artisan: the worlds most trusted roasting software 项目地址: https://gitcode.com/gh_mirrors/ar/artisan 在咖啡烘焙的世界里&#xff0c;精确控制烘焙曲线意味着风味的…...

从Velodyne VLP-16实战出发:手把手教你配置Cartographer实现真实场景3D建图(附避坑参数详解)

从Velodyne VLP-16到高精度3D建图&#xff1a;Cartographer实战进阶指南 当激光雷达点云在屏幕上第一次正确拼接成连贯的走廊轮廓时&#xff0c;那种成就感难以言表。但在此之前&#xff0c;你可能已经经历了无数次rviz黑屏、TF报错和参数调试的煎熬。本文将带你跨越从Cartogr…...

开源工具探索——OpenDroneMap:从无人机影像到三维地理信息的自动化构建

1. 为什么你需要了解OpenDroneMap&#xff1f; 如果你手头有一台消费级无人机&#xff0c;或者正在从事地理信息相关工作&#xff0c;那么OpenDroneMap&#xff08;简称ODM&#xff09;绝对值得你花时间研究。这个开源工具能把杂乱无章的航拍照片&#xff0c;自动转换成专业级的…...

告别手动点击!Python脚本批量下载InterPro蛋白质结构域数据(附完整代码)

Python自动化实战&#xff1a;高效批量获取InterPro蛋白质结构域数据 在生物信息学研究中&#xff0c;处理蛋白质结构域数据是许多分析流程的关键起点。手动从InterPro数据库逐个下载数百甚至数千个蛋白质的结构域信息&#xff0c;不仅耗时费力&#xff0c;还容易出错。本文将带…...

python作用域:变量的访问规则详解

Python作用域定义了变量的访问范围和生命周期&#xff0c;决定了变量在何处能被调用、何处无效&#xff0c;Python共有四种作用域&#xff0c;遵循LEGB查找规则。本地作用域&#xff08;L&#xff09;是函数内部定义的变量&#xff0c;只在当前函数内有效&#xff0c;函数执行完…...

OpenClaw技能开发入门:为Qwen3-14B扩展Excel处理能力

OpenClaw技能开发入门&#xff1a;为Qwen3-14B扩展Excel处理能力 1. 为什么需要开发Excel处理技能 上个月我需要定期处理上百份市场调研数据&#xff0c;每天重复着打开Excel、筛选数据、生成统计图表的工作。当我第三次在凌晨两点对着满屏的数字犯困时&#xff0c;突然想到&…...

别再手动搬数据了!用n8n把ChatGPT和飞书打通,5分钟搞定日报自动汇总

告别低效日报&#xff1a;用n8nChatGPT打造飞书智能日报系统 每天早上9点&#xff0c;市场部的张经理都要花半小时手动整理团队成员的日报——复制粘贴飞书文档、调整格式、汇总关键数据&#xff0c;最后发到管理层群。这种重复劳动不仅消耗精力&#xff0c;还容易遗漏重要信息…...

Ollama上的轻量神器:Granite-4.0-H-350M快速部署与效果评测

Ollama上的轻量神器&#xff1a;Granite-4.0-H-350M快速部署与效果评测 1. 模型概述&#xff1a;轻量级多语言指令模型 Granite-4.0-H-350M是IBM推出的轻量级指令模型&#xff0c;专为边缘计算和本地部署场景优化。该模型基于Granite-4.0-H-350M-Base版本&#xff0c;通过有监…...