簡體   English   中英

返回客戶端時,PHP中的服務器端對象為空

[英]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.

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