• ベストアンサー
  • すぐに回答を!

タイムアウト処理?となる

ローカルのシステムでデータベースからCSVファイルを作成して、公開用WEBサーバへFTPアップロード。その後CSVファイルをWEB用データベースに登録する処理を開発しているんのですが、開発用WEBサーバでは正常に完了するのですが、本番用WEBサーバで行うと最初の数万件は登録できているのですが、途中でエラーというか真っ白になって処理がSTOPしてしまいます。 開発、本番用共に同じPHPのファイルを使用しており、データベース構成も同じです。 【相違点】 開発(正常):PHP4.4.2(Apacheモジュールにて動作) 本番(異常):PHP4.4.1(CGI動作) エラーとなるのも、CSVのファイルの容量によって違います。 ちなみにFTPでのアップロードは開発・運用供正常にできています。 どなたかご教授お願いします。

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数705
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.4
  • galluda
  • ベストアンサー率35% (440/1242)

がるです。 んと…ちと長くなりますのでご覚悟を(笑 #2さんのおっしゃっている「メモリ」問題の可能性も考えてはいるのですが、今回の件はいわゆる「タイムアウト系かなぁ」お思ってますので、その観点から。 まず「htaccessでは」とのお話しですが…すみませんちょっとこのあたりは。 Timeoutディレクティブなのは把握しているのですが…元々、普段は .htaccess自体を、性能の観点からoffにしているので、あまり詳しくなくて。 もし設定される場合、例えば Timeout 7200 とかにしておくと、大分よいかと思います。数値の単位は秒です(通常、最近は300が多いのですが…レンタルサーバですと30とかで切ってるかもしれません)。 ただ、.htaccessでTimeoutディレクティブが有効になるかどうかはちとわからないです。 > 10000件ごとに取り込み状況を出力するように変更したのですが、的を外れていますか? 残念ながら。 ちと厳密に書くと。 Apacheのプロセスは、CGI(今回ですとPHPプログラム)を起動します。で、そのプログラムのstdout(標準出力)が完全にcloseし、プログラムが終了した時点で初めて出力を行うのが通常なので。 結局のところ、プログラムが動いている最中は、今まで試した限りでは、「別プロセスにforkした場合」を含め、すべてNGでした。 ですので、ある程度以上の作業であれば、どうしても「裏側で別途処理」という流れになることが多いです。 なので、cronで、という流れになるのですが。 あとは…行数制限をかけてしまうのが、恐らくは現実解なのではないか、と思います。 あまり役に立つ情報でなく大変に恐縮ですが。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

お礼が遅くなってしまい申し訳ありませんでした。 アドバイスありがとうございました。 Timeoutディレクティブは.htaccessでは無理でした。 結局、抽出する件数を指定してFTPアップロード→WEBサーバ側で取込後 また抽出といった処理に変更しました。 この方法だと、処理に時間がかかりますが正常に動作しました。 同時にWEBサーバの容量の問題も解決できました。

関連するQ&A

  • PHPの設定 エラー処理について

    当方PHPの初心者です。 現在HTML上でPHPの動作をさせているのですが 一部の処理で【Fatal error: Call to undefined function】というエラーがでて処理が途中で止まってしまいます。 エラー文自体は正しく、元々テスト環境でPHPを動作させているので、本番のDBや該当ファイルが無い為にエラーとなっています。 ただ、ステージングという扱いにしてソースをそのままでアップさせたいので、エラーが必ず出る箇所を無視して先に進めたいと考えています。 エラーが起こる部分をコメントアウトする事は二度手間になり、本番化の場合にヒューマンエラーが発生するのを防ぐ為です。 そこでご相談なのですが、PHP処理の時に該当ファイルが無い等のエラーを無視してそのまま続行する。 方法はありますでしょうか。 通常の処理は動作確認済みです。 <?php echo date('Y年m月d日'); ?>等 エラーが発生するのは下記のような場合です。 <?php e($this->renderElement("サーバーが違うので存在しない")); ?> 色々情報を探ったのですが中々解決策をつかめず・・ どなたかお力添えを頂ければありがたいです。

    • 締切済み
    • PHP
  • サーブレット処理のキャンセル

    はじめまして。 環境: apache2.052 + jk2(2.04) + tomcat5.028 質問: CSVファイルをアップロードして、DBに登録する業務があります。 CSVアップロード ↓ サーブレット:DB登録 ↓ 結果出力 DB登録の処理時間が20秒ほどかかるため、その間にブラウザを閉じたり、別のリンクをクリックされる場合があります(キャンセルの意を込めて?)。 そのような操作がされた場合、ユーザには登録の結果(エラーの有無等)を知る手段がないため、サーバ側のDB登録処理をキャンセル(ロールバック)させたいのですが、現状、ブラウザの状態にかかわらずDB登録処理は最後まで行われてしまいます。 なにかよい方法はございませんでしょうか。 また、一般的にはこのような処理は行わないものなのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • CSVファイルのアップロードとダウンロード処理

    いつも大変お世話になっております。 PHPとpostgreSQLを利用してテーブルのデータをCSV形式でダウンロードとアップロードしようと考えています。ダウンロードとアップロードの際に、エラー処理を行いたいのですが、どのように書けばいいのかわかりません。参考になるサイトがありましたら教えて頂けますでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP

その他の回答 (4)

  • 回答No.5

#2です。 error_logはapacheのerror_logではなくて、phpのerror_logの事だったのですが、設定されていないとの事なので情報は得られないとの事了解致しました。 #1氏がforkで駄目だった経験がお有りとの事で、これから私が説明する手法ーもforkの様なものなのでやはり駄目かもしれませんが一つ。 (尚、今思い付いたので検証はしておりません) CSVを読み込んでDBに保存するスクリプトを処理単位で3分割します。 a.ブラウザから処理開始のトリガーを引く為だけのスクリプト。 b.単純にCSVを読み込んでDBを更新するだけのスクリプト。 c.bの処理が終了しているかどうかを確認するだけのスクリプト。 まず、ブラウザからaが呼び出されたら、まずは処理開始のフラグを立てます。(ファイルでも良いし、DBに専用のテーブルを用意しても良い) 続けて system() を使ってbを呼び出しますが、その際のパラメータストリングの末尾に "&" を付けます。 具体的には system("/usr/bin/php -q bのスクリプトパス &"); とします。 これでbは常駐扱いとされて直ぐに処理が戻ってくる筈なので、取り合えずブラウザには「更新処理中です」等と出力して終了します。 bは処理が終わったらaが立てた処理中フラグを降ろします。 cは呼び出される都度にaが立てた処理中フラグを確認し、立っていれば「処理中です」と出力して終了。降りていれば「完了しました」を出力して終了します。 このcをaの処理が終わった時に出力されるHTMLのヘッダにmetaタグのrefresh定義を利用して10秒程度の間隔で何度も呼び出す様にします。 c自信も結果を出力する際に、まだフラグが立っていたら同じくmetaタグを仕込みます。(つまり自分を再度呼び出す様に仕掛けます) 頭の中ではイケそうな気もしますが、いかんせん検証していませんので駄目元という事で簡便してください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

アドバイスどうもありがとうございました。 結果的に無事動作するようになりました。 NINJA104さんの処理については今後の参考にさせていただきます。

  • 回答No.3
  • galluda
  • ベストアンサー率35% (440/1242)

がるです。 なるほど状況は概ね。 PHPでどれだけの設定をしようとも、最終的には「Apacheの設定次第で切られてしまう」というのが、この場合直接的な回答になろうかと思います。 もうちょっと詳細に書くと。 「CSVを処理している最中にApacheの設定している接続時間を超えた場合にその時点で"処理が片付かない"エラーでApache自身が異常終了として処理してしまう」ため。またファイルサイズによって違うのは「ファイルサイズによってCSV処理時間が異なるため」になります。 Apacheの、通常httpd.confと呼ばれる設定ファイルの中に、接続時間への設定などがあるので。 で、解決策ですが。 httpd.confの設定を長くするのが一つ。下策ですがとりあえず楽ですが、やはりどこかで同じ事象に悩まされます。 CSVファイルが「一定サイズ以上にならない」のであればある程度逃げれるのですが。 上策は「つくりを変える」事。具体的には ・CSVのupload ・CSVの処理 を別々に行います。CSVの処理は、cronあたりでバッチにするほうがよろしいかと。 この方法の場合、どんだけのファイルサイズがあろうとも、基本的には問題なく動きます。 ただ、画面遷移など色々変更がはいるでしょうから、多分大変です。 何かの参考にでもなれば幸いです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

がるさんアドバイスありがとうございます。 Apacheの設定ですが、htaccessではできない項目なんでしょうか? あと処理の流れはローカルのシステム内でCSV生成後FTPアップロード。 そのあとheader関数でWEBサーバ内のCSV取り込み処理のファイルへアクセス。 そのまま取り込みを行っています。 がるさんが言われている「つくりを変える」と言う内容はこういうことではダメということでしょうか? cronのバッチ処理は公開用のサーバが対応していません。 いろいろと調べまして、10000件ごとに取り込み状況を出力するように変更したのですが、的を外れていますか? 確かIEの接続時間の関係でこういう処理をすればタイムアウトにならないという情報が検索して見つかったので試してみました。 開発用では200万件のデータの取り込みは正常にできました。 ちなみに開発用のWEBサーバもレンタルサーバです。 もし、ご回答いただければ嬉しいです。

  • 回答No.2

error_logには何が出力されていますか? 私の経験ではメモリが足りなくなった場合に、ブラウザに同じ挙動(真っ白)が返った時がありました。 その場合、php.iniの利用するメモリ上限値設定を見直して余裕を持たせるか、またはメモリを無駄に消費しない様にコードを自力で最適化(必要ではなくなった変数をせっせとunset()する等)して対策を取るかのどちらかですね。

共感・感謝の気持ちを伝えよう!

質問者からの補足

apacheのerror_logには 「Premature end of script headers:ファイル名・・・」 とありました。 調べてみたのですが、どこかにエラーがありますとしかわかりませんでした。 ちなみに本番用はレンタルサーバになります。 memory_limitは本番、開発共に同じ値(項目なし)です。 CGI版とApacheモジュール版ってちがうのでしょうか?

  • 回答No.1
  • galluda
  • ベストアンサー率35% (440/1242)

がると申します。 拝見している限りですと「処理に時間が掛かっているから途中でタイムアウトしている」、ごく普通というか真っ当な挙動だと思うのですが。 ご質問は「タイムアウトしないためには」でよろしいでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

すいません。 説明不足でした。 set_time_limit(0);を指定しています。 にも関わらず本番環境及び開発環境(CGI動作)では 途中で止まってしまいます。

関連するQ&A

  • CSVファイルのデータが、データベース上で文字化け

    CSVファイルのデータが、データベース上で文字化けする現象を解決したい! CSVファイルは、任意の場所にFTPソフトを使用してアップロードし、プログラム上でCSVを読み込むという手順です。 ■開発関係情報 phpは使用しておらず開発はperlを使用 開発プログラムの文字コードはEUC-JPで、出力されるHTMLの文字コードはShift-JISです。 (1)hetemlに設置した場合は正常に動作しました。 予め作成されていたデータベースのエクスポートファイルをインポートしてテーブルを作成しましたがインポート時のファイルの文字セットは「utf8」で、コーディングへの変換は「non」で実行しています。 MySQLバージョン:5.0.82 MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 2.11.11.3 MySQL クライアントのバージョン: 4.0.25 (2)無料のレンタルサーバー(国外)に設置すると文字化けします。 (1)と同じ手順で行うと、データベース上でCSVデータの日本語が文字化けします。 MySQLバージョン:5.1.65-cll MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 3.4.11.1 MySQL クライアントのバージョン: 4.1.22 そこでCSVをFTPでアップせずデータベースでインポート(ファイルの文字セット:utf-8、エンコーディングの変換なし)しようとすると「CSV入力のカラム数が不正です」というエラーになります。 色々と調べていると、文字コードをすべてEUCに統一すると文字化け解決と書いてあったので、CSVファイル・MySQLの接続照合順序・インポートするときの文字セットなどの思い当るところ全てをEUCに指定して、エンコーディングへの変換を「EUC」に「全角カナへ変換する」にチェックを入れて実行してみても、やはり「CSV入力のカラム数が不正です」エラーになります。 この時、フォーマット項目で「LOAD DATA文を使用したCSVの読み込み」を選択し、特有のオプションで「カラムの終端記号」を「,」「カラム囲み記号」を「"」に設定して、CSVファイルでは区切りを「,」と「","」の2パターンで試しても同じエラーでした。 また、気になる点としては、MySQLの文字セットはUTF-8のままでどうやって変更するのかがわかりません。 開発にphpは使用していなくても、phpmyadminを使用しているということはphp.iniの設定が必要ですよね? php.iniの設定は、権限が与えられていなければサーバー側で設定を行ってもらう必要があるのでしょうか?(初歩的な事ですみません) 試行錯誤していますが、解決法が分からず困っています。 どなたかご教示いただけませんでしょうか。 何卒よろしくお願い致します。

  • ファイルが開けない問題について

    WEBサーバにPHPファイルをアップロードし、アクセスしたところ、初期画面は開けるのですが、そこかれ1つ下のディレクトリにあるファイルorder_num.phpなどが開けません。 以下のエラーがでます。 ./sample/order_num.php が開けません ローカルの開発環境ではおこりません。 権限の問題とかあるのでしょうか? FFFTPで属性チェックもしているのですが、開けるファイルと同じ属性でした。 どなたかアドバイスお願いします。

    • ベストアンサー
    • PHP
  • PHPのFTP関数ftp_fgetエラーに関する疑問

    こんにちは PHPでFTPサーバからファイルをダウンロードしようとしていますが、下記のエラーが来ました: PHP Warning: ftp_fget:あと4048バイト以上アップロードする必要があります。..... 同じftp_get関数もほぼ同じメッセージを出しています。 どうすればFTPのファイルをうまくダウンロードできますか? 環境:Apache 2.48 & PHP 5.1

    • 締切済み
    • PHP
  • さくらインターネットのFTP

    いつもお世話になってます。 私の知識不足のため、ご質問させていただきます。 さくらのレンタルサーバ・スタンダードのFTPについて質問があります。 契約後、FTPをすぐに使用可能になるかと思いますが、 Javaで通信確立からFTPへのファイルアップロード(Put)のプログラムを開発し、 クライアント側から起動しファイルアップロードすることは可能なのでしょうか。 使用目的がFTPのみで、本来のWEBサーバとしての使い方ではないので、 情報が少なく、可能であるのか不明な状況にあります。 ご存じの方がいらっしゃいましたら、ご教授ください。 宜しくお願い致します。 ※FTPは一般的なFTPで、SFTPやFTPSではありません。

    • ベストアンサー
    • Java
  • 同じ配列処理

    認証プログラムを作っています。 PHPファイル内にユーザー名、パスを定義してます。 $usersと同じ変数に入れ認証処理のプログラムは変えたくないのです。 CSVのカンマ区切りで外部ファイルとして、読み込み$usersと同じ扱いにしたい。 PHPファイル内(認証処理は問題なく動作) $users = array( "admin" => "pass", "guest" => "guest" ); 今後は下記のようにしたいです。 CSVのカンマ区切りで外部ファイル(log.dat) admin,pass guest,guest PHPの処理 $lines = @file($userfile); for($i=0; $i<count($lines); $i++){ list($id, $pass) = explode(",", trim($lines[$i])); $users[$i] = array($id, $pass); } うまくできません。

    • ベストアンサー
    • PHP
  • WindowsでPHPのアップロード系処理を扱うときのディレクトリパー

    WindowsでPHPのアップロード系処理を扱うときのディレクトリパーミッションについて。 Windows7+Apache2.2.x+PHP3.1でアップロード処理を行ったときに、php.ini内で設定されているアップロード一時ディレクトリからmove_uploaded_fileでファイルを移動させるときにうまくいきません。$_FILES変数から一時ディレクトリの値をとってくることすらできていないようです。サーバを起動しているマシン内から行うとできます。リモートからのときにできません。 で、探してみたらこの問題で引っかかっている人が結構いたようで、Webサーバのディレクトリと同じパーミッションを与えてやればいいというような記述があったので、アップロード用ディレクトリにApacheのルートディレクトリから属性を継承ささせ、「Everyone」ユーザにフルコントロールを与えてみたのですが改善しませんでした。具体的な手順をご存知の方がおられましたら教えていただけると幸いです。

  • ファイルサイズがpost_max_sizeを超える場合のエラー処理について

    PHPでアップロードファイルのサイズチェックに関する処理で困っています。 アップロードファイルのサイズチェックを行う場合はPHPスクリプト内でスーパーグローバール変数の$_FILES[フォーム名]['size']からサイズチェックを行うのが一般的であると考えています。 ところが、php.iniのパラメーターpost_max_sizeを超えるサイズのファイルをアップロードしようとするとファイルのアップロードが行われないため$_FILES[フォーム名]['size']でのチェックも行えずユーザーにファイルサイズに起因するエラーであることを通知することが出来ません。 そこで、お知恵をお借りしたいのはpost_max_sizeを超えるサイズのファイルをアップロードした際(またはしようとした際)に、ユーザーにファイルサイズに起因するエラーであることを知らせる方法はあるのでしょうか? 方法の例として以下の2つを見つけたのですが、いずれもユーザーに的確にエラーを返すことが出来ません。 1.HTMLのFORMタグ内にMAX_FILE_SIZEを指定する。  → 指定した値より大きなファイルをアップロードすると画面がリロードされたような動きとなりフォームがクリアされます。 PHPスクリプトに処理がわたらないようでユーザーにエラーを返せません。(IE8 / Apache2.2 + PHP5の場合) 2.ブラウザ側スクリプトでファイルサイズを取得する  → IE限定の方法しかないためIE以外でも可能な方法を期待しています。 なにか良い方法をご存知の方はお力を貸してください。

    • ベストアンサー
    • PHP
  • DBを実装したサイトの制作手順について

    ローカルでDB(MySQL)+ Apache + PHPで制作したサイトを実際のウェブサーバーで動作させる場合、 phpファイル、htmlファイル、画像ファイル等は、 FTPでファイルを送りますが、 データベースは、どうするのですか?

    • ベストアンサー
    • MySQL
  • データベースのタイミングについて

    PHPでとあるデータベースに接続したいのですが、 本番のサーバーのため、 処理を慎重に行いたいと思います。 データベースの処理の流れがよくわかっていないのですが、 処理としては データーベースを接続する Beginする テーブルを作成 大丈夫だったら  コミットする 大丈夫じゃなかったら  ロールバックする Endする データベースを切断する という処理でいいのでしょうか?? また、データベース上に同じテーブル名などがある場合は CREATを実行したときにエラーを返してくれるのでしょうか??

    • ベストアンサー
    • PHP
  • コマンドファイルからのFTP転送の実行について

    運用サーバからバックアップファイルを他のサーバに転送したく、 PHPからコマンドを実行する方法という下記のサイトを参考にPHPから実行 できないか模索しております。 http://piyopiyocs.blog115.fc2.com/blog-entry-760.html ftp.shで保存しておき、実行用のPHPに下記を記述し、 「<?php exec("/bin/sh ftp.sh"); ?>」 ftp.shと同じ階層にアップロードしてからphpファイルをブラウザから、 呼び出してみたものの、6GBあるはずのファイルが2GBほどしかアップロードされません。 ターミナルから、ftp.shを実行した場合は、 6GBでアップロードできております。 ●実行結果 ・PHP→ftp.sh:2GB(×) ・ターミナル→ftp.sh:6GB(○) ●PHP→ftp.shとターミナル→ftp.sh共に共通して、 ?Invalid commandという出力が行われます。 ?Invalid commandが出力されてはおりますが、 一応はファイルの転送が実行はされております。 PHPからの実行の場合は、PHPの容量制限かなにかが反映されてしまうのでしょうか。 PHPからの実行でアップロードファイルが途中で止まる現象を回避する方法は、ありますでしょうか。 ?Invalid commandというのは、正常に処理が行われている場合でも 出力されるのでしょうか。