Web Push php 库:抛出内部错误
Web Push php libriary : Throws internal error
我使用网络推送库发送推送通知
https://github.com/web-push-libs/web-push-php
我在尝试发送推送通知时遇到内部错误
我检查了两个 PHP version:7.1.22,7.2.9-1
Apache 错误日志抛出:
[:error][client ::1:33302] PHP Parse error: syntax error, unexpected
'?', expecting variable (T_VARIABLE) in
/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
on line 41, referer: http://localhost/PWA/web-push-php-example/src/
而且我也在 Ngnix / 错误日志中尝试过:
17:22:36 [error] 20232#20232: *46 FastCGI sent in stderr: "PHP
message: PHP Notice: Undefined index: endpoint in
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
on line 69 PHP message: PHP Fatal error: Uncaught TypeError: Argument
1 passed to Minishlink\WebPush\Subscription::__construct() must be of
the type string, null given, called in
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
on line 72 and defined in
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php:39
Stack trace: thrown in
/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
on line 39" while reading response header from upstream, client:
127.0.0.1, server: local.pwa.com, request: "POST /PWA/web-push-php-example/src/send_push_notification.php HTTP/2.0",
upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host:
"localhost", referrer:
"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)
);
您完全确定您实际上是 运行 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');
代码的所有 v5 迭代都会产生您的错误:
Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE) in /in/A1XeN on line 6
@Harish,构造函数'?'应该从 PHP 版本 7.1 开始工作。我发现您的参数值有误。
__construct() 必须是字符串类型,给定为空,在 /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
中调用
由于错误日志表明端点值作为空值传递,因此应作为字符串值传递。
您在通知中传递的变量为 endPoint 但在 lib 中它被分配为 endpoint.
我使用网络推送库发送推送通知 https://github.com/web-push-libs/web-push-php
我在尝试发送推送通知时遇到内部错误
我检查了两个 PHP version:7.1.22,7.2.9-1
Apache 错误日志抛出:
[:error][client ::1:33302] PHP Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE) in /PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php on line 41, referer: http://localhost/PWA/web-push-php-example/src/
而且我也在 Ngnix / 错误日志中尝试过:
17:22:36 [error] 20232#20232: *46 FastCGI sent in stderr: "PHP message: PHP Notice: Undefined index: endpoint in /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php on line 69 PHP message: PHP Fatal error: Uncaught TypeError: Argument 1 passed to Minishlink\WebPush\Subscription::__construct() must be of the type string, null given, called in /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php on line 72 and defined in /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php:39 Stack trace: thrown in /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php on line 39" while reading response header from upstream, client: 127.0.0.1, server: local.pwa.com, request: "POST /PWA/web-push-php-example/src/send_push_notification.php HTTP/2.0", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "localhost", referrer: "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)
);
您完全确定您实际上是 运行 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');
代码的所有 v5 迭代都会产生您的错误:
Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE) in /in/A1XeN on line 6
@Harish,构造函数'?'应该从 PHP 版本 7.1 开始工作。我发现您的参数值有误。
__construct() 必须是字符串类型,给定为空,在 /var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php
中调用由于错误日志表明端点值作为空值传递,因此应作为字符串值传递。
您在通知中传递的变量为 endPoint 但在 lib 中它被分配为 endpoint.