webpushのLaravelを使用しないパターンを箇条書き、フロントエンド側は

2024.11.14

Logging

おはようございます.webpushのLaravelを使用しないパターンを箇条書き、フロントエンドは過去記事を参照ください.まずwebpushを使用するにはパブリックキーとシークレットキーが必要になります.下記のURLより発行してみてください.

https://web-push-codelab.glitch.me

フロントエンド側でサービスワーカーの登録された識別データをバックエンドに送信.

// db.php: データベース接続の設定
function getDbConnection() {
    $host = 'localhost';
    $dbname = 'your_database';
    $username = 'your_username';
    $password = 'your_password';

    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch (PDOException $e) {
        die("DB接続エラー: " . $e->getMessage());
    }
}

// endpoint_register.php: エンドポイントをデータベースに登録
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $endpoint = $_POST['endpoint'];
    $auth = $_POST['auth'];
    $p256dh = $_POST['p256dh'];

    if ($endpoint && $auth && $p256dh) {
        $pdo = getDbConnection();
        $stmt = $pdo->prepare("INSERT INTO push_subscriptions (endpoint, auth, p256dh) VALUES (?, ?, ?)");
        $stmt->execute([$endpoint, $auth, $p256dh]);
        echo "登録成功";
    } else {
        echo "エンドポイントデータが不完全です";
    }
}

バックエンド側で下記のようなコードでデータを保存します.

次にminishlink/web-pushというライブラリを使用し登録されたデータを元に送信処理を行います.

composer require minishlink/web-push
// message_send.php: データベースからエンドポイントを取得し、プッシュ通知を送信
require 'db.php';
require 'vendor/autoload.php';

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

// VAPIDキーの設定
$auth = [
    'VAPID' => [
        'subject' => 'https://example.com',
        'publicKey' => 'YOUR_PUBLIC_VAPID_KEY',
        'privateKey' => 'YOUR_PRIVATE_VAPID_KEY',
    ],
];

$webPush = new WebPush($auth);

// データベースからサブスクリプション情報を取得
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT endpoint, auth, p256dh FROM push_subscriptions");
$subscriptions = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($subscriptions as $sub) {
    $subscription = Subscription::create([
        'endpoint' => $sub['endpoint'],
        'publicKey' => $sub['p256dh'],
        'authToken' => $sub['auth'],
    ]);

    // 送信するメッセージ
    $message = json_encode(['title' => '通知タイトル', 'body' => 'メッセージ内容']);

    // プッシュ通知の送信
    $webPush->sendNotification($subscription, $message);
}

// 送信キューの実行
foreach ($webPush->flush() as $report) {
    $endpoint = $report->getRequest()->getUri()->__toString();

    if ($report->isSuccess()) {
        echo "成功: {$endpoint}\n";
    } else {
        echo "失敗: {$endpoint}: {$report->getReason()}\n";
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$stmt, catch, endpoint, FETCH_ASSOC, foreach, getDbConnection, getMessage, Laravel, minishlink, MYSQL, PDO, PDOException, prepare, query, setAttribute, subscription, VALUES, vendor, Webpush, シークレットキー,

laravelのスコープとリゾルブを知った日。 #phpcode

2023.03.21

Logging

おはようございます、Laravel技術を2つ手に入れました。有り難いことです😭。

他にもいろいろあるだろうけど、スコープとリザーブという技術を知りました。スコープも便利そうだ、リザーブも使い方が分かりましたのでchatGPTにサンプルコードを書いていただき解説もお願いしました。

class User extends Model
{
    public function scopePopular($query)
    {
        return $query->where('votes', '>', 100);
    }

    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

$users = User::popular()->active()->orderBy('created_at')->get();

Laravelのスコープとは、モデルクエリに対する再利用可能なクエリ制約のことです。スコープを定義することで、特定のクエリ制約を複数の場所で簡単に再利用することができます。

use App\Services\SomeService;

$someService = resolve(SomeService::class);

Laravelのresolveメソッドは、サービスコンテナからサービスを解決するために使用されます。サービスコンテナとは、依存性注入を実現するための強力なツールです。

依存性注入とは、クラスが他のクラスに依存している場合、その依存関係を外部から注入することです。これにより、クラス間の結合度が低くなり、テストや再利用が容易になります。

Laravelでは、サービスコンテナを使用して依存性注入を実現します。resolveメソッドは、サービスコンテナから特定のサービスを取得するために使用されます。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$query-&gt, ChatGPT, class, GET, gt, gt;active, Laravel, popular, query, resolve, resolveメソッド, return, SomeService, use AppServicesSomeService, user, where, クエリ制約, スコープ, リザーブ,

WEBスクレイピングで日経平均株価の値を取得するPHPプログラム

2021.05.26

Logging

WEBスクレイピング日経平均株価の値を取得するPHPプログラムです。下記のようなブログラムを応用してクラウドワークスなどの案件(データ取得の案件)を自分は請け負っています。現在のWEBスクレイピングの相場は1-5万円ぐらいです。PHP言語ではJSがOFFの状態をスクレイピングするのでJS(java script)が動作して表示されているものは取得できないのが難点です。そのような場合はPhantomJSを使用すると良いらしいですが、こちら開発が終了しているライブラリになります。

WEBスクレイピングで日経平均株価の値を取得するPHPプログラム

大手の企業はJSがOFFの状態でも表示できるように設計されている事が多いので大体のデータは取得可能です、例外として大手のショッピングサイト(ECサイト)では、JSをゴリゴリと使用している場合もあるのでスクレイピングする前にブラウザで見栄えの検証(java script OFFの状態)することをオススメします。

<?php
	//WEBスクレイピング
	$url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=998407.O";
	$html = file_get_contents($url);
	$dom = new DOMDocument();
	$html = mb_convert_encoding($html, "HTML-ENTITIES", 'UTF-8');
	@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
	$xpath = new DOMXPath($dom);
	print $xpath->query("//*[@id=\"root\"]/main/div/div/div[1]/div[2]/div[1]/div[2]/div[2]/p[2]/span")->item(0)->textContent;

追記:スクレイピング先のコードが変わればデータは取得出来なくなりますので、ソースコードの変更が必要です。

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$dom-&gt, div, dom, gt, gt;textContent, HTML-ENTITIES&quot, item, loadHTML, lt, mb_convert_encoding, NODEFDTD, NOIMPLIED, PhantomJS, php, print, query, quot, quot;root, XPath, プログラム,

使わないうちに書き方が変わっていましたMySQL。

2015.05.10

Logging


MySQLなんて全然、PHPで呼び出すコードをココ数年書かなくても何も困ること無く生きてきた自分です。その間にもPHPのバージョンが更新されていました。最近使わなかったMySQLでも触ってみようかなとググると目から鱗!!。いつの間にか書き方が微妙に変わってましてDBに接続したりクエリを呼び出したりするのが何だか前より楽になっているような気がします。前のことを殆ど忘れてしまったのでどうこう言えないのですが、何だかこの書き方は覚えやすいなと思います。ちなみに自分はいろいろと浅く広くいろいろな言語に手を出しているので・・・これと言って超強みはないのですが、DB周りは本当に触る機会がなくてあんまり無いですが、DBを使ったものをなにか作りたいなと思っています。
 

function selctsql(){
	$mysqli = new mysqli("host","user","pass","DBname");
	if ($mysqli->connect_error){
	  print("接続失敗:" . $mysqli->connect_error);
	  exit();
	}
	$result = $mysqli->query("SELECT * FROM test ORDER BY id DESC");
	if($result){
	  //1行ずつ取り出し
	  while($row = $result->fetch_object()){
		//エスケープして表示
		$hoge[0] = $row->qur1;
		$hoge[1] = $row->qur2;
	  }
	}
	return $hoge;
}

著者名  @taoka_toshiaki

※この記事は著者が30代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

AM, connect_error, dbname, exit, fetch_object, FROM test ORDER BY id DESC, function selctsql, hoge, mysqli, new mysqli, query, qur1, qur2, result, return, row, select, クエリ, バージョン, 接続失敗, 書き方,