8

問題

約 8MB 以上のファイルをアップロードすると、500 Internal Server Error が表示されます。

  1. のすべての PHP 設定php.iniが正しい
  2. maxAllowedContentLengthweb.configで設定されています

サーバー情報

おそらく からわかるようにmaxAllowedContentLength、私はIIS 7.5を FastCGI と PHP 5.3.17 で実行しています。

追加情報

これを機能させるためにさまざまなことを試しましたが、単に問題を見つけることができません。

ただし、この問題の原因を突き止めるのに役立つ可能性のある次の情報を見つけました。

  1. サーバー上にある Media Wiki を使用してファイル (より大きなファイル) をアップロードすると、同じエラーが表示されます。これは、コードのエラーではないことを示しています。
  2. 最も重要なことは、Plesk File Manager で 18MB のファイルをアップロードできたことです。これは明らかに、Plesk がこの設定の問題を回避できたことを意味します。Plesk コントロール パネルのすべての設定を IIS のこのドメインにコピーしようとしましたが、うまくいかないようです。
  3. スクリプトを実行する前にエラーが返ってきてexit;、一番上に空白の画面を取得しようと書いてみましたが、これは無視されて 500 エラーが返されます。

configure commandファイルのハンドラー マッピングを通常のものではなく.phpPlesk を使用するように変更すると、500 内部エラーが発生しないため、問題はPHP 構成の一部にあると思います。そうは言っても、これは Plesk 独自のものであり、他の構成の問題があるphp-cgi.exeため、この PHP バージョンに残すことはできません。exe

configureコマンドに関係しているのではないかと思う理由は、単純に、これが1つ1つ大きく異なるからphpinfo()です。

アイデアや提案があれば、投稿してください。私は自分の知る限りすべてを試しましたが、これを修正できないようです。Linuxだったら…

前もって感謝します

更新 1

追加するのを忘れていましたが、PHP エラー ログに返されるエラーはありません。IIS エラーについては、どこを見ればよいかわかりません

更新 2

これは私が私のweb.configファイルに入れたものです:

<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" /> 
    </requestFiltering>
</security>

更新 3

皆様のご協力により、IIS によって表示されるエラーを取得することができました。これは私が受け取っているものです:

PHP 警告: 12221448 バイトの POST コンテンツ長が行 0 の不明で 8388608 バイトの制限を超えています

それはと関係がありpost_max_sizeますか?

更新 4

次のような PHP 設定 (からphpinfo()):

post_max_size = 64M
memory_limit = 128M
max_file_uploads = 20
max_execution_time = 6000
upload_max_filesize = 64M

更新 5

最後に、潜在的な問題を誰かが発見できる場合に備えて、Plesk は大きなファイルを問題なくアップロードできるため、php-cgi.exe のコンパイル方法が異なっていると想定しました。それらの構成の phpinfo() を読んだとき、configure command情報は非常に異なっていました:

私の構成:

cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" "-- without-pi3web" "--with-pdo-oci=C:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=C:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=C:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=共有" "--with-mcrypt=static" "--disable-static-analyze"

Plesk の構成:

cscript /nologo configure.js "--enable-debug-pack" "--enable-cli" "--enable-cgi" "--enable-isapi" "--enable-one-shot" "--enable- pdo" "--enable-intl" "--with-openssl=shared" "--with-pdo-odbc" "--with-iconv" "--with-xml" "--with-xsl" "- -with-mysql" "--with-mysqlnd" "--with-mysqli" "--with-pdo-sqlite" "--with-pdo-mysql" "--with-curl=shared" "--enable -mbstring" "--enable-mbregex" "--with-imap=shared" "--enable-sockets" "--enable-shmop" "--enable-soap"

更新(回答)情報が1つのことを言っ ているので、これは非常に奇妙phpinfo()ですが、明らかに無視されています。理由はわかりません。

post_max_sizeその特定のドメイン/サブドメインについて Plesk でを変更しても、何も変更されません ( では変更されているように見えますがphpinfo())。ただし、実際にpost_max_valuephp.ini を変更すると、問題が修正されます。

これがこれを修正する良い方法ではない理由は、単に、Plesk が更新されると、PHP が更新されると php.ini が上書きされ、結果として php.ini に加えられた変更が失われるためです。つまり、Plesk が更新されるたびに、php.ini を変更する必要があります。これが、Plesk が php.ini を変更せずに PHP 設定を変更する機能を提供する理由です。

ローカル値が異なるとphp.iniが述べているにもかかわらず、PHPがローカル値を無視してphp.iniの値に戻す理由を誰でも思いつくことができますか?

4

4 に答える 4

3

PHPのソース コードを見ると、ファイルのphp-5.4.8-src\main\rfc1867.c行 706-709に次のように表示されます。

if (SG(post_max_size) > 0 && SG(request_info).content_length > SG(post_max_size)) {
    sapi_module.sapi_error(E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size));
    return;
}

file にも同じものがありますphp-5.4.8-src\main\SAPI.c。したがって、メッセージPHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes in Unknown on line 0は post_max_size 設定に関するものです。phpinfo() を使用して、この設定が正しく構成されていることを確認しましたが、とにかくデフォルト値の 8M を使用しているようです。

理由については、このスレッドを参照してください。

PHP_INI_USER結局のところ、Windows では、ディレクトリごとにマークされた ini ディレクティブのみを設定できます。残念ながら、 upload_max_filesizepost_max_sizeは両方ともPHP_INI_PERDIR. http://php.net/manual/en/configuration.changes.phpの PHP ドキュメントから

ディレクトリの設定は、このディレクトリまたはそのサブディレクトリから実行されるスクリプトに対してアクティブになります。キーの下の値には、PHP 構成ディレクティブの名前と文字列値が含まれている必要があります。値内の PHP 定数は解析されません。 ただし、この方法で設定できるのは PHP_INI_USER で変更可能な構成値のみで、PHP_INI_PERDIR 値は設定できません。

そのため、Plesk にはこれらのディレクティブを変更するためのインターフェースがあり、それらphpinfo()を取得しても、実際の最大アップロード サイズを変更することはありません。Plesk は、Windows でそれらを変更することを許可してはphpinfo()ならず、変更を報告するべきではありませんが、何ができるでしょうか。

これは post_max_size であり、php.ini で設定する必要があります。Plesk の設定は、phpinfo がそうでないと言っているにもかかわらず、単純に機能しません。また、エントリがないように思われたため、phpinfo の動作に関するバグ エントリを開きました。

于 2012-10-22T09:59:15.343 に答える
2

これはかなり一般的なエラーで、アップロードされるデータのサイズがファイル サイズと一致しないことが原因です。ファイル サイズ最大サイズを POST しなくても、アップロードされたデータ サイズが原因である可能性があります。

PHPマニュアルのこのページを参照してください。

; Maximum size of POST data that PHP will accept.
post_max_size = 8M

問題のもう 1 つの原因 (非常に大きなテキストの場合) は、UTF8 エンコーディングです。実際には 6 メガ * 文字 * の「6 メガバイト」の TEXTAREA があり、国際的なコードポイントを使用すると、たとえば 8.2 メガバイトになる場合があります。したがって、「6 メガバイトのデータが設定された 8 メガバイトの制限を超えています」という明らかに矛盾した状況が発生します。

アップデート

あなたは明らかに矛盾する 2 つの事実を報告しています。

PHP settings as follows (from phpinfo()):

    post_max_size = 64M

PHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes

POST の制限が64Mであることは PHPINFO から明らかです。それでもエラーは、制限が8M (デフォルト) であることを示しています。したがって、あなたのコードは2つの異なるPHP実装と通信しているように思えます(2つの異なる仮想ホスト?同じホスト内のCGIバージョンと非CGIバージョン?2つの異なるマシン?)

于 2012-10-22T09:44:11.360 に答える
0

IIS は FastCGI プロセスを再利用します。php.ini をリロードするには、古いプロセスをすべて強制終了する必要があります。

FastCGI モジュールを編集し、「monitor changes to file」を編集して、php.ini ファイルを選択します。これにより、編集を保存するたびに子プロセスが強制的に再起動されます。

于 2012-10-22T11:22:37.897 に答える
0

制限を -1 に変更すると、ファイルのサイズに関する問題が発生することはありません。基本的に「見えなければ存在しない」と言っているので、おそらく最善の解決策ではありませんが、本当に信頼性が高く、常に機能すると信じています。

于 2017-01-03T23:38:10.620 に答える