работник службы — библиотека Web Push php: выдает внутреннюю ошибку

Я использовал веб-библиотеку для отправки push-уведомлений.
https://github.com/web-push-libs/web-push-php

Я получил внутреннюю ошибку при попытке отправить push-уведомление

Я проверил в обеих версиях PHP: 7.1.22,7.2.9-1
Журнал ошибок Apache:

[: error] [client :: 1: 33302] PHP Parse error: синтаксическая ошибка, неожиданная
‘?’, ожидающая переменная (T_VARIABLE) в
/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
на линии 41 рефери: HTTP: // локальный / PWA / веб-нажимной PHP-пример / SRC /

И я также попробовал в Ngnix / журнал ошибок:

17:22:36 [ошибка] 20232 # 20232: * 46 FastCGI отправлено в stderr: «PHP
сообщение: PHP Примечание: неопределенный индекс: конечная точка в
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
on line 69 PHP сообщение: PHP Фатальная ошибка: Uncaught TypeError: Аргумент
1, переданный Minishlink \ WebPush \ Subscription :: __ construct (), должен иметь
строка типа с указанным нулевым значением, вызываемая в
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
по строке 72 и определяется в
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php:39
След стека: брошенный в
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
в строке 39 «при чтении заголовка ответа от вышестоящего клиента:
127.0.0.1, сервер: local.pwa.com, запрос: «POST /PWA/web-push-php-example/src/send_push_notification.php HTTP / 2.0»,
upstream: «fastcgi: // unix: /run/php/php7.2-fpm.sock:», хост:
«localhost», реферер:
«https: // локальный / PWA / веб-нажимной PHP-пример / SRC /«

Код PHP:

<?php
require __DIR__ . '/../vendor/autoload.php';
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

// here I'll get the subscription endpoint in the POST parameters
// but in reality, you'll get this information in your database
// because you already stored it (cf. push_subscription.php)
$sub =json_decode(file_get_contents('php://input'), true);
$sub_endpoint =$sub['endpoint'];
$sub_publicKey =$sub['publicKey'];
$sub_authToken =$sub['authToken'];
$sub_contentEncoding =$sub['contentEncoding'];
$notifications = [
[
'subscription' => Subscription::create([
'endPoint' => $sub_endpoint,
'publicKey' => $sub_publicKey,
'authToken' => $sub_authToken,
'contentEncoding' => $sub_contentEncoding, // one of PushManager.supportedContentEncodings
]),
'payload' => '{msg:"test"}',
],
];

$auth = array(
'VAPID' => array(
'subject' => 'mailto:[email protected]', // can be a mailto: or your website address
'publicKey' => 'BCmti7ScwxxVAlB7WAyxoOXtV7J8vVCXwEDIFXjKvD-ma-yJx_eHJLdADyyzzTKRGb395bSAtxlh4wuDycO3Ih4', // (recommended) uncompressed public key P-256 encoded in Base64-URL
'privateKey' => 'HJ*******************' // (recommended) in fact the secret multiplier of the private key encoded in Base64-URL
//'pemFile' => './keys/private_key.pem' // if you have a PEM file and can link to it on your filesystem
),
);
$defaultOptions = array(
'TTL' => 300, // defaults to 4 weeks
'urgency' => 'normal', // protocol defaults to "normal"'topic' => 'push', // not defined by default - collapse_key
);

$webPush = new WebPush($auth, $defaultOptions);

// send multiple notifications with payload

$webPush->flush();

// send one notification and flush directly
$webPush->sendNotification(
$notifications[0]['subscription'],
$notifications[0]['payload'], // optional (defaults null)
true // optional (defaults false)
);

3

Решение

@Хариш, конструктор? должен работать с PHP версии 7.1. Я считаю, что в ваших значениях параметров есть ошибка.

__construct () должен иметь строку типа с указанным нулевым значением, которая вызывается в /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php

Поскольку журнал ошибок указывает, что значение конечной точки передается как ноль, оно должно передаваться как строковое значение.

Переменная ваша передача в уведомлении как ENDPOINT но в lib это назначено как конечная точка.

1

Другие решения

Вы абсолютно уверены, что на самом деле используете PHP 7.21 или 7.2? Проблема в вопросительных знаках в конструкторе:

https://github.com/web-push-libs/web-push-php/blob/master/src/Subscription.php#L41-L43

Как вы можете видеть из этого кода 3v4l, он работает на всех версиях свыше 7.1:

<?php
class X
{
public function __construct(
string $endpoint,
?string $publicKey = null,
?string $authToken = null,
?string $contentEncoding = null
) {
$this->endpoint = $endpoint;

}
}

$x = new X('blah', 'blahblah');

https://3v4l.org/A1XeN

Все v5 итерации кода приводят к вашей ошибке:

Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE) in /in/A1XeN on line 6
1

По вопросам рекламы [email protected]