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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

2787閲覧

サーバーで直列処理を書きたい

seri

総合スコア422

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/05/15 04:52

複数のユーザがいるとして
各ユーザーには0~10のidを付けたいとします

そこでサーバーでは接続してきたユーザに現在のid番号を与え、与え終わったらidをインクリメントをします

var tmpid; function request(){ echo tmpid; tmpid++; if(tmpid==11)tmpid=0; }

この時、同時にリクエストが有っては0~10のid番号が全体を通してみた場合、数にばらつきが出てしまいます

そこで上のコードでのfunction requestを実行できるクライアントは一人とし、接続が同時に会った場合は1人を待機状態とさせるような処理を書きたいと思っています。

PHPで実装したいのですが、なかなか資料が見つかりません。お力を貸してください。
(JavaScriptのNode.jsでもいいのです)

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

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

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

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

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

guest

回答4

0

前提条件として確認しておきたいのですが、そもそもユーザーは11人以下しかいない、という前提なのでしょうか。

12人以上に発行するのであれば、どうせ番号は重複しますので、均等に11区分したければ乱数か何かで振るのが手っ取り早いです。


(コメントを踏まえて)
そもそもPHPは、リクエストごとに別個に処理されるものですので、変数すらリクエストごとにばらばらになります。

ということで、ロックをかけるにはデータベースやRedis、ファイルなど、PHP外のリソースを使うしかありません。

Redisを使ったロックの例

投稿2017/05/15 05:01

編集2017/05/15 05:08
maisumakun

総合スコア145183

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

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

seri

2017/05/15 05:04

これはあくまでも例えでして、実装内容はあまり関係ありません、単純に変数をインクリメントしたほうが解りやすかったかもしれないですね。。申し訳ありませんが、この実装でお願いします 。
seri

2017/05/15 05:14

データベースを使った場合、クライアント側で同じタイミングでリクエストが来た場合はどうすればいいのでしょうか?
maisumakun

2017/05/15 05:15

トランザクションをかければ、同時にアクセスできるのは1ユーザーだけとなって、残りは終了まで待機させることができます。
seri

2017/05/15 07:30

調べてみます!ありがとうございます!!
guest

0

サーバー側にファイルI/Oできるんでしょうか?
クライアント=サーバー間の通信の中でインクリメントしても
他のクライアントにはつたわりませんよね
アクセスカウンタのようにサーバー側が現在値をファイルやRDBなどで
保持する必要あります。

なお一度アクセスしたユーザーかどうかはセッションで調整することは可能だと思います

投稿2017/05/15 05:10

yambejp

総合スコア114829

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

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

0

がると申します。
幾つか回答が出ているようなので、参考程度に別解を。

共有サーバだと使えないところが多い(かつ、自前にしても、コンパイラオプションが必要)ですが。
上述の条件が満たせるようであれば、「1サーバ内での直列の処理」ですと、古典的には「セマフォロック」という手法が、一応存在しています。

興味があられそうでしたら少し詳しく説明をいたしますので、お声掛けいただければ、と思います。

投稿2017/05/15 14:11

gallu

総合スコア506

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

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

0

ベストアンサー

nodejsであればサーバー側の処理はシングルスレッドですので、同時にいくつリクエストが到着しようと、サーバー側のあらゆる関数はひと時に一つしか動きません。よって特に何もしなくても確実に個別のidが割り振られます。

普通のマルチスレッドのアプリケーションサーバーと異なりそこがnodejsの特徴だと思います。(ただしクラスタリングしない前提が必要だと思います)

投稿2017/05/15 05:22

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問