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

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

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

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

Q&A

解決済

2回答

1625閲覧

$_FILEの情報を確認後、バックグラウンドでzip関数で保存せずファイルを読込みたい

double16k

総合スコア16

PHP

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

0グッド

0クリップ

投稿2017/08/04 01:26

編集2017/08/04 01:43

ファイルのアップロード(zipファイルの中にcsvファイルが入っています)で、$_FILEの情報(拡張子のエラーチェックなど)を行った後に
バックグラウンドでzip関数にてcsvファイルを読み込みたいと思っています。

zip関数を使ってファイルの読み込み自体は、以前こちらで教えていただきバックグラウンドで動かさなければ読み込めます。
今回csvのファイル数・ファイルの行が多すぎるためタイムアウトするので、バックグラウンドで動かしたいと思っています。

まず、$_FILE情報のチェックプログラムは以下のように書いています。(index.php)

if( isset($_POST["submit_file"]) ){ $filename = $_FILES['fileupload']['name']; $filesize = $_FILES['fileupload']['size']; $tmp_name = $_FILES['fileupload']['tmp_name']; $ext = substr($filename, strrpos($filename, '.') + 1); if( $filename=="" || $ext!="zip" ) $error[] = "zipファイルを選択して下さい。"; if( empty($error) ) exec("nohup php -c '' 'bg.php' '$filename' '$tmp_name' > /dev/null &"); }

execでbg.php(バックグラウンド)へ移動しzip関数でcsvファイルを読み込む処理を書いています。(bg.php)

//countでループして、100になったら「.」を表示するなどしています。 set_time_limit(0); ob_implicit_flush(); $filename = $argv[1]; $tmp_name = $argv[2]; //zipファイルをオープン $zip = zip_open($tmp_name); if( $zip ){ while( $entry = zip_read($zip) ) { $csv_file = basename(zip_entry_name($entry)); /*このwhileの中に入っていません。*/ } }

zip_readで読み込めておらず、whileの中の処理ができていない状況です。
logなどに書き込み、$argvの値は入っていることを確認しています。
bg.phpの中身をindex.phpに書き込めばもちろん動きます。

憶測ですが、index.phpで$tmp_nameで取得したパスがbg.phpでは違うため読み込めてないのか、と思います。

【質問】
zip関数でcsvファイルを保存せず読み込みではなく、index.phpでcsvファイルをどこかに保存し、bg.phpで保存したcsvファイルを読み込まないとだめでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

$_FILES['fileupload']['tmp_name']で示される場所にあるファイルは、index.phpの実行が終了した時点で消去されるので、bg.phpが処理しようとしたタイミングでは既に削除されているのではないでしょうか。
index.phpで$_FILES['fileupload']['tmp_name']のファイルをどこかに移動してから、そのファイル名をbg.phpに渡してあげればよいかと思います。

投稿2017/08/04 01:47

ttyp03

総合スコア16998

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

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

double16k

2017/08/04 02:27

ttyp03様 ご回答いただきありがとうございます。 やはり、move_uploaded_fileでどこかのディレクトリに保存してunlinkでファイルを削除するしかないのでしょうか。 ファイルを保存せず読み込もうと思いzip関数を使いました。
guest

0

自己解決

ファイルアップロードの際、ファイルのサイズや拡張子(zip)を確認した後
バックグラウンドでzip_entry_openを使いたかったのですが、難しいので
一度サーバーにファイルを展開した後、バックグラウンドでファイルを読み込み処理をするようにしました。
ttyp03 様の回答ありがとうございました。

投稿2017/08/07 11:19

編集2017/08/07 11:23
double16k

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問