我使用Web推送库发送推送通知https://github.com/web-push-libs/web-push-php
尝试发送推送通知时出现内部错误
我检查了两个PHP版本:7.1.22,7.2.9 -1
Apache错误日志抛出:
[:错误][客户端::1:33302] PHP解析错误:语法错误,意外的'?',在第41行的/PWA/web-push-php-example/供应商/minishlink/web-push/src/Subscription.php中需要变量(T_VARIABLE),引用者:http://localhost/PWA/web-push-php-example/src/
我也尝试在Ngnix /错误日志:
17时22分36秒[错误] 20232编号20232:*46 FastCGI在标准错误中发送:“PHP消息:PHP注意事项:未定义的索引:端点在/var/www. html/PWA/web-push-php-example/vendor/minishlink/web-push/src/subscription. php在第69行PHP消息:PHP致命错误:未捕获的类型错误:传递给Minishlink\WebPush\Subscription::__construct()的参数1必须是字符串类型,给定空值,在第72行的/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription. php中调用,并在/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php中定义:39堆栈跟踪:在第39行的/var/www/html/PWA/web-push-php-example/供应商/minishlink/web-push/src/订阅. php中抛出”,同时从上游阅读响应报头,客户端:127.0.0.1,服务器:local.pwa.com,请求:“POST/PWA/web-推送-php-示例/src/发送_推送_通知. php HTTP/2.0”,上游:“fastcgi://unix:/运行/php/php7.2-fpm.sock:“,主机:“本地主机”,引用地址:“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)
);
2条答案
按热度按时间fruv7luv1#
@Harish,构造函数“?”应该在PHP 7.1版本中工作。我发现您的参数值中有一个错误。
__construct()必须是字符串类型,给定空值,在/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php中调用
由于错误日志指示端点值作为空值传递,因此应将其作为字符串值传递。
您在通知中传递的变量为endPoint,但在lib中它被赋值为endpoint。
i7uaboj42#
你真的确定你运行的是PHP 7.21或7.2吗?问题是这里构造函数中的问号:
https://github.com/web-push-libs/web-push-php/blob/master/src/Subscription.php#L41-L43
从下面的3v4l代码中可以看到,它可以在7.1以上的所有版本上运行:
https://3v4l.org/A1XeN
代码的所有v5迭代都会产生您的错误: