Ничего себе поговорим об умопомрачителе.Итак, всякий раз, когда я запускаю этот
<?php
require_once "../vendor/autoload.php";
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
$public_key = "PUBLIC_KEY_REDACTED";
$private_key = "PRIVATE_KEY_REDACTED";
$auth = array(
'VAPID' => array(
'subject' => 'https://github.com/Minishlink/web-push-php-example/',
'publicKey' => $public_key, // don't forget that your public key also lives in app.js
'privateKey' => $private_key, // in the real world, this would be in a secret file
)
);
$json = json_decode(file_get_contents("php://input"));
file_put_contents("notification_subscription_info.txt", file_get_contents("php://input"));
try {
$subscription = Subscription::create(json_decode(file_get_contents('php://input'), true));
$notification = [
'subscription' => Subscription::create([ // this is the structure for the working draft from october 2018 (https://www.w3.org/TR/2018/WD-push-api-20181026/)
"endpoint" => "{$json->endpoint}",
"keys" => [
'p256dh' => "{$json->keys->p256dh}",
'auth' => "{$json->keys->auth}"
],
]),
'payload' => 'Hello!',
];
$webPush = new Minishlink\WebPush\WebPush($auth);
$webPush->sendNotification(
$subscription,
$notification['payload'] // optional (defaults null)
);
//version 1 (outside the foreach)
$webPush->flush();
//version 2 (inside the foreach)
foreach($webPush->flush() as $report) { } //This can be empty
} catch (Exception $e) {
echo $e->getMessage();
}
, я получаю очень странное поведение в своем phpstorm отладчика.Если я запускаю его с версией 1, то я не получаю push-уведомления, и он вызывает метод __destruct.
Однако, если я запускаю версию 2, я получаю нормальное поведение, и push-уведомление отправляется успешно.Это выглядит так, как будто простое пребывание внутри foreach меняет поток программы.Я понятия не имею, почему это будет, и я остаюсь, почесывая голову.Кто-нибудь знает, что происходит?
Редактировать: я ошибся насчет метода __destruct.Это вызывается, потому что это конец функции.В отладчике он пропускает вызов flush (), как будто это буквальное значение.Поэтому, если я сделаю $report = $webPush->flush();
, он установит $ report, даже не вызывая функцию flush () (по крайней мере, так это выглядит).У меня даже есть точка останова в начале функции flush (), и она не срабатывает.