我有一个运行数天的CLI脚本。它处理批次,每个批次大约需要7分钟。有时我需要停止脚本,但是我需要在处理完批次后停止它,这是我放入的2秒睡眠。有没有办法在脚本执行的任何阶段捕获输入,如果input = x,然后在下一批结束时停止脚本;否则继续。
我遇到过:
$handle = fopen ("php://stdin","r");
$line = fgets($handle);
但这需要输入。
答案 0 :(得分:1)
我认为你不会像你想的那样得到它。您可以捕获StdOut
,但我不认为它会在停止脚本方面做得更好。如果我在cli上使用它并且它一直运行但是我想暂停它一段时间你可以做很多事情但是这可能是我要解决它的“快速修复”< /强>
稍微调整一下你的php代码,并将批处理过程放在一个函数中(如果还没有)。然后,您可以使用while
创建无限循环。然后我会在每个批处理过程之后检查是否存在暂停文件。如果文件存在,则不要启动下一批。基本上暂停它。如果它不存在则继续正常进行。
例如。
你的php文件可能看起来像这个小例子。
<?php
//path to pause file
$filename = "/root/pause";
while(1){
if(!file_exists($filename)){
batch();
}
}
function batch(){
//batch processing
echo "batching\n";
//fake processing using a usleep pause
usleep(3000000);
}
?>
然后当你想暂停脚本时。只需创建文件pause
,当前处理完成后,它将停止。
因此,要在Linux上创建文件,请cd到脚本中的目录并运行命令
touch pause
或者您可以使用touch /path/to/pause
之类的完整路径。只需确保它与脚本中的目录相同即可。完成后,只需删除文件rm -f pause
,它就会继续处理批次。
请注意,当它暂停并且它只是循环而不是处理时,它可能会导致cpu使用量略有增加,但它应该没问题。
从长远来看,你可以看看这个小例子,让你朝这个方向前进。 http://www.phpmysqlitutorials.com/2013/05/08/php-standard-input-and-loops-on-the-command-line/