我正在使用Guzzle lib从PHP脚本向FCM(Firebase云消息传递)发送请求。在我的本地计算机上 - 一切正常,但在生产服务器上,我从FCM服务中收到错误:411 Content-Length required
。
我已经检查过PHP版本,Guzzle lib版本,cURL版本 - 它们在两台机器之间都是相同的。 我的项目使用docker运行,因此环境也相同。这里是代码我如何向FCM发送消息:
$handler = new CurlHandler();
$stack = HandlerStack::create($handler);
$config['handler'] = $stack;
$client = new Client($config);
try {
$client->post($this->apiUrl, [
RequestOptions::JSON => $data,
RequestOptions::HEADERS => [
'Authorization' => sprintf('key=%s', "key"),
]
]);
} catch (TransferException $e) {
throw new \RuntimeException($e->getMessage(), $e->getCode(), $e);
}
我知道没有足够的细节来解决这个问题,所以如果你需要,可以要求更多。也许,任何想法如何在我的本地机器上代表这个错误?
我已经尝试在我的请求中添加Content-Length
标题,但它没有帮助。
UPD
FROM php:7.1-fpm-alpine
RUN apk --update --no-cache add libmcrypt-dev libmcrypt curl-dev libcurl \
&& docker-php-source extract \
&& docker-php-source delete \
&& docker-php-ext-install mcrypt pdo_mysql mbstring curl
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version
RUN chmod +x /usr/local/bin/composer
WORKDIR /var/www/project
UPD2 :
我决定不用担心试试:
$curl = sprintf("curl -i -X POST https://fcm.googleapis.com/fcm/send -H 'Authorization: key=%s' -H 'Content-Type: application/json' -d '%s'", $message->getSender(), $data);
exec($curl, $output);
结果是一样的。当我在生产机器上以bash运行该脚本时 - 一切正常。但是当我从PHP运行它时 - 我得到相同的错误“411 Content-Length required”。
答案 0 :(得分:0)
这是一个非常愚蠢的错误。在我的实际应用程序中,我有类似的东西:
try {
$client->post($this->apiUrl, [
RequestOptions::JSON => $data,
RequestOptions::HEADERS => [
'Authorization' => sprintf('key=%s', $key->getKey()),
]
]);
} catch (TransferException $e) {
throw new \RuntimeException($e->getMessage(), $e->getCode(), $e);
}
所以问题在于这一行:$key->getKey()
。我将授权密钥存储在数据库中。在我的生产机器上,该密钥存储了一个额外的换行符号(“\ n”)。所以结果请求看起来像这样:
Authorization: my key
Content-Length: 241
我删除了额外的“\ n”后,一切正常:
Authorization: my key
Content-Length: 241