从ajax请求(jQuery)到Code Igniter控制器的500错误

时间:2013-11-04 17:34:33

标签: javascript php jquery ajax codeigniter-2

想知道是否有人遇到过这个问题。

我正在调用运行模型(在服务器上)的CI控制器,并且需要更长时间(大约5分钟)来执行特定方案。问题是我在长时间请求后收到500错误,但是当请求更短时(约1分半钟)我没有收到任何错误。

我已经检查过的一些事情:

  • CI的'csrf_protection'已关闭
  • 我在我的ajax电话(900000)
  • 中设置了一个长时间超时
  • 我已将PHP中的max_execution_time设置为900
  • 我已将IIS中的空闲超时设置为(20分钟)

这是我的ajax电话:

$.ajax({
    type:'POST',
    url:"run/runScenario/" + saveOrUpdate + "/" + scenarioname + "/"  + units + "/" + stateid + "/" + climatestationid + "/" + soiltexture + "/" + 
                            moisturecontent + "/" + modsoilflag + "/" + slopelength + "/" +  slopeshape + "/" + slopesteepness + "/" + vegcommunity + "/" + 
                            basalcover + "/" + canopycover + "/" + rockcover + "/" + littercover + "/" + cryptogamscover,
    data: {scenarioDescription: scenariodescription},
    timeout:900000,
    statusCode: {
        500: function() {
          alert( "page not found" );
        }
      },
    success: function(runData){
            $('#progressBar').append('<p>Done running scenario.</p>');
            $('#progressBar').append('<p>Saving scenario...</p>');
            saveScenarioResultsTable();
            $('#progressBar').append('<p>Creating output table...</p>');
            printScenarioResultsTable(scenarioname);
    },
    error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.responseText);
                // stop timer
                var end = new Date().getTime();
                var execution_time = end - TIMER;
                runTimeMessage = "<br/><b>Ran scenario in " + (parseInt(execution_time) * 0.001) + " seconds.</b>";
                alert(runTimeMessage);
    }
});

UPDATE 我创建了一个测试函数(作为我的运行控制器的一部分)并在函数内部设置了 sleep(300)。我得到了相同的500错误 但是,当我更改为 sleep(299)时,该函数成功运行。显然,每个请求有5分钟的限制 我已经在php.ini中更改了* max_execution_time *。还有其他建议吗?

更新#2 我找到了解决问题的方法。问题是因为我的PHP设置中没有启用“safe_mode”,所以在CodeIgniter.php中忽略了PHP超时(第107行)。我正在运行CodeIgniter 2.1.4。我希望这有助于其他人。 :)

1 个答案:

答案 0 :(得分:0)

就像一个想法,但不是代码的修复:

如果您将使用两个不同的ajax请求怎么办:

  1. 请求在某些缓冲区(如文件或sql记录)中处理和写入处理结果。该请求可能会也可能不会返回未来资源的随机描述符。
  2. 请求获取描述符处理结果或仅获取资源的可用性。此请求必须加入计时器。
  3. 时间轴:

    -------------------------------------------------------------------
    Step         Local            server          processing
    -------------------------------------------------------------------
    1. Request for processing >>> Server >>> Thread for processing
    2. Descriptor of resource <<< Server >>> Descriptor of resource
    3.                            Server <<< Result of processing
    4. Request by descriptor  >>> Server
    5.                 Result <<< Server >>> Deletion of file or record
    -------------------------------------------------------------------
    

    有:
    1,2 - Ajax#1,按要求激发 4,5 - Ajax#2,每10秒触发一次。