[英]Server-side object in PHP is empty when returned to client
我有一個服務器端PHP腳本,該腳本生成一個對象,該對象包含來自數據庫的聚合數據。 該腳本將構建對象,將其編碼為JSON並將其返回給客戶端,客戶端通過jQuery.ajax調用發出原始請求:
$.ajax({
async: false,
url: 'scripts/getDataforUser.php?firstName=' + _firstName+ '&lastName=' + _lastName,
dataType: "json",
success: function(result) {
//Do stuff with 'result' object
//result object sometimes comes back empty
},
error:function (xhr, ajaxOptions, thrownError){
displayError('An error occurred while fetching data');
return;
}
});
我的問題是我偶爾會返回一個空的結果對象,這似乎在較大的請求中發生,但似乎是隨機的,因此跟蹤原因是一個挑戰。 我使用Zend Server和Eclipse作為我的IDE,我已對該腳本進行了多次調試,以確認A)有數據,並且B)使用json_encode($data, JSON_FORCE_OBJECT)
將結果對象正確編碼為JSON。 PHP方面。
同樣,此錯誤似乎只發生在較大的對象上,因為在直接調試getDataforUser.php腳本時可以看到數據,因此我專注於客戶端,並查看在Javascript端是否接收到一些錯誤。
我現在還不確定從服務器到客戶端的翻譯中會丟失什么。 我如何在PHP中對對象進行JSON編碼是否存在問題? 我如何調用服務器以獲取該編碼對象? 兩者結合? 還是我想念的更根本的東西?
更新:
嗨,Ben,正如我在評論中所言,我在原始帖子中忽略的一個細節可能提供了對該問題的一些見解,那就是在我本地開發服務器上運行相同URL的同一個開發人員會返回一個空對象,只是獲得一個具有空屬性的對象。 可能是我們本地服務器的PHP配置有問題嗎? 在我的PHP.ini文件中,我對資源限制進行了以下設置,在這種情況下,我認為這將綽綽有余。
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 600 ; Maximum execution time of each script, in seconds
max_input_time = 180 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)
通過直接調試腳本,腳本執行此查詢所用的時間不會超過600秒。 它很好地分析了請求數據的時間限制,並且不會引發有關內存耗盡的錯誤。
更新2:
我的開發環境正在運行Apache Web服務器。
更新3:
@Ben-我快速瀏覽了Apache核心文檔 ,Timeout指令的默認值為300秒,盡管如上所述,我使用Zend Server CE作為我的開發服務器(它位於Apache之上),所以它可能在內部Apache配置中設置了自己的默認超時指令。 同樣,我將不得不檢查。
還要澄清一下,我在該軟件項目上的合作伙伴遇到了同樣的問題,只是他沒有得到空對象,而是得到了空值。
更新4:
好的,我正在本地Web服務器上進行了廣泛的測試和驗證。 一個相關的細節是我查詢的數據庫托管在MS SQL Server上,我使用SQL Server Native Client PHP驅動程序作為數據庫抽象層。 無論如何,在查看日志后,我發現對數據的查詢正在超時,SQL Native Client報告以下內容:
[0] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => 258
[code] => 258
[2] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258].
[message] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258].
)
[1] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => 258
[code] => 258
[2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
[message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
)
[2] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => -2147467259
[code] => -2147467259
[2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
[message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
)
這似乎是結果對象中空數據的主要來源,我仍在搜索有關此錯誤的信息,我不確定我需要更新的超時設置是在SQL Server Native Client本身中還是在數據庫。 需要更多調查。
更新5:
我排除了數據庫超時,將遠程連接超時設置設置為600秒。 我已經在線閱讀全文,因為超時似乎不是問題,所以首選使用PDO ODBC驅動程序。 我將嘗試一下,看看是否可以解決此超時問題。
最終更新解決方案:
好的,所以切換到PDO驅動程序似乎已經解決了我的超時問題,我驗證了PDO驅動程序在我們的本地開發機和登台服務器上均可以工作。 我仍然不確定在使用SQLSRV驅動程序時會導致SQL Server Native Client超時的原因。 現在,我將把主要問題標記為已解決,因為我現在正在獲取數據。 感謝Ben D和其他所有人的支持。
有三個明顯的問題根源:返回ajax請求的問題,或者是被調用的PHP腳本,或者是由Web服務器提供php結果的問題。 我猜這是一個PHP問題,但請徹底注意:
$.ajax()
請求有可能超時,因為即使jquery沒有默認超時,不同的瀏覽器似乎也對ajax請求設置了自己的超時] 1 。 盡管不確定,但async: false
設置可能會使情況更加復雜。 我猜這不是嗎,因為我認為瀏覽器超時會觸發ajax錯誤子句,並且您在注釋中注意到有人可以直接從URL復制,但是很容易確定使用firebug(或等效方法) )並查看路況。
這是PHP問題的可能性要高得多。 需要檢查的幾件事:1. PHP腳本沒有超時(ini文件中的max_execution_time
)或沒有達到內存上限(ini中的memory_limit
)。 還要確保您不會意外地對非utf8字符進行編碼,而只是碰巧在大對象中碰到它們(在這種情況下json_encode()
將返回null
)。 嘗試打開錯誤,查看是否生成任何錯誤,還嘗試運行json_last_error()來查看創建json字符串是否存在問題。
最后,Apache可能是問題所在。 您的請求看起來很小,所以我懷疑它是否達到了任何請求的URL限制,但是在等待php創建對象的同時,Web服務器可能正在超時...檢查您的http.conf文件中的TimeOut
值是什么。
不要通過URL傳遞GET參數。 使用“數據”屬性代替:
$.ajax({.... data: { firstName: "bob", lastName: "smith" } });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.