PHP调用侦听器脚本以连续运行

时间:2017-09-19 16:58:10

标签: php mysqli ssh2-exec

我有一个网站,允许用户选择测试脚本,并在提交所需的测试后,它将POST到insert.php和:

  1. 它在with done = 0(insert.php)中插入一行到MySQL数据库。

  2. 我想在网络服务器上连续运行一个监听器脚本(testexe.php)(可能睡10秒),只要有完成= 0的行,执行它们然后改变done = 1,然后转到下一个。

  3. 我有一个在while循环中运行的脚本,但是,我有一个问题,这个php脚本最初是如何调用的?或者如何激活它以便最初启动?在提交测试之前,我是否必须先在服务器上像php testexe.php那样运行它?因为我知道这个脚本只是听事件,在我的情况下事件是完成= 0,但我怎么能让这个脚本一直运行(系统启动)?我不太了解这一部分。

    我想这样做的原因是因为可能有多个用户同时发送请求,所以我想确保他们逐个处理测试并排队。

    testexe.php

    <?php
    
    ...
    ...    
    
    //while there are still jobs that are not done..
    while (1) {
        //wait for 10 seconds and query again...
        sleep(10);
        $statusResult = mysqli_query($dbConnection, $qStatus);
        //if there are undone jobs we pick them and execute them
        if (mysqli_num_rows($statusResult) > 0){
            //query the next undone test case
            $testResult = mysqli_query($dbConnection, $qNextTest);
    
            //fetch the returned query object and store needed parameters 
            $row = $testResult->fetch_assoc();
            $id = $row['id'];               
            $test_script = $row['test_script']; 
            $gateway = $row['gateway'];         
    
    
            if ($connection = @ssh2_connect($gateway, 22)) {
                ssh2_auth_password($connection, $user, $password);
    
                //execute the test case
                $stream = ssh2_exec($connection, "/my/path/to/script.sh"); 
    
                //fetch output stream and stderr
                stream_set_blocking($stream, true);
                $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
                $stream_err = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
                while($line = fgets($stream_out)) {flush(); echo '<pre>' . $line . '</pre>';}               
                echo '<pre>' . "------------------------\n" . '</pre>';
                while($line = fgets($stream_err)) {flush(); echo '<pre>' . $line . '</pre>';}
                fclose($stream);    
    
                //update the table after the above script is done
                $qUpdateStatus = "UPDATE table SET status = 1 WHERE id = $id";
                $updateresult = mysqli_query($dbConnection, $qUpdateStatus);
            }
    
        }
    }
    
    ?>
    

2 个答案:

答案 0 :(得分:1)

我可以想到两个选项:(1)在您的网络服务器上创建一个cron作业,每隔约5分钟调用一次testexe.php,或者(2)让POST执行testexe.php脚本,并告知testexe.php检查testexe.php的另一个实例当前是否正在运行。

答案 1 :(得分:1)

如果您使用Linux cron可能适合您:

将此行添加到您的crontab文件(通过crontab -e访问)

10   *   *   *   *   php testexe.php

然后删除while循环和sleep语句。

如果您需要10秒以外的其他内容,此页面可能会对您有所帮助:http://www.crontabgenerator.com/