Я использовал веб-библиотеку для отправки 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: синтаксическая ошибка, непредвиденная '?', ожидая переменную (T_VARIABLE) в /PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php в строке 41, ссылка: http: // localhost / PWA / web-push-php -example / SRC /

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

17:22:36 [ошибка] 20232 # 20232: * 46 FastCGI отправлено в stderr: "PHP message: PHP Notice: Undefined index: endpoint in /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php в строке 69 Сообщение PHP: Неустранимая ошибка PHP: Uncaught TypeError: Аргумент 1, переданный в Minishlink \ WebPush \ Subscription :: __ construct (), должен иметь строка типа, заданная null, вызываемая в /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", восходящий поток: "fastcgi: // unix: /run/php/php7.2-fpm.sock:", хост: "localhost", реферер: "https: // localhost / PWA / web-push-php-example / 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:me@website.com', // 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
Harish Karthick 21 Сен 2018 в 13:28

2 ответа

Лучший ответ

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

__construct () должен иметь тип string, заданный null, вызываемый в /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php

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

Переменная, которую вы передаете в уведомлении как конечная точка , но в библиотеке она назначена как конечная точка .

1
Santhosh 21 Сен 2018 в 12:25

Вы абсолютно уверены, что действительно используете 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
delboy1978uk 21 Сен 2018 в 11:13