Javascript 如何重新构造长时间运行的php进程以避免超时

Javascript 如何重新构造长时间运行的php进程以避免超时,javascript,php,ajax,Javascript,Php,Ajax,我有一个简单的javascript函数,如下所示: $(document).ready(function(){ var request = $.ajax({ url: "read_images.php", type: "GET", dataType: "html" }); request.done(function(msg) { $("#mybox").html(msg); document.

我有一个简单的javascript函数,如下所示:

$(document).ready(function(){
    var request = $.ajax({
        url: "read_images.php",
        type: "GET",
        dataType: "html"
    });
    request.done(function(msg) {
        $("#mybox").html(msg);
        document.getElementById('message').innerHTML = '';
    });
    request.fail(function(jqXHR, textStatus) {
        alert( "Request failed: " + textStatus );
    });
});
它调用的php脚本对文件夹的内容进行循环,运行一些检查并返回响应。脚本如下:

//Get all Images from server, store in variable
$server_images = scandir('../images/original');

//Remove first 3 elements, which are not correct
array_shift($server_images);
array_shift($server_images);
array_shift($server_images);

$j = 0;
for($i=0;$i<count($server_images) && $i<3000;$i++) {
     $server_image = $server_images[$i];

    //Make sure that the server image does not have a php extension
    if(!preg_match('/.php/',$server_image)) {

    //Select products_id and name from table where the image name is equal to server image name
    $query = "SELECT `name`
            FROM `images`
            WHERE `name` = '$server_image'";
    $mro_images = $db->query($query);
    $mro_images_row = $mro_images->fetch();
    $mro_image = $mro_images_row['name'];

    //If no results are found
    if(empty($mro_image)) {
        $images[$j] = $server_image;
        $j++;
    }
}
}
我已尝试增加php执行限制,但没有任何效果,因为在联系我的主机后:

不幸的是,在我们的环境中,我们没有任何方法将负载平衡器超时时间增加到30秒以上


因此:如何重新构造此代码以避免达到执行时间限制?

如果所有操作都能在2000次迭代和3000次迭代中运行,请尝试提高时间限制以允许php执行更长的时间。但在正常情况下,这不是一个好主意。确保您知道自己在做什么,并且有充分的理由增加执行时间

set_time_limit ( 60 );

这也可能是由于脚本耗尽了内存。创建一个包含phpinfo函数的文件,然后检查内存限制值

<?php phpinfo(); ?>

如果每件事都能在2000次迭代和3000次迭代的情况下运行,请尝试提高时间限制,以允许php执行更长的时间。但在正常情况下,这不是一个好主意。确保您知道自己在做什么,并且有充分的理由增加执行时间

set_time_limit ( 60 );

这也可能是由于脚本耗尽了内存。创建一个包含phpinfo函数的文件,然后检查内存限制值

<?php phpinfo(); ?>
您的计数($server\u images)可能会导致无限循环

如果count()返回0,则for循环将永远不会结束。所以你需要先检查一下

//Get all Images from server, store in variable
$server_images = scandir('../images/original');

//Remove first 3 elements, which are not correct
array_shift($server_images);
array_shift($server_images);
array_shift($server_images);

$j = 0;

if(count($server_images) > 0){    
    for($i=0;$i<count($server_images) && $i<3000;$i++) {
      //Do something
    }
}
//从服务器获取所有图像,存储在变量中
$server_images=scandir('../images/original');
//拆下前3个不正确的元件
数组\u移位($server\u映像);
数组\u移位($server\u映像);
数组\u移位($server\u映像);
$j=0;
如果(计数($server_images)>0{
对于($i=0;$i您的计数($server\u images)可能会导致无限循环

如果count()返回0,则for循环将永远不会结束。因此需要首先检查该值

//Get all Images from server, store in variable
$server_images = scandir('../images/original');

//Remove first 3 elements, which are not correct
array_shift($server_images);
array_shift($server_images);
array_shift($server_images);

$j = 0;

if(count($server_images) > 0){    
    for($i=0;$i<count($server_images) && $i<3000;$i++) {
      //Do something
    }
}
//从服务器获取所有图像,存储在变量中
$server_images=scandir('../images/original');
//拆下前3个不正确的元件
数组\u移位($server\u映像);
数组\u移位($server\u映像);
数组\u移位($server\u映像);
$j=0;
如果(计数($server_images)>0{
对于($i=0;$i而言,下面的代码表示要遵循的基本逻辑。它不是经过测试的代码,不应被视为插入式代码示例

使用javascript循环 不要让一个缓慢的过程变慢,而是编写JavaScript,在循环中请求更小的数据块

也就是说,js可以使用while循环:

$(document).ready(function(){
    var done = false,
        offset = 0,
        limit = 20;

    while (!done) {
        var url = "read_images.php?offset=" + offset + "&limit=" + limit;

        $.ajax({
            async: false,
            url: url
        }).done(function(response) {

            if (response.processed !== limit) {
                // asked to process 20, only processed <=19 - there aren't any more
                done = true;
            }

            offset += response.processed;
            $("#mybox").html("Processed total of " + offset + " records");

        }).fail(function(jqXHR, textStatus) {

            $("#mybox").html("Error after processing " + offset + " records. Error: " textStatus);

            done = true;
        });
    }

});
通过这种方式,给定php请求需要处理的工作量是固定的,因为要处理的数据总量在增长(假设目录中的文件数量没有增长到不切实际的数字)。

下面的代码指示了要遵循的基本逻辑。它不是经过测试的代码,不应被视为一个插入式代码示例

使用javascript循环 不要让一个缓慢的过程变慢,而是编写JavaScript,在循环中请求更小的数据块

也就是说,js可以使用while循环:

$(document).ready(function(){
    var done = false,
        offset = 0,
        limit = 20;

    while (!done) {
        var url = "read_images.php?offset=" + offset + "&limit=" + limit;

        $.ajax({
            async: false,
            url: url
        }).done(function(response) {

            if (response.processed !== limit) {
                // asked to process 20, only processed <=19 - there aren't any more
                done = true;
            }

            offset += response.processed;
            $("#mybox").html("Processed total of " + offset + " records");

        }).fail(function(jqXHR, textStatus) {

            $("#mybox").html("Error after processing " + offset + " records. Error: " textStatus);

            done = true;
        });
    }

});


通过这种方式,给定php请求需要处理的工作量是固定的,因为要处理的数据总量在增长(假设目录中的文件数量不会增长到不切实际的数字).

如果在浏览器中运行PHP页面,我想您仍然会遇到错误。因此,我怀疑是PHP而不是javascript…
HTTP/1.1500内部服务器错误31234ms
听起来很可疑,因为PHP脚本的默认超时时间是30秒。您真的希望PHP脚本运行那么长时间吗?听起来无论它在做什么,都应该做不同的事情。@AD7six我认为你是正确的,但是我如何将超时时间改为更长的时间?请描述一下你在这30多秒内正在做什么。很可能有更好的方法来实现这一点。@Tigerman55你需要发布你的PHP代码。你发布的JS与e question.JS永远不会导致500错误,因为这是一个服务器错误,而JS是一种客户端语言。如果在浏览器中运行PHP页面,我想您仍然会遇到错误。因此,我怀疑,是PHP而不是javascript…
HTTP/1.1500内部服务器错误31234ms
听起来很可疑,好像您的PHP脚本在默认情况下超时了php脚本的超时时间是30秒。你真的希望php脚本运行那么长时间吗?听起来无论它在做什么都应该做得不同。@AD7six我认为你是对的,但是我如何将超时时间改为更长的时间?请描述你在30秒以上的时间内正在做什么。很可能有更好的方法来实现这是。@Tigerman55您需要发布PHP代码。您发布的JS与问题无关。JS永远不会导致500,因为这是一个服务器错误,JS是一种客户端语言。您可以使用True保存整个if块,但这样,如果目录为空,您可以返回错误代码。我已经尝试在我的问题中突出显示假设我知道循环已经起作用。如果计数返回多个循环,循环就起作用了。你测试过我的代码了吗?我刚刚测试了代码,它仍然不起作用。你可以使用True保存整个if块,但这样,如果目录为空,你就可以返回错误代码。我已经尝试在我的qu中突出显示估计我知道循环已经起作用了。如果计数返回多个循环,循环就起作用了。你测试过我的代码了吗?我刚刚测试了代码,它仍然不起作用。我尝试了这个,但在30秒后它仍然崩溃。我只是将代码粘贴到我的页面顶部并保存了它。如果你继续,你从页面得到的响应是什么直接在web浏览器中访问它-不是ajax请求。听起来好像不是