Guzzle(cURL?)在服务器和本地

时间:2018-05-16 08:58:04

标签: php docker curl guzzle

我正在使用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”。

1 个答案:

答案 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