我有一个基于套接字连接的PHP文件,该文件通过命令行运行,例如
php myfile.php
它继续运行24 X7。有时如果出现问题,它会退出并出现错误,因此我想退出并再次自动打开该文件。出现上述错误的我的While函数如下所示:
while (1) {
try {
$w->pollMessage();
if (time() - $starttime > 180) {
echo "refresh";
newNumbers();
$starttime = time();
}
}
catch(Exception $e) {
// error coming here and I want reload (run same file again) here.
}
if (!$w->isConnected()) {
echo "disconnected";
connectwa();
}
}
$w->disconnect();
?>
我不知道应该使用哪种方法来重新加载或通过命令行自动再次运行同一文件。让我知道是否有人可以帮助我。 谢谢
答案 0 :(得分:0)
使用nohup捕获挂断信号。重定向标准输出,标准错误和标准输入,并使用&在后台启动新进程。 这样,新进程就可以安全地脱离,并且当前进程可以干净地退出。
$command = 'nohup php myfile.php > stdout.txt 2> stderr.txt < /dev/null &';
system($command);
exit;
除了每次都重定向到文件并覆盖文件外,您还可以使用两个>符号附加文件。
$command = 'nohup php myfile.php >> stdout.txt 2>> stderr.txt < /dev/null &';
这将捕获stdout.txt和stderr.txt中的所有输出。
在下面的示例代码中对此进行了演示。文件myfile.php将再次启动,并且原始过程可以安全地终止。
<?php
$timescalled = isset($argv[1]) ? $argv[1] : 0;
while (1) {
try {
$rand_between_0_and_1 = mt_rand() / mt_getrandmax();
if ($rand_between_0_and_1 < 0.001) throw new Exception();
} catch (Exception $e) {
fwrite(STDERR, "hello stderr\n");
fwrite(STDOUT, "hello stdout\n");
$command = 'nohup php myfile.php ' . ++$timescalled . ' >> stdout.txt 2>> stderr.txt < /dev/null &';
system($command);
exit;
}
}
可以从stdout.txt和stdout.txt中读取输出。通过使用:
tail -f output.txt &
添加到output.txt的内容会自动显示在终端中。 现在,您几乎可以将命令输出返回。