Guzzle (cURL?) Ведет себя по-разному на сервере и локально - PullRequest
0 голосов
/ 16 мая 2018

Я отправляю запрос в FCM (Firebase Cloud Messaging) из скрипта PHP с Guzzle lib. На моей локальной машине - все работает, но на рабочем сервере я получаю сообщение об ошибке от службы FCM: 411 Content-Length required.

Я проверил версию PHP, версию Guzzle lib, версию cURL - они все одинаковы для двух компьютеров. Мой проект запускается с помощью докера, поэтому среда тоже такая же. А вот код того, как я отправляю сообщение в 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 голосов
/ 17 мая 2018

Это была очень глупая ошибка.В моем реальном приложении у меня есть что-то вроде этого:

   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
...