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

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

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

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

Q&A

解決済

3回答

5423閲覧

CSV出力における同時リクエストに耐えられるコードとしたいです

K_9301

総合スコア69

PHP

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

0グッド

1クリップ

投稿2016/09/23 00:35

いつもお世話になってます。

簡易なCSV出力コードを作ったのですが、
同時に100件くらい更新される可能性があるのですが、
<要件1>同時リクエストに耐えられるようなコードにするにはどのようにするべきでしょうか。
(FLOCK等の指定?)
<要件2>また、ファイル出力先を指定するにはどうしたらよいでしょうか?

上記についてご教示いただけないでしょうか。

$datas = array($MMDDSS, $IDa, $IDb, $C); //各変数は別ファイルで定義済み $comma_datas = implode(',' , $datas); //累積CSV $fp = fopen('output.csv', 'a'); fwrite($fp, $comma_datas . "\n"); fclose($fp); //日別 CSV $csvFileName = date("md") . '.csv'; $fp = fopen($csvFileName, 'a'); fwrite($fp, $comma_datas . "\n"); fclose($fp); コード

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

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

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

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

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

coco_bauer

2016/09/23 00:59

「同時リクエストに耐える」というのは、どんなリクエストに対して、どんな事ができれば良いのでしょうか? 
K_9301

2016/09/23 01:27

コメント有り難うございます。分かりづらくすみません。 複数ユーザーによる同時アクセス時でも、ユーザー情報を問題なくCSVに記録でいていけばよいです。同時アクセスされた際に一部の情報をが欠落したり、CSVファイルが壊れるということがなければよいと考えてます。
guest

回答3

0

ベストアンサー

ロックは同時アクセスに耐えるものではなく、データの整合性を保つ為に存在するものです。
出力先を指定するには、$csvFileNameに出力先のディレクトリを含め、フルパスとしましょう。

同時更新があった際は先勝ちですか?後勝ちですか?
先勝の場合は、更新前のデータとの整合性を比較し一致する場合に更新します。
後勝の場合は、更新前のデータとの整合性に関わらず、更新します。
これらは決めの問題ですので、これがベストの方法というわけではありません。

追記

排他制御をしない場合は、ファイルが壊れます。

こちら参考になるかと思います。

ファイルをロックする【PHP】

ロック専用ファイルを用意すると良いかと思います。

以下、実装例です。

$fp_lock = fopen('lockfile.txt', 'rb+'); if (flock($fp_lock, LOCK_EX)) { //ここで累積と日別の処理 } else { //ロックできなかった場合 } fclose($fp_lock);

投稿2016/09/23 00:45

編集2016/09/23 01:39
moonphase

総合スコア6621

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

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

K_9301

2016/09/23 01:22

コメント有り難うございます。 ご質問の件については、後勝ちです。 各変数は必ずユニークなものとなるのですが、 複数ユーザーによる同時にCSV書き込みが発生した際に、CSVファイルが壊れるなんてことはあるのでしょうか。そのような記事を見たもので。。
K_9301

2016/09/27 00:30

御返信おそくなり申し訳御座いません。コメント有り難うございます。 早々かつコードのご提示有り難うございます、ベストアンサーにさせていただきます。 問題なく利用できました!!
guest

0

更新及び参照が頻繁で、相当な同時アクセスが見込まれるのであれば
RDBを導入するのが賢明ですね

投稿2016/09/23 02:24

yambejp

総合スコア114572

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

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

K_9301

2016/09/27 00:29

御返信おそくなり申し訳御座いません。コメント有り難うございます。 アクセスはそこまでかなと思いますので、今回は簡易に済ませようと思います。
guest

0

flockを使ってみました

php

1$datas = array($MMDDSS, $IDa, $IDb, $C); //各変数は別ファイルで定義済み 2$comma_datas = implode(',' , $datas); 3$dir = '/tmp/'; 4 5//累積CSV 6$fp = fopen($dir . 'output.csv', 'a'); 7if(!flock($fp, LOCK_EX)){ 8 die('File locked error'); 9} 10fwrite($fp, $comma_datas . "\n"); 11 12//日別 CSV 13$csvFileName = $dir . date("md") . '.csv'; 14$fp2 = fopen($csvFileName, 'a'); 15fwrite($fp2, $comma_datas . "\n"); 16fclose($fp2); 17 18flock($fp, LOCK_UN); 19fclose($fp);

投稿2016/09/23 01:43

編集2016/09/23 01:56
A.Ichi

総合スコア4070

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

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

K_9301

2016/09/27 00:30

有り難うございます!利用させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問