如何在php脚本上设置计时器,输出错误消息,并在经过n个时间量时终止脚本?

如何在php脚本上设置计时器,输出错误消息,并在经过n个时间量时终止脚本?,php,timer,timeout,Php,Timer,Timeout,这可能是一个简单的问题,但我对PHP相当陌生,很难弄清楚这一点。所以,有一点背景知识——我的脚本是从一个基于web的应用程序调用的,该应用程序允许用户在远程机器上运行简单的命令。例如,用户可以单击按钮在远程机器上编辑日志文件,它将向用户显示输出。现在,如果存在连接问题,并且ssh没有在目标服务器上正确配置,那么它可能永远挂起,ssh不会超时。为了向用户显示比php或fastCGI超时更好的错误,我想终止脚本并显示用户在超时发生之前正在运行的命令。为了简单起见,假设我的IIS/FastCGI/PH

这可能是一个简单的问题,但我对PHP相当陌生,很难弄清楚这一点。所以,有一点背景知识——我的脚本是从一个基于web的应用程序调用的,该应用程序允许用户在远程机器上运行简单的命令。例如,用户可以单击按钮在远程机器上编辑日志文件,它将向用户显示输出。现在,如果存在连接问题,并且ssh没有在目标服务器上正确配置,那么它可能永远挂起,ssh不会超时。为了向用户显示比php或fastCGI超时更好的错误,我想终止脚本并显示用户在超时发生之前正在运行的命令。为了简单起见,假设我的IIS/FastCGI/PHP超时都设置为5分钟。我想在脚本启动时设置一个计时器,如果4分45秒过去了,我想终止脚本并向用户显示一条错误消息,显示他们试图运行的命令,以便他们可以手动进行故障排除

在stub/psuedo代码中提供一个简单示例:

function StartTimer(){

//start timer 

}

function RunComand($cmd, $timer, $timeMax){

 //runs user command through ssh library and streams back output.
 $output = sshLib($cmd);

 //this is where i want to do my check on the timer. If run through ssh lib takes too long
 //kill the script and return $cmd to display it to user.

 if ($timer > $timeMax){
     //kill script, output $cmd
 }
 return $output;

}

$cmd = $_GET['cmd']  //get users command
$timer = startTimer();
$timeMax = 285; //285 seconds is 4 min 45 seconds

$results = RunCommand($cmd, $timer, $timeMax);
您可以使用“一个高级的、面向对象的PHP程序执行库”

下面是一个例子:

<?php

require 'Bunsen.class.php';

// You should DEFINITELY sanatize the contents of `$_GET['cmd']` !!!
$cmd = $_GET['cmd'];
$timeMax = 285;

$bunsen = new Bunsen;
$bunsen->setTimeout($timeMax);

$exitcode = $bunsen->exec($cmd);

if ($exitcode === -1) {
    trigger_error('Maximum time limit exceeded!', E_USER_ERROR);
}

这样,他们只能从白名单中运行已知的安全命令。

太棒了,这太完美了。我实际上不接受查询字符串中的cmd参数,我只是将其用作示例。已知的安全命令是根据用户选择的选项从存储在配置表中的值动态生成的。只能运行安全命令,我可以通过post将cmd发送到脚本,也可以直接调用它并将cmd作为参数传入。不过,感谢您的警告和优秀的示例!我已经开始使用pcntl_fork()编写一个快速解决方案,但这将节省我一些时间。再次感谢。
switch($_GET['cmd']) {
case 1:
    $cmd = 'first command';
    break;
case 2:
    $cmd = 'second command';
    break;
case 3:
    $cmd = 'third command';
    break;
default:
    trigger_error('Not allowed!', E_USER_ERROR);
}