控制台和Web应用程序的输出进度

时间:2017-05-25 00:16:30

标签: php logging architecture yii2 microservices

我正在编写一个主要用作控制台应用程序的yii2应用程序。我有组件或(微)服务从服务器获取一些数据,处理它们并保存我需要db的信息。当然有几个 for循环,在这些循环中,我使用yii\helpers\Console::updateProgress或仅echo输出我当前的进度来观察进度和测试输出(如从xxx产品开始)。在某些事件中,我使用Yii::info()Yii::error()记录重要信息,依此类推。通常是一个cron处理任务,如pullProductUpdates或其他东西和我。

但在某些情况下,我也需要在我的网络应用程序中使用该方法(即pullProductUpdates)。但是,不能有任何echo命令激活或Console::updateProgress命令。

当然我对Yii的日志记录方法没有问题,因为我配置了日志目标,但它们不会回显某些内容。但我不确定如何处理echo命令...

一种方法是检查是否设置了$_SERER['REMOTE_ADDR']。在控制台中,它将评估为null,因此我可以围绕if {} else {}扭曲。一个可能更好的解决方案是编写log()progress()方法。特质可能有用吗?

那么我该如何设计解决方案呢?这有什么模式吗?我的服务应该实现loggableproressable这样的界面吗?或者使用Logger / Progress对象并使用某种DI(依赖注入)?因为我不想多次编写那些log()progress()方法函数。此外,我不能在webapplication中使用进度函数。一个原因是我不知道该怎么做(如果它可能在这里使用php),但这将是另一个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

作为PHP程序员,您了解并使用PSR。在这种情况下,您应该使用依赖注入和LoggerInterfaces

对于Web应用程序,您应该将组合根配置为使用记录到文件的记录器实现。对于控制台应用程序,您应该登录终端。

组合根是您配置依赖注入容器(DIC)的位置。详细了解Yii DIC here

为了做到这一点,您应该能够通过环境变量或php_sapi_name在这两个组合根之间切换。