簡體   English   中英

PHP上傳-500 Internal Server Error

[英]PHP Upload - 500 Internal Server Error

問題

上傳大約8MB或以上的文件時,出現500內部服務器錯誤。

  1. php.ini中的所有PHP設置均正確
  2. 在web.config中設置了maxAllowedContentLength

服務器信息

maxAllowedContentLength可以看出,我正在使用IIS 7.5和FastCGI和PHP 5.3.17運行

附加信息

我已經嘗試了許多不同的方法來使它正常工作,但是根本找不到問題。

但是,我發現以下一些信息可能有助於弄清此問題的根源:

  1. 使用服務器上的Media Wiki上傳文件(較大的文件)時,我收到相同的錯誤,這表明它不是我的代碼中的錯誤。
  2. 最重要的是 -我設法在Plesk文件管理器中上傳了18MB的文件,這顯然意味着Plesk能夠解決此配置問題。 我試圖將所有Plesk控制面板設置復制到IIS中的此域,但這似乎不起作用。
  3. 由於我已嘗試編寫exit; ,因此在執行腳本之前將返回錯誤exit; 在頂部嘗試獲取空白屏幕,但此操作將被忽略,並返回500錯誤。

我認為問題出在PHP配置的configure command部分內 ,因為當我更改.php文件的處理程序映射以使用Plesk php-cgi.exe而不是通常php-cgi.exe ,我沒有得到500 Internal錯誤。 話雖如此,我不能將其保留在此PHP版本上,因為它是Plesk自己的exe並且還有其他配置問題。

我認為可能與configure命令有關的原因僅僅是因為這從一個phpinfo()到另一個phpinfo()很大的不同。

如果您有任何想法或建議,請發布它們。 我已盡一切努力嘗試了一切,但似乎無法解決。 如果只是Linux ...

提前致謝

更新1

忘記添加,PHP錯誤日志中沒有返回任何錯誤。 至於IIS錯誤,我不知道在哪里看

更新2

這是我放置在web.config文件中的內容:

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

更新3

在您的幫助下,我們設法使IIS顯示錯誤。 這是我收到的:

PHP警告:12221448字節的POST內容長度超出了第0行上Unknown中的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”“-沒有-pi3web“”“ --with-pdo-oci = C:\\ php-sdk \\ oracle \\ instantclient10 \\ sdk,共享”“” --with-oci8 = C:\\ php-sdk \\ oracle \\ instantclient10 \\ sdk,共享“ “ --with-oci8-11g = C:\\ php-sdk \\ oracle \\ instantclient11 \\ sdk,共享”“ --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“”-啟用-mbstring“” --enable-mbregex“” --with-imap = shared“” --enable-sockets“” --enable-shmop“” --enable-soap“

更新(ANSWER)這非常奇怪,因為phpinfo()信息在說一件事,但是顯然它被忽略了,不知道為什么。

如果我在Plesk中更改了post_max_size ,對於該特定域/子域,則什么都沒有更改(盡管phpinfo()似乎已更改)。 但是,如果我實際上更改了php.ini中的post_max_value ,則可以解決此問題。

之所以不是解決此問題的好方法,原因僅在於當Plesk更新時,由於更新PHP而覆蓋了php.ini,因此丟失了對php.ini所做的更改。 這意味着每次Plesk更新時,我都需要對php.ini進行更改。 這就是為什么Plesk可以更改PHP設置而無需更改php.ini的原因。

誰能想到PHP為什么忽略了本地值並恢復為php.ini中的值,即使php.ini聲明本地值不同嗎?

如果查看PHP源代碼 ,則可以在文件php-5.4.8-src\\main\\rfc1867.c行中看到:

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;
}

php-5.4.8-src\\main\\SAPI.c文件中也存在相同的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設置有關。 您已經通過使用phpinfo()確認已正確配置了此設置,但是無論如何它似乎正在使用默認值8M。

至於為什么,請看這個線程

事實證明,在Windows上,您只能在每個目錄中設置標記為PHP_INI_USER ini指令。 不幸的是, upload_max_filesizepost_max_size都是PHP_INI_PERDIR 來自位於http://php.net/manual/zh/configuration.changes.php的PHP文檔

從該目錄或該目錄的任何子目錄運行的任何腳本的目錄設置均處於活動狀態。 鍵下的值應具有PHP配置指令的名稱和字符串值。 不解析值中的PHP常量。 但是,只能以這種方式設置PHP_INI_USER中可更改的配置值,而不能設置PHP_INI_PERDIR值。

因此,即使Plesk具有更改這些指令的接口,即使phpinfo()了這些指令, 它們也不會更改實際的最大上傳大小。 Plesk不允許您在Windows上進行更改,並且phpinfo()不應報告更改,但是您可以做什么。

因此,它是post_max_size,需要在php.ini中設置。 即使phpinfo另有說明,Plesk設置也無法正常工作。 我也打開了一個關於phpinfo行為的錯誤條目 ,因為似乎沒有它的條目。

這是一個相當常見的錯誤,是由於正在上傳的數據大小與文件大小不匹配 :即使POST最大大小未超出文件大小 ,也可能是已上傳的數據大小

請參閱PHP手冊中的此頁面

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

麻煩的另一個來源(對於非常大的文本)是UTF8編碼。 您可能會發現自己擁有一個“ 6兆字節”的TEXTAREA,實際上是6兆*個字符*,而使用國際代碼點,它可能會達到8.2兆字節。 因此,您會看到“ 6兆字節數據超出配置的8兆字節限制”的明顯矛盾的情況。

更新資料

您報告了兩個明顯矛盾的事實:

PHP settings as follows (from phpinfo()):

    post_max_size = 64M

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

從PHPINFO可以明顯看出POST的限制是64M 但是該錯誤表明限制為8M (默認值)。 因此在我看來,您的代碼正在與兩個不同的PHP實現進行對話 (兩個不同的虛擬主機?同一主機中的一個CGI版本和一個非CGI版本?兩個不同的機器 ?)

IIS將重新使用FastCGI進程。 您將需要殺死所有舊進程才能重新加載php.ini。

編輯FastCGI模塊並編輯“監視文件更改”,然后選擇php.ini文件。 每當您保存編輯時,這將強制子進程重新啟動。

您可以將限制設置為-1,這樣就永遠不會遇到文件大小的麻煩。 這可能不是最好的解決方案,因為您基本上是在說“如果我看不到它,它就不存在”,但是請相信,它確實可靠並且將始終有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM