We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 6158
    • 224 Posts
    こんにちは。


    xrea という特定のサーバーを対象にして申し訳ないのですが、ファイルのアッ
    プロードに関して頭を悩ませています。

    snippet "FileUpload 1.0" および下記マニュアル中のサンプルスクリプト「例
    38-2」を使って xrea に 30mb 以上のファイルを送ろうとテストしています。

    - MODx Content Management System | FileUpload | 1.0
    - PHP: ファイルアップロードの処理 - Manual / 例 38-2. ファイルのアップロードを検証する


    1mb 弱の小さなファイルならば、アップロードが終了して、メッセージが表示
    されます。

    一方、30mb 程度のファイルを送ろうとすると、アップロードが終了するよりも
    早く処理が中断されたり、アップロードが終了しているにもかかわらず終了の
    メッセージが表示されず、単に「サーバーが見つかりません」と表示されるだ
    け、と言う状態が続いています。

    xrea 側のサーバーの設定は、

    [table]
    [tr][td][/td][td]Local Value[/td][td]Master Value[/td][/tr]
    [tr][td]file_uploads[/td][td]On[/td][td]On[/td][/tr]
    [tr][td]upload_max_filesize[/td][td]50M[/td][td]32M[/td][/tr]
    [tr][td]post_max_size[/td][td]50M[/td][td]32M[/td][/tr]
    [tr][td]max_input_time[/td][td]600[/td][td]180[/td][/tr]
    [/table]

    となっているので、"max_input_time" 時間内であれば 50mb でも大丈夫だろう
    と試したのですが、時間内に終わってそうなのにメッセージを返してこない、
    と言う結果になっています。


    ファイルのアップロードに成功されている方がいらっしゃったら、お気付きの
    点や、アップロード設定のコツなどをお教え願えませんか。
      • 27690
      • 98 Posts
      こんにちは、smallworldと申します。

      Quote from: custar at Sep 20, 2006, 12:18 AM

      1mb 弱の小さなファイルならば、アップロードが終了して、メッセージが表示
      されます。

      一方、30mb 程度のファイルを送ろうとすると、アップロードが終了するよりも
      早く処理が中断されたり、アップロードが終了しているにもかかわらず終了の
      メッセージが表示されず、単に「サーバーが見つかりません」と表示されるだ
      け、と言う状態が続いています。

      xrea 側のサーバーの設定は、

      [table]
      [tr][td][/td][td]Local Value[/td][td]Master Value[/td][/tr]
      [tr][td]file_uploads[/td][td]On[/td][td]On[/td][/tr]
      [tr][td]upload_max_filesize[/td][td]50M[/td][td]32M[/td][/tr]
      [tr][td]post_max_size[/td][td]50M[/td][td]32M[/td][/tr]
      [tr][td]max_input_time[/td][td]600[/td][td]180[/td][/tr]
      [/table]

      となっているので、"max_input_time" 時間内であれば 50mb でも大丈夫だろう
      と試したのですが、時間内に終わってそうなのにメッセージを返してこない、
      と言う結果になっています。

      Xreaはよく知らないので、限定的な示唆になってしますのですが。

      受け側サーバの設定に問題がないとすれば、MODxのファイルのマックスサイズ制限にひっかかっているのではないでしょうか?

      マネージャーにログイン後
      管理→MODx設定→その他の設定

      に遷移すると、上から4番目ぐらいに「アップロードサイズの制限」という設定項目があります。
      ここで引っかかっている可能性もあるかなー、と思いました。
      デフォルトは1MB程度のはずです。

        • 6158
        • 224 Posts
        smallworld さん、お返事ありがとうございます。


        Administration > System configuration > Miscellaneous settings
        Maximum upload size:
        50000000 (bytes)

        のことですね。書き漏らしていましたが、上記の通り約 50mb に設定していま
        す 。また、snippet "FileUpload" を使う際は、


        $maxsize = `50000000`

        も付けています。


        大容量ファイルのアップロードのようにスクリプトの実行時間が長い場合、
        "max_input_time" に引っ掛かると思いますが、中断されるまでにそんなに長い
        時間は掛かっていません。

        たかが 30mb 程度のアップロードで悲鳴をあげるような回線ではないと思うの
        ですが。
          • 27690
          • 98 Posts
          custarさん、こんにちは、smallworldです。

          MODxと離れるかもしれませんが、思いつく限りで羅列します。

          ・MySQLのファイルサイズ制限

          ご利用のスニペット(ファイルアップローダ)についてはまだ詳しく調べていませんが、MySQLの1ファイルあたりの登録制限値は確か16MBだったような気がします。(Ver.4.~)
          ファイルサイズをMODx的に、MySQL内部で管理しようとしている場合、この制限値にひっかかっているのでは?

          ・Apacheの設定による制限

          確か、Apacheにも、使用メモリ容量についての制限設定があったような・・・
          (今ぐぐったら「RLimitMEM」という単語が出てきましたが、これのことかな?)
          Apacheによるプロセスへのメモリ制限がある可能性は?

          ・php.iniのMemory_limit

          確か、php.iniの設定に、upload_max_filesizeやpost_max_sizeのほかに、memory_limitとかいう設定値があったはず。この辺が怪しい?

          またまた中途半端な示唆ですみません。
            • 6158
            • 224 Posts
            smallworld さん、またまたお返事いただきましてありがとうございます。

            Quote from: smallworld at Sep 20, 2006, 04:14 AM

            ・MySQLのファイルサイズ制限

            ご利用のスニペット(ファイルアップローダ)についてはまだ詳しく調べていませんが、MySQLの1ファイルあたりの登録制限値は確か16MBだったような気がします。(Ver.4.~)
            ファイルサイズをMODx的に、MySQL内部で管理しようとしている場合、この制限値にひっかかっているのでは?

            んんん、これは考えにくいと思っています。FileUpload という snippet のソー
            スを見る限り、単純に php の一機能を使っているだけです。

            私の知らない modx の仕組みがあったら別ですが。

            もう一つのサンプルスクリプト「例 38-2」は modx さらには mysql と一切関
            係ありません。


            Quote from: smallworld at Sep 20, 2006, 04:14 AM

            ・Apacheの設定による制限

            確か、Apacheにも、使用メモリ容量についての制限設定があったような・・・
            (今ぐぐったら「RLimitMEM」という単語が出てきましたが、これのことかな?)
            Apacheによるプロセスへのメモリ制限がある可能性は?

            RLimitMEM ディレクティブ のことですね。

            共用サーバーであるため、果たして apache のリソースまで書き換えさせても
            らえるかどうか、管理者に聞かないと分からないですね。


            Quote from: smallworld at Sep 20, 2006, 04:14 AM

            ・php.iniのMemory_limit

            確か、php.iniの設定に、upload_max_filesizeやpost_max_sizeのほかに、memory_limitとかいう設定値があったはず。この辺が怪しい?

            local でもテストしていますが、memory_limit = 16M でもすんなりと 30mb を
            アップロードできました。その時引っ掛かっていたのは upload_max_fileze,
            post_max_size です。これらが小さいと、サイズの大きいファイルはキャンセ
            ルされました。


            処理をぼんやり眺めていると、サーバー側で「そんなにたくさんのファイルを
            一気に送らないでくれよ」と言っているような気がします....
            # パソコンと会話ができる訳ではないですよ、私
              • 33488
              • 429 Posts
              XREA使ってますが・・・30Mも送ったことはないのでなんともいえませんが。
              もしかして、 upload_tmp_dirを変えてみたらいけたり・・とか・・

              あてにならないですが・・・・。

                • 6158
                • 224 Posts
                ZeRo さん、お返事ありがとうございます。

                Quote from: ZeRo at Sep 20, 2006, 05:31 AM

                もしかして、 upload_tmp_dirを変えてみたらいけたり・・とか・・

                "upload_tmp_dir" って「PHP_INI_SYSTEM」扱いなので変更できないのではない
                ですか?

                - PHP: コア php.ini ディレクティブに関する説明 - Manual


                参考までに、以下にサンプルスクリプト index.php を示します。

                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
                 <head>
                   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                   <title></title>
                 </head>
                 <body>
                   <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
                   <input type="hidden" name="MAX_FILE_SIZE" value="50000000" />
                     Send this file <input name="userfile" type="file" />
                     <input type="submit" value="Send file" />
                   </form>
                   <?php
                     if ($_FILES["userfile"]["tmp_name"]) {
                       if (move_uploaded_file ($_FILES["userfile"]["tmp_name"], "/virtual/xxx/public_html/uploads/".$_FILES["userfile"]["name"])) {
                         echo "File is valid, and was successfully uploaded.\n";
                       } else {
                         echo "Possible file upload attack!\n";
                       }
                     } else {
                       echo "Possible file upload attack: ";
                       echo "filename '". $_FILES['userfile']['tmp_name'] . "'.";
                     }
                   ?>
                 </body>
                </html>
                


                ディレクトリ uploads のパーミッションは 0777 にしてあります。

                気になるのは、xrea のサーバー環境を phpinfo() で見ると、

                [table]
                [tr][td][/td][td]Local Value[/td][td]Master Value[/td][/tr]
                [tr][td]upload_tmp_dir[/td][td]no value[/td][td]no value[/td][/tr]
                [/table]

                となっているのです。"no value" って未設定ってこと? もしそうなら何処に
                一時ファイルはダウンロードされるんだろう?
                  • 33488
                  • 429 Posts
                  確かにプログラムからは書き換えられませんでしたね。
                  うちのs141も同じ設定みたいですね
                  XREAのフォーラムには、/tmp とか書いてありましたが・・・。
                  どちらにしろ、格納場所に纏わる問題なような気がしますねぇ
                    • 6158
                    • 224 Posts
                    xrea からの返事で、

                    (1) CGI 版で max_input_time を変更する、
                    (2) ob_flush(); flush() を使う、

                    という案が出されました。明日試してみます。

                    ね、眠い....
                      • 6158
                      • 224 Posts
                      Quote from: custar at Sep 20, 2006, 11:03 AM

                      (1) CGI 版で max_input_time を変更する、

                      もう cgi の方法なんて忘れてしまいました。誰か教えてください。うっすらし
                      た記憶では、

                      1. ファイルの先頭に「#!/usr/local/bin/php」を付ける、
                      2. html の部分をヒアドキュメントとする (ここが正しいかどうか不明!)、
                      3. xrea では拡張子を cgi にする(?)、

                      でいいような気もするですが、何か間違ってますかね?

                      但し、httpd.conf の変更も必要となるので、面倒で仕方ありません。今時
                      cgi なんて使わないから忘れてしまいました。


                      Quote from: custar at Sep 20, 2006, 11:03 AM

                      (2) ob_flush(); flush() を使う、

                      スクリプトの先頭に ob_start()、終端に ob_flush();flush() を挿入してみま
                      したが、何ら変化はありませんでした。


                      何故レスポンスが返ってこないのか、そこが疑問です。