【问题标题】:PHP run loop and script at same timePHP 同时运行循环和脚本
【发布时间】:2014-07-23 09:21:19
【问题描述】:

我目前正在我的 PHP 脚本中运行一个循环来检查用户连接是否已中止 (connection_aborted() does not work on ajax calls):

connection_check.php:

<?php
ignore_user_abort(true);
for ($i = 0; $i < 1000; $i++) {
    echo "<br>";
    flush();
    ob_flush();
    if (connection_aborted()) {
        echo "nocon";
        exit;
    } else {
        // Everything is fine
    }
    sleep(3);
}
?>

但是,当这个循环在“后台”运行时,我还需要运行其余的 PHP 代码,这样当连接中止时,脚本就会终止,但如果不是,脚本应该继续运行.我需要这样做,因为我正在使用 ajax 调用来调用这个 PHP 文件。

这是我尝试过的,但是,它不起作用(脚本继续运行并且不会死,connection_check.php 不会回显“nocon”):

file.php

<?php
$child = fopen('http://ipaddress/core/connection_check.php', 'r');

/***
* ALL PHP CODE HERE THAT SHOULD START RUNNING RIGHT AWAY WHILE CONNECTION_CHECK.PHP RUNS IN THE BACKGROUND
***/

$response = stream_get_contents($child);

if($response == "nocon") {
    die();
}
?>

有什么帮助吗?如果有人有替代方案,那也将不胜感激。我已经为此工作了一天多,但还没有运气。

【问题讨论】:

    标签: php ajax multithreading fopen


    【解决方案1】:

    在您的代码中,您在循环中调用 sleep(3) 并且您的循环运行了 1000 次,您是否尝试过等待 3000 秒以完成循环?我假设您希望每 3 秒检查一次用户是否仍处于连接状态。

    我的建议是删除sleep,删除循环并让您的PHP 基本上只检查一次连接并返回相关响应。每 X 秒通过 AJAX 调用这个 PHP。您可以在 Javascript 中查看 setTimeoutsetInterval 来实现这一点。也许每次 AJAX 调用完成时设置一个超时以再次调用它。

    类似这样的东西(Javascript/jQuery)

    function checkConnection() {
        // Ajax call here
        $.ajax({
            // Other AJAX stuff
            complete: function() {
               setTimeout(function(){
                   checkConnection();
               }, /*<YOURTIMEHERE>*/);
            }
        });
    }
    
    checkConnection();
    

    或者更好的是,当连接被认为是活动的时,您可以将 setTimeout 位放在成功回调中。

    【讨论】:

      【解决方案2】:

      使用:

      ob_start(); 然后你的循环

      【讨论】:

      • 如果您提供一些上下文来说明您的解决方案是什么:例如为什么使用 ob_start(); 以及它的作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2020-09-10
      • 2013-07-27
      相关资源
      最近更新 更多