2013-01-14 41 views
1

我使用http post請求從一臺主機向另一臺主機傳輸文件。 接收主機使用php板載運行Apache。 該請求包含multipart/form-data,並通過php腳本(cURL)執行。 共有86個文件,總大小約爲20Mb。 問題是接收php腳本gots空$ _POST數組。 我重新配置了發送腳本,因此它在循環中發送相同的請求,但在每次迭代中從數據收集中刪除一個文件。當36個文件(總大小〜12Mb)被移除時,接收腳本接受數據,$ _POST變量填充良好。 什麼可能是錯的? 我已閱讀所有可重複使用的php.ini參數,因此它們包含合理的值。

ini_set("post_max_size","510M"); 
    ini_set("memory_limit","400M"); 
    ini_set("upload_max_filesize","510M"); 
    ini_set("max_file_uploads","500"); 

有沒有辦法調查原因?我的意思是,error_log不包含任何有用的東西。也許還有另一個來源?

+0

也許[max_input_time](http://www.php.net/manual/en/info.configuration.php#ini.max-input-time) –

+0

首先檢查您的設置是否有任何影響在'local value'列下的'phpinfo()' –

+0

使用'$ _FILES'而不是'$ _POST'? –

回答

3

post_max_size值不能在運行時按每個目錄設置。儘管您的phpinfo()將反映更改,但在處理表單時將被忽略,因此將恢復爲默認的8MB。

這可以通過文件的總大小爲20MB這一事實得到證實,但是當您刪除〜12MB的文件時,該腳本仍然有效。

20 - 12 = 8MB // Therefore the script works 

對此的唯一的解決辦法是設置值在php.ini,或備選地作爲使用Apache,可以設置在http.conf.htaccess文件中的值。

前段時間我也有過這個問題,雖然它在運行IIS的Windows上。但是,問題仍然是一樣的。有關該問題的更多信息,請參閱thread

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

該目錄的設置對於從該目錄或其任何子目錄運行 的任何腳本都是有效的。 密鑰下的值應具有PHP配置指令的名稱和 字符串值。值中的PHP常量不被解析。但是, 只有在PHP_INI_USER中可更改的配置值可以通過這種方式設置爲 的方式,PHP_INI_PERDIR值不能。

因此,儘管Plesk有一個接口來更改這些指令,並且即使phpinfo()接受了這些指令,但他們也不會改變實際的最大上傳大小。 Plesk不應該允許您更改Windows上的那些,並且phpinfo()不應該報告更改,但是您可以使用哪些方法來執行 。

+0

非常詳細的答案感謝。不幸的是它沒有幫助。我試着用重新啓動apache修改php.ini,試圖在.htaccess中指定這些參數 - 沒有效果。轉會方面可能有一些限制嗎?例如on cURL – heximal

+0

@heximal是否有任何錯誤被重新計算? –

+0

沒有錯誤。它看起來像絕對有效的http請求,但沒有發佈數據。沒有PHP的警告,通知,錯誤產生。所有error_levels被設置爲最大 - error_reporting(E_ALL) – heximal

1

檢查您是否安裝了Suhosin擴展。它有幾個設置可以限制您可以通過POST,GET和REQUEST接收的數據量。此外,它還可以限制通過設置suhosin.upload.max_uploads默認設置爲20的上傳文件的數量。

當設置執行操作時,POST數組通常會被截斷。

此外,如果您正在上傳文件,請檢查$_FILES陣列,而不是$_POST

+0

不,不幸的是,這個建議是錯誤的 - 沒有什麼奇特的東西安裝 – heximal

+1

suhosin既不是外來的,也不需要單獨安裝 - 它只是大多數PHP發行版的一部分 –

+0

好的,請記住。我聽說過它,但從來沒有面臨過。 – heximal