PHP:每10秒执行一次while循环内的函数

时间:2019-08-12 23:06:31

标签: php loops while-loop

我在这里有此while循环:

raw_data={'Class':['A1','B1','C1','D1','A1'],
          'Name':['Harry','Christabel','Mel','Chris','Cherry'],
          'Color':['Red','Blue','Pink','Red','Red']}

df = pd.DataFrame(raw_data)
all_names = df['Name'][df['Class']=='A1'].unique()
all_colour=df.loc[df['Colour'].isin(all_names)]

通过AJAX函数调用此循环。该计划是等到客户付款为止。为了对此进行检查,我构建了一个$payment_timeout = time() + 300; while ( time() < $payment_timeout ) { if (is_valid()) { continue; } break; } 函数,该函数对数据库进行检查以检查是否已付款。

问题在于,在这种情况下,由于请求数量过多,我的数据库将崩溃。因此,我正在寻找一种方法,每隔is_valid()次执行检查,而其他时候只需执行继续操作即可。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以使用javascript进行“长时间轮询”。
这非常简单:每隔X秒运行一次javascript函数(在您的情况下为10秒),并调用服务器。

通过这篇帖子Using setInterval() to do simplistic continuous polling,您可以执行以下操作:

// This function is called every 10000 milliseconds (10 seconds)
function refresh() {
    // make Ajax call here, inside the callback call:

    // call itself again after 10 seconds
    setTimeout(refresh, 10000);
}

// if you want to wait 10 seconds for the first call
setTimeout(refresh, 10000);
// or if you want to call immediately the first time
refresh();

如果要在5分钟后停止通话,只需设置一个计数器变量并在刷新功能中检查它即可。
类似于(伪代码):

IF YOUR_COUNTER < 5 MINUTES THEN
    CALL REFRESH AGAIN

refresh函数的结尾。

答案 1 :(得分:1)

以下是Java中轮询机制的简单通用实现,可处理可变的端点,时间间隔,持续时间和回调。

假设是您从PHP代码中删除了while循环,并确保发送回有效的JSON响应。在下面给出的回调参数中,假设是PHP发送回 buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.google.gms:google-services:4.2.0' } } allprojects { repositories { google() jcenter() maven { url "https://giphy.bintray.com/giphy-sdk" } maven { url "https://maven.google.com" } maven { url 'https://jitpack.io' } maven { url 'https://jcenter.bintray.com/' } maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'} } } task clean(type: Delete) { delete rootProject.buildDir }

json_encode(['paid' => true])

NB:XHR = XMLHttpRequest; @Giacomo显示的不是长轮询,long-polling是一种客户端-服务器技术,涉及保持连接请求打开。

答案 2 :(得分:0)

我现在正在使用setInterval()函数进行检查:

let interval = setInterval( function () {
    //If max time of 5 minutes exceeded (5 * 60000) I leave the interval
    if ( new Date().getTime() - startTime > 300000 ) {
        clearInterval( interval );
    }
    //Here I'm doing my AJAX request to check the payment status
}, 5000 ); //<- Execute every 5 seconds

这对我来说很好,很简单