PHP不存在Antigravity库,它源于对Python彩蛋模块的误解;实际CLI AI交互需用cURL调用OpenAI等API,注意流控制、错误处理与UTF-8编码。

PHP 没有官方或主流的 “Antigravity” 库,也不存在名为 Antigravity 的可集成命令行 AI 交互框架——这是个常见误解,通常源于对 Python 的 antigravity 模块(一个彩蛋模块,仅用于打开 xkcd 漫画)的误传或混淆。
为什么搜不到 antigravity 的 PHP 版本?
Python 的 antigravity 是标准库里的一个玩笑模块(import antigravity 会打开浏览器跳转到 xkcd #353),它不提供 AI、命令行交互或任何实用功能。PHP 社区从未实现、也无意实现同名模块。如果你在文档或教程里看到 “PHP + Antigravity AI”,基本是标题党、概念混淆,或把某私有/玩具项目强行套用这个名字。
- PHP 的命令行 AI 交互需依赖真实可用的后端服务(如 OpenAI API、Ollama、本地 Llama.cpp HTTP 接口)
- 所谓 “Antigravity” 如果指代某个具体 CLI 工具,大概率是拼写错误(比如想打
ag却误作antigravity),或混淆了gravity(如某些部署工具) - Composer 中搜索
antigravity无任何稳定、下载量可观的包
想用 PHP 做命令行 AI 交互?实际可行路径
绕过虚构名词,直接落地:PHP 通过 curl 或 file_get_contents 调用 AI API,配合 php://stdin 实现交互式 CLI。关键不是名字,而是通信协议和输入输出控制。
- 使用
stream_set_blocking(STDIN, true)确保逐行读取用户输入,避免阻塞或乱序 - 调用 OpenAI 时,
Content-Type必须设为application/json,且Authorization头格式为Bearer YOUR_API_KEY - 别用
shell_exec('curl ...')——难以调试、参数易被 shell 注入、JSON 引号逃逸麻烦;坚持用原生cURL扩展 - 响应体要
json_decode($response, true)后检查['error']键,OpenAI 错误不会返回 HTTP 4xx/5xx 状态码(默认是 200 + JSON error 字段)
$ch = curl_init('https://api.openai.com/v1/chat/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'model' => 'gpt-3.5-turbo',
'messages' => [['role' => 'user', 'content' => trim(fgets(STDIN))]]
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $_ENV['OPENAI_KEY']
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
echo $result['choices'][0]['message']['content'] ?? "No response";
容易被忽略的 CLI 细节
PHP CLI 模式下很多 Web 习惯不适用,尤其涉及流、编码、信号处理时。
立即学习“PHP免费学习笔记(深入)”;
-
fgets(STDIN)在 Windows 下可能读不到换行,建议用stream_get_line(STDIN, 1024, PHP_EOL)更可靠 - 输出中文必须确保终端支持 UTF-8,且 PHP 文件本身保存为 UTF-8 无 BOM;否则
echo出来是乱码 - Ctrl+C 默认会终止进程,如需优雅退出,注册
pcntl_signal(SIGINT, function() { exit("\nBye.\n"); });(仅限启用 pcntl 扩展的 CLI 环境) - 不要在循环中反复
curl_init()+curl_close();复用句柄并用curl_reset()清除旧选项更高效
真正卡住人的从来不是“用什么名字”,而是流控制是否健壮、API 错误是否被静默吞掉、终端编码是否一致——这些细节没处理好,换十个名字都跑不起来。



















