代码之家  ›  专栏  ›  技术社区  ›  Harish Karthick

Web Push php库:引发内部错误

  •  3
  • Harish Karthick  · 技术社区  · 6 年前

    我使用web推送库发送推送通知 https://github.com/web-push-libs/web-push-php

    我在尝试发送推送通知时遇到内部错误


    Apache错误日志抛出:

    第41行,参考: http://localhost/PWA/web-push-php-example/src/

    17:22:36[错误]20232#20232:*46 FastCGI在stderr中发送:“PHP /var/www/html/PWA/web push php示例/vendor/minishlink/web push/src/Subscription.php 第69行PHP消息:PHP致命错误:未捕获类型错误:参数 在中调用的类型字符串为null /var/www/html/PWA/web push php示例/vendor/minishlink/web push/src/Subscription.php 第72行,定义见 /var/www/html/PWA/web push php示例/vendor/minishlink/web push/src/Subscription。php:39 堆栈跟踪:抛出 上游:“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)
    );
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Santhosh    6 年前

    @Harish,构造函数“?”应该可以在PHP 7.1版中使用。我发现你的参数值有错误。

    __construct()必须是/var/www/html/PWA/web-push-php-example/vendor/minishlink/web-push/src/Subscription.php中调用的字符串类型,为null

    由于错误日志指示端点值作为null传递,因此应该将其作为字符串值传递。

    在通知中传递的变量 终结点 .

        2
  •  1
  •   delboy1978uk    6 年前

    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