【问题标题】:Guzzle(cURL?) behaves differently on server and localGuzzle(cURL?) 在服务器和本地的行为不同
【发布时间】: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 更新了我的问题

标签: php docker curl guzzle


【解决方案1】:

这是一个非常愚蠢的错误。在我的实际应用中,我有这样的东西:

   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

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2012-01-24
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多