华为云modelarts无官方php sdk,必须通过rest api调用;需先用iam获取token鉴权,再以x-auth-token调用在线服务,注意region、project id、service_name严格匹配,输入输出格式须与customize_service.py契约一致。

ModelArts SDK for PHP 不可用,必须走 REST API
华为云官方未提供 PHP 官方 SDK,modelarts-sdk-php 不存在,所有调用都得直连 ModelArts 的 REST 接口。别浪费时间搜 SDK,直接准备 cURL 或 Guzzle 就行。
关键点:接口鉴权用 Token(非 AK/SK 直签),需先调 /v1/{project_id}/auth/token 换取短期 token;后续所有推理请求 Header 必须带 X-Auth-Token: {token}。
- Token 有效期默认 24 小时,但生产环境建议每次请求前检查过期时间,或封装自动刷新逻辑
- Project ID 从华为云控制台「总览」页右上角获取,不是 IAM 中的项目 ID,注意区分
- Region 必须与部署模型的区域严格一致,比如模型在
cn-north-4,API 地址就得用https://modelarts.cn-north-4.myhuaweicloud.com
如何调用已部署的在线服务(Real-time Service)
假设你已在 ModelArts 上完成模型训练、创建并启动了在线服务,服务 ID 是 svc-abc123xyz,那么调用路径是:/v1/{project_id}/services/{service_name}/invocations —— 注意这里不是 service_id,而是你在创建服务时填的 service_name(控制台可见,URL 友好名,非 UUID)。
示例请求(cURL):
curl -X POST 'https://modelarts.cn-north-4.myhuaweicloud.com/v1/your-project-id/services/my-cls-service/invocations' \
-H 'Content-Type: application/json' \
-H 'X-Auth-Token: your-token-here' \
-d '{"data": {"input": [[5.1,3.5,1.4,0.2]]}}'
- 请求 body 格式由你部署时指定的「输入协议」决定:常见为
{"data": {"input": ...}}或{"instances": [...]},具体看部署服务时填写的「推理代码」中model.predict()的输入结构 - 响应体里关键字段是
prediction或outputs,不是固定 key,得看你自己写的customize_service.py返回值 - HTTP 状态码
400多因 body 结构错或字段名不匹配;401是 token 过期;404常见于 service_name 拼错或区域不对
PHP 实现 token 获取 + 推理调用的最小可行代码
不要试图抽象成“通用 SDK”,先跑通再封装。以下代码省略异常捕获,但生产必须加:
$projectId = 'your-project-id';
$region = 'cn-north-4';
$serviceName = 'my-cls-service';
<p>// Step 1: 获取 token
$tokenUrl = "<a href="https://www.php.cn/link/e0e0efac42bf67642b4904c893b46725">https://www.php.cn/link/e0e0efac42bf67642b4904c893b46725</a>";
$tokenResp = json_decode(file_get_contents($tokenUrl, false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'content' => json_encode([
'auth' => [
'identity' => [
'methods' => ['password'],
'password' => [
'user' => [
'name' => 'your-username',
'password' => 'your-password',
'domain' => ['name' => 'your-domain-name']
]
]
],
'scope' => ['project' => ['name' => $region]]
]
])
]
])), true);
$token = $tokenResp['token']['id'] ?? null;</p><p>// Step 2: 调用服务
$invocationUrl = "<a href="https://www.php.cn/link/9e4bbab2f64d76c5ec1acefe6d433b66">https://www.php.cn/link/9e4bbab2f64d76c5ec1acefe6d433b66</a>";
$result = json_decode(file_get_contents($invocationUrl, false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\nX-Auth-Token: {$token}\r\n",
'content' => json_encode(['data' => ['input' => [[5.1,3.5,1.4,0.2]]]])
]
])), true);</p>
- 别用
file_get_contents做生产调用,它不支持超时、重试、连接池;换成GuzzleHttp\Client并配置timeout=30和connect_timeout=10 - 用户名密码登录仅用于测试,生产必须用 IAM 角色委托或临时安全凭证(
assume-role),否则密钥硬编码风险极高 - ModelArts 在线服务冷启延迟明显,首次请求可能 >5s,需前端做好 loading 或后端加缓存兜底
自定义推理代码(customize_service.py)必须适配 PHP 请求格式
你写的 customize_service.py 决定了 PHP 怎么发数据、怎么解析结果。ModelArts 默认只认 data 字段,且要求返回 dict,不能 print 或 return list。
典型错误写法:
# ❌ 错误:没包在 data 里,或返回格式不符
def model_fn(model_dir):
return joblib.load(os.path.join(model_dir, "model.pkl"))
<p>def input_fn(request_body, request_content_type):
return json.loads(request_body)['input'] # 直接取 input,但 PHP 发的是 {"data":{"input":...}}</p><p>def predict_fn(input_object, model):
return model.predict(input_object).tolist() # 返回 list,但 ModelArts 要求 dict</p>
✅ 正确写法(适配上面 PHP 示例):
def input_fn(request_body, request_content_type):
data = json.loads(request_body)
return data.get('data', {}).get('input', []) # 兜底防 keyerror
<p>def predict_fn(input_object, model):
result = model.predict(input_object)
return {'prediction': result.tolist()} # 必须是 dict,key 自定义但要和 PHP 解析一致</p>
- ModelArts 会把
predict_fn返回值整个塞进 HTTP 响应 body,PHP 端需明确读$result['prediction'],不是$result['outputs'] - 如果用了 TensorFlow/PyTorch,
model_fn加载模型耗时长,务必加日志确认是否真被缓存 —— ModelArts 不保证单实例多请求共享 model 对象 - 本地调试时,用
curl -X POST http://localhost:8080/invocations模拟,别等部署完才测
ModelArts 的 PHP 集成难点不在语法,而在链路太长:IAM 认证 → Token 管理 → 区域/Project/ServiceName 三者对齐 → 自定义代码输入输出契约 → 网络超时策略。任何一个环节填错一个字母,就卡在 4xx 里查半天。最省事的方式,是先用 Postman 把四步全跑通,再移植到 PHP。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











