質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1837閲覧

PHPで他のユーザーが特定のページを編集していたり、閉じていることをサーバーの送信する方法

pegy

総合スコア245

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2021/09/05 11:06

現在検討している内容

php:7.3.8
MYSQL:5.7.26
Wwb Server:Apache

現在、試作で同じ記事(input type="POST"を含むページ)を複数人のユーザーが編集できる様にするサービスを検討しております。イメージとしてはwikipediaに近いのですが、編集や更新ができる人はもう少しcloseされた(例えば10人くらい)ものを想定がコンテンツをinput type="post"を通じて更新していき
0. 複数人ユーザーがMYSQLにINSERT INTO されて蓄積していく最新のものはstatusカラムに1フラグが立ち、それ以外のものは0フラグが立つ

  1. 同ページではstatusフラグが1のものが最新のものといて表示され、そこからまたユーザーがさらに更新をかけていき繰り返される
  2. チャットサービスを構築するときにリアルタイム共同編集の様な 使用やAPIは想定しておりません。

さて、ここで一つ迷っていることがあるのですが、複数ユーザー同士の更新内容のコンフリクトです。
基本的には、誰かが更新している(ページを開いている)ときにはINSERT INTOを2番手以降の人は実行させない等は現実的ではないので、
誰かが更新しているとき(誰かが自分より先にそのページを開いている)に2番目以降に開いているひとに通知をする方式を取ることを要件として想定しております。

まだ、PHPで誰かが開いたときにmysqlでcurrentTimeStamp等で開いた時間を記録して、更新してinput type="post"を送信したときに同じ様にcurrentTimeStamp等で閉じた時間を記録すれば、その間に誰かが同じページを開いたユーザーには誰かが編集しているかもしれないということを通知はできると思いました。
ただ、問題は急にブラウザを閉じたりパソコンの電源を落とされたりしたらどうやって閉じる時間をサーバーに送信するのかが「php ブラウザ 閉じる 識別」などで検索しても見つけることができませんでした。

ご質問

  1. php等サーバーサイドで誰かがページを開いていることや(ブラウザを)閉じたことを識別することは可能なのでしょうか?
  2. 上記#1の可否にかかわらず、他のユーザーが今作業していることを一般的に他のユーザーが同じページを開いたときにコンフリクトを回避する様な一般的なアイデア等はあるものなのでしょうか?(今回はコンフリクトを受け入れて、最後に送信を押した内容を最新のコンテンツとして取り扱おうとは考えているのですが)

まだ、初心者で拙い表現で申し訳ないのですが、お知恵をお借りできればとても嬉しいです。
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/09/05 11:11

> チャットサービスを構築するときにリアルタイム共同編集の様な 使用やAPIは想定しておりません。 それは具体的にどういう機能を指してますか?
SugiuraY

2021/09/05 11:29 編集

削除しました。
takasima20

2021/09/05 12:02

webシステムは基本ステートレスなんでご要望の件は厳しいかも。 どうしてもってんならソースが公開されている wiki 的なやつを見てみるのかなあ。
pegy

2021/09/05 12:31

ありがとうございます。なるほど、承知をいたしました。 "ソースが公開されている wiki 的なやつ"という点がピント来なくて申し訳ないのですが、どの様にアプローチしたら良いかご教示いただけますでしょうか?「wiki 共同編集 公開」なんて形で検索をしてみたのですが、的外れであれば申し訳ございません・・・・
hentaiman

2021/09/05 13:03

無視か まあそこまで方法を知りたい訳ではないって事ですかね
pegy

2021/09/05 13:48

hentaiman様 大変失礼しました、websocket等のapiでリアルタイム共同編集機能を指しておりました。 的外れの場合、申し訳ございません。
hentaiman

2021/09/06 00:17

回答でのやりとり見てると質問に対する直接的な回答よりも利用者が納得出来そうな範囲で良い方法ないか教えて?って感じですかね 「他者が編集中」みたいな表示されたところで何にも嬉しくないですしね
pegy

2021/09/11 17:02

そうですね、コミニケーションをしているうちに、他者が編集中という通知だけは中途半端であまり実効性がないかなということに気がつかされました。現状は時間制限を決めて越えるまではロックされる(他の人は編集不可)とすることが落ち着きどころかと想定しています。
guest

回答1

0

ベストアンサー

ソースコードはこの辺を見ればどうでしょう

参考)
https://github.com/wikimedia/mediawiki

個人的には

1.は可能といえば可能だろうが、それを使ってもおそらくコンフリクトは全然防げない

2.の案としては、誰かが編集しようとしたら編集ロックをかける→他の人はロックをかけている人とロックをかけた時間がわかるが編集は一切できない→ある程度時間が経ったら他の人でもロックを解除できるようにする(同時に解除した人が人がロックをかける)→編集終了でロック解除

みたいな「ざっくりとしたロジック」で実装するのが現実的じゃないかな?とは思います。同時に編集させようとすると多分かなり大がかりな実装が必要になり、個人的には現実的じゃない気もします。mediawikiレベルでの大がかりな実装を検討しているなら別ですが。

投稿2021/09/05 13:44

AbeTakashi

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2021/09/05 14:37

AbeTakashi様 ありがとうございます。まず、mediawikiをざざっとREADME.mdとリンク先を見たのですが、、、(英語自体は苦手ではないのですが。)確かにすぐに手に追えそうなレベルではなかったです。。。 仰っていただいたロジックについては、イメージは湧きました。編集中のユーザーにも制限時間を表示して、経過するとロックが解除されることや、改めて入り直さなくてはいけないなど「一定の時間を設ける」というのはなるほど、と思いました。ありがとうございます。
AbeTakashi

2021/09/05 14:46

おそらくですが、同時に編集できるようにするともうどうやってもコンフリクトは防げなくて、そうなるとマージシステムが別途必要になります。なので、考え方としては「コンフリクトを確実に防いでシンプルな実装」「同時編集を可能にするが、その代わりマージシステムも合わせて実装」の2択になるんじゃないかな?と思います。 「コンフリクトを受け入れて、最後に送信を押した内容を最新のコンテンツとして取り扱おう」という案は、システムの要件や規模感にもよりますが、個人的には中途半端じゃないかな?という気はします。
pegy

2021/09/05 15:04

なるほど、ご意見ありがとうございます。 マージシステムまで実装しようとするとかなり大掛かりな感覚を持っています。これも要件次第なのかもしれませんが、いろいろなケースを想定しなくてはいけないため「コンフリクトを確実に防いでシンプルな実装」を目指していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問