php调用stable diffusion api的前提是后端已部署并启用api的webui服务,php仅能通过http客户端(如curl)请求/sdapi/v1/txt2img等接口,不可直接运行模型或导入python库。

PHP 调用 Stable Diffusion API 的前提不是「直接调用」
PHP 本身不能直接运行 Stable Diffusion 模型,它只能作为 HTTP 客户端去请求已部署好的 WebUI 或 API 服务(比如 Automatic1111 的 /sdapi/v1/txt2img 接口)。你必须先确保后端有一个正在运行的 Stable Diffusion WebUI 实例,且启用了 API(启动时加 --api 参数)。
常见错误是试图在 PHP 中加载 PyTorch 或直接 import diffusers —— 这完全不可行。PHP 和 Python 运行环境隔离,跨语言调用需走进程或网络。
- 检查 WebUI 是否启动成功:访问
http://127.0.0.1:7860能打开界面,且http://127.0.0.1:7860/sdapi/v1/sd-models返回 JSON 列表 - 确认配置中未禁用 API:
webui-user.bat或启动脚本里包含--api,没有--no-api - 如果部署在远程服务器,注意防火墙是否放行端口(默认 7860),并确认 CORS 或反向代理是否拦截了 POST 请求
用 cURL 发送 txt2img 请求的关键参数和结构
Stable Diffusion WebUI 的 /sdapi/v1/txt2img 接口要求 POST JSON,PHP 最稳妥的方式是用 curl_init() + json_encode() 构造请求体。别用 file_get_contents() 直接 POST 数组——它不自动序列化,会 400 错误。
最小可用示例:
$url = 'http://127.0.0.1:7860/sdapi/v1/txt2img';
$data = [
'prompt' => 'a cat wearing sunglasses, studio lighting, sharp focus',
'negative_prompt' => 'blurry, deformed, text',
'steps' => 20,
'width' => 512,
'height' => 512,
'cfg_scale' => 7,
'sampler_name' => 'Euler a',
'seed' => -1 // -1 表示随机
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (isset($result['images'][0])) {
file_put_contents('output.png', base64_decode($result['images'][0]));
}
-
prompt必须是字符串,不要传数组;多关键词用英文逗号分隔,权重用(word:1.3)语法(WebUI 支持) -
seed设为-1才真正随机;固定值可用于复现结果 - 返回的
images是 base64 字符串数组,file_put_contents()前必须base64_decode() - 若返回空或报错
503 Service Unavailable,大概率是 WebUI 正在忙或显存不足,需加重试逻辑
批量生成 Prompt 的策略:别硬拼字符串,用模板 + 变量注入
手写几百个 prompt 效率低且难维护。推荐用 PHP 数组定义变量池,再用简单模板拼接。避免用 eval() 或复杂 DSL——稳定性和可读性优先。
例如:
$subjects = ['cyberpunk city', 'ancient library', 'neon forest'];
$styles = ['by artgerm', 'in the style of loish', 'vaporwave aesthetic'];
$qualities = ['8k uhd', 'cinematic lighting', 'intricate details'];
foreach ($subjects as $s) {
foreach ($styles as $t) {
foreach ($qualities as $q) {
$prompt = "$s, $q, $t";
// → "cyberpunk city, 8k uhd, by artgerm"
// 然后塞进上面的 cURL 请求
}
}
}
- 模板中慎用用户输入内容(如表单提交的关键词),务必
strip_tags()+htmlspecialchars()过滤,防止 prompt 注入攻击(虽然危害小,但可能污染输出) - 大量请求容易触发 WebUI 队列阻塞,建议每请求后
sleep(1),或用 WebUI 的/queue/status接口轮询队列长度 - 如果要保存 prompt 记录,别只存最终字符串——把原始变量组合(如
['subject'=>'cyberpunk city','style'=>'artgerm'])也写入日志,方便后续分析效果
图像保存与错误处理最容易被跳过的三件事
很多人测试成功一次就以为通了,实际批量跑时失败率很高。以下三点不加检查,脚本大概率静默崩溃或生成一堆空白图。
- 检查
curl_exec()返回值是否为false,而不是只看 HTTP 状态码;超时、DNS 失败时curl_error()才有内容 - 解析
$result前先确认json_last_error() === JSON_ERROR_NONE,WebUI 报错时可能返回 HTML(比如 500 页面),json_decode()会返回null - base64 解码前验证格式:
if (preg_match('/^data:image\/\w+;base64,/', $imageStr)) { $imageStr = substr($imageStr, strpos($imageStr, ',') + 1); },否则base64_decode()可能返回空字符串
Stable Diffusion 的响应不稳定是常态,PHP 脚本里没有健壮的错误分支,就等于没写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











