Azure Functions 官方不支持 PHP,因其缺乏符合 worker 协议的长期运行进程实现,无认证的 azure-functions-php-worker;可行方案是用 Node.js/Python 函数代理调用 PHP CLI,或改用 Azure Container Apps 原生托管 PHP。

PHP 本身不被 Azure Functions 原生支持——官方运行时列表里没有 PHP,func init 也选不到 PHP 运行时。你不能像写 Node.js 或 C# 那样直接部署 index.php 到 Azure Functions 并让它自动触发执行。
为什么 Azure Functions 官方不支持 PHP?
Azure Functions 的核心是基于宿主进程(host process)模型,每个函数运行在由语言特定 worker(如 dotnet-worker、nodejs-worker)管理的沙箱中。PHP 没有官方维护的、符合 Azure Functions worker 协议的长期运行进程实现,也没有 azure-functions-php-worker 被纳入微软认证运行时。
这意味着:
- 你无法使用
func new --language php创建项目 -
func start本地调试时不会识别HttpTrigger+index.php - Portal 中新建函数时,“PHP” 不在语言下拉菜单中
可行方案:用 HTTP 触发器代理 PHP 脚本(推荐)
最稳定、生产可用的方式是把 Azure Functions 当作轻量级反向代理或胶水层,用支持的语言(如 Node.js 或 Python)调用外部 PHP 进程(通过 child_process.exec 或 subprocess.run),再把输出转为 HTTP 响应。适用于已有 PHP 逻辑、不想重写、且对冷启动延迟不敏感的场景。
立即学习“PHP免费学习笔记(深入)”;
以 Node.js 函数为例:
const { app } = require('@azure/functions');
const { exec } = require('child_process');
<p>app.http('phpProxy', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
const body = await request.text();
return new Promise((resolve) => {
exec(<code>php /home/site/wwwroot/php/handler.php</code>, {
timeout: 30000,
env: { ...process.env, REQUEST_BODY: body }
}, (error, stdout, stderr) => {
if (error) {
resolve({ status: 500, body: <code>PHP error: ${stderr}</code> });
} else {
resolve({ status: 200, body: stdout });
}
});
});
}
});注意要点:
-
handler.php必须放在部署包的固定路径(如php/handler.php),且函数 App 需启用WEBSITES_ENABLE_APP_SERVICE_STORAGE才能持久化读取 - PHP CLI 必须已安装——Azure Functions Linux 消费计划默认不含 PHP;需改用 Linux Premium 或 App Service Plan,并自定义 Docker 镜像或启用扩展(如通过
apt-get install php-cli在启动脚本中安装) - 不能依赖
$_GET/$_POST,要用环境变量或 stdin 传参(如上例用REQUEST_BODY) - 超时设置必须小于函数最大执行时限(消费计划默认 10 分钟,但建议设为 25–30 秒防卡死)
替代路径:用 Azure Container Apps 运行 PHP 应用
如果你真正需要的是“在 Azure 上托管无服务器风格的 PHP HTTP 服务”,Azure Container Apps 比硬套 Functions 更合适。它原生支持任意容器,可轻松部署标准 PHP-FPM + Nginx 镜像,并自动扩缩、绑定自定义域名、集成 Dapr。
最小可行镜像示例(Dockerfile):
<pre class="brush:php;toolbar:false;">FROM php:8.2-apache COPY index.php /var/www/html/ EXPOSE 80
然后通过 az containerapp create 部署,配合 Ingress 启用 HTTPS 和路由规则。相比 Functions 代理方案,它更符合 PHP 的运行习惯,调试方便,日志直出,且无进程 spawn 开销。
真正卡住人的不是“怎么让 PHP 跑起来”,而是忽略 Azure Functions 的进程模型边界——它不是通用 Web 容器,而是一个事件驱动的 worker 协议宿主。强行塞 PHP 进去,等于绕过设计约束去修水管,不如换根管子。



















