【发布时间】:2018-05-16 08:58:03
【问题描述】:
我正在使用 Guzzle 库从 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”。
【问题讨论】:
-
我很困惑。如果您使用的是 docker,为什么要检查“两台机器”上的软件版本是否相同?你有没有在docker中安装这些东西?我们可以看看你的 dockerfile 吗?
-
@EngineerDollery 我的意思是我检查了 docker 容器内的软件版本。我刚刚用 Dockerfile 更新了我的问题