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

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

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

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

Q&A

解決済

4回答

957閲覧

複数実行されても処理は1つだけに制限する方法

msx2

総合スコア174

PHP

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

0グッド

1クリップ

投稿2017/08/01 03:59

編集2017/08/01 08:13

FTPサーバーにファイルを送信する処理の実装で悩んでいます。
PHPを使って処理しています。

やりたいことは画面からのリクエストでデータベースを更新するcsvファイルを作成し、FTPサーバーにアップロードするだけですが以下の制約があります。

・アップロードするファイル名は固定(main.csvとoption.csvの2種類)
・ファイルは1つずつ送信する必要がある
・1つのファイルが処理されるのに1分~10分程度かかる場合がある(サーバーの状態による)

複数のリクエストが同時に発生することがありますが、この制約により順番に1件ずつ処理しないといけません。

処理のイメージとしては画面からのリクエストで処理をデータベースに登録して、別にアップロードを行う処理をcronで定期的に起動し、順番に実行していくのかと思います。

ただしアップロード処理に時間がかかる場合があるため前の処理が実行中に次の定期実行が行われてしまうことが考えられます。
アップロードを行う処理は1つだけしか実行して欲しくないのをどうやって実現すればいいか悩んでいます。

実行前にデータベースに処理中フラグを立て、処理が終了したらフラグを消す方法しか思いつかないのですが、他にいい方法はないでしょうか?

PHPで特定の処理が実行中かどうかを知る方法というのはあるでしょうか?

よろしくお願い致します。

追記

二重起動対応にご回答いただいたpsコマンドやロックファイルが使われるみたいですね。

こちらのQiita記事にもまとめてありました。
http://qiita.com/n0bisuke/items/ad7c37d68ff0d5b87742

言葉を知らないとこういう記事を見つけられないので本当に助かります。。

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

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

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

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

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

guest

回答4

0

常に待ち行列があるレベルじゃなくて、「たまに重なるかも」というレベルであれば、DBに書くとかじゃなくて、排他制御をして時間待ちをしながら送ればいいと思います。

投稿2017/08/01 04:28

otn

総合スコア84499

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

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

msx2

2017/08/01 05:13

確かに難しく考えすぎだったかも知れませんね アップロードを行う処理を落ちないように丁寧に作れば大丈夫そうでした。 ありがとうございます。
otn

2017/08/01 08:25 編集

すいません。この回答、別の質問への回答だったのですが、何故か間違えて投稿してしまいました。 本来するつもりだった回答は、下記です。 待ち行列が途切れないようなケースではなく、たまに実行が重なるかも、という程度であるなら、排他制御をして、ロックが取れるまで時間待ちをすればいいと思います。
msx2

2017/08/01 08:24

大丈夫ですw またよろしくお願いします。
guest

0

処理開始時に処理中を示すファイル(固定ファイル名)を生成して、
処理終了時に削除する、のはいかがでしょうか。

一度に複数のアクセスが有るな話ではなさそうだし、
完全に自分の管理下で行う処理のようなので、
そんなので十分かと思いました。

固定ファイル名に、
例えば処理開始日時をファイルに出力しておくと、
そのファイルを参照するphp処理で
経過時間もわかるわけです。

投稿2017/08/01 04:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

msx2

2017/08/01 04:15

なるほど!アイデア的にはデータベースに状態を持たせるのと似ていますがファイルを使う方が安全ですね。 あまりに時間が経過し過ぎていたら破棄することもできますし。 いつもありがとうございます。
guest

0

phpでftpのアップロードをやる意味があるのでしょうか?
とくに10分も待たされる可能性があるならタイムアウトしそうですし
向いているとは思いません。
なんらかのコマンドライン系のftpクライアントで処理するのが
賢明だとおもいます。

ファイルは1つずつ送信する必要がある

の仕様についてはFTPの仕組み上あまり意味がないと思いますが
コマンドライン系の処理なら順番にputを指定してやれば
並行処理にはならないと思います

投稿2017/08/01 04:06

yambejp

総合スコア114769

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

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

msx2

2017/08/01 04:12

送信するファイル名が固定されているので複数送信するとcsvファイルが上書きされてしまうのです。 csvファイルでしか連携できない謎のシステムで送信先の仕様なので従うしかない状況なんです。。 ちなみに送信したcsvファイルは相手のサーバー上で処理されると自動的に削除されるので、ファイルが消えるのを待って次のファイルを送ります。
guest

0

ベストアンサー

仕様に不明な点もありますが、勝手な考えで書いてみます。

前提
・画面からのリクエストデータにデータベースを更新する「何か」が入っている。

●画面からのリクエスト処理
1.リクエストがあったら、リクエストの中の「何か」をファイルに書き出す。
ファイル名は一意にするために、例えば「yyyymmddHHMMSS_[セッションID].txt」にする
※リクエストがあるたびにファイルは増えていきます。

●FTP処理
cronにより定期的に実行される
1.起動時にpsコマンドで自分(自分と同じ名前の処理がいるか)を確認する。
※cronから起動するプログラム名がftp.shであればpsコマンドでftp.shが存在することを確認する。
いれば、処理中と解釈し処理は終了する。
いない場合は、処理を継続する(2へ)
2.相手サーバ上にmain.csv,option.csvが存在しないことを確認
存在する場合は終了
存在しない場合は処理を継続する(3へ)
3.リクエストがあった際に作成された複数のファイルを古い順に読み込み、
「何か」をmain.csvやoption.csvに書き出す。
4.ftpでmain.csvとoption.csvを送信
5.ftp送信に成功したらリクエストファイルを削除する。
※3で読み込んだファイルのみが対象
6.終了

投稿2017/08/01 07:10

hige0119

総合スコア37

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

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

msx2

2017/08/01 08:08

psコマンド!!こんなコマンドがあったんですね。 まさにやりたい内容です! 全てのファイルを送信してしまいたいので ・2番のサーバー上にファイルが存在する場合は終了せずに再確認を繰り返して3に進む ・5番が完了したら2番に戻る(送信対象がなくなるまで) これで何とか問題を解決できると思います。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問