Laravel 调试工具 laravel-debugbar 打印日志消息

 更新时间:2016年11月25日 15:31  点击:3882
laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。

其实不用 Facade 方式更好用,因为使用 Facade 还要引入命名空间,那不得每个 debug 的地方都引入命名空间吗,这样显得不太好。

laravel-debugbar 提供了全局的函数,位于 /vendor/barryvdh/laravel-debugbar/src/helpers.php,已经在组件的 composer.json 中定义了自动加载,因此可以直接使用帮助函数,如打印 info 级别的日志信息:

debugbar()->info($data);

直接这样调用就好了。

看看函数定义:


if (!function_exists('debugbar')) {
    /**
     * Get the Debugbar instance
     *
     * @return \Barryvdh\Debugbar\LaravelDebugbar
     */
    function debugbar()
    {
        return app('debugbar');
    }
}

打印消息如图所示:

laravel-debugbar 是个很好的调试工具,主持 psr-3 规范对日志消息定义的几种级别,在开发中可以很好的利用这个工具,提高开发、排错的效率。

PHP SDK其实应用很简单一般官方提供了PHP SDK肯定就是案例了,只要我们根据修改参数就可以了下面来看阿里云直播PHP SDK如何使用吧。

1、直播云没有单独的SDK,直播部分的SDK是直接封装在CDN的相关的SDK里面

2、针对SDK,没有demo。

3、针对SDK,没有相关的文档说明。

4、针对SDK的说明,网站上面的说明与源码里面的说明完全不一致。

5、针对SDK没有封装那些常用的访问,需要用户组合调用SDK进行拼装,总之一句,这也太抽象,看看人家七牛的API,哎,不多说啥了

6、提供的SDK路径乱的一踏糊涂,想直接用没门,得各种调整。

7、针对SDK基于PHP更高登记的版本,照顾不到一些低版本用户。

针对上面几点原因,踩了一部分坑,参考其他云直播提供的通用接口进行整理的。

 首先,我们分析一下阿里云提供的PHP SDK。阿里云SDK目录结构如下:

aliyun-php-sdk-core:作为PHP SDK引用核心包,只要使用阿里云的产品的php 的SDK,这个文件夹下的所有东东都是基础。
aliyun-php-sdk-cdn:这个包里面是阿里云 CDN产品的PHP SDK,但是目前直播里面的SDK都在这个里面,可能是因为直播产品和CDN产品比较紧密吧!(PS:在开通直播产品时,CDN产品的开通是前提条件)
 下图为从阿里云的PHP SDK整个大包,里面包含阿里云所有产品的PHP SDK。

接下下来,我们来看看如何配置,这一步很关键,阿里云的官方网站上面内容  与  SDK 的demo  ,有三个版本。(这是痛苦的根源,哈哈)

 1、将整个PHP SDK包放置项目目录当中。

2、配置aliyun-php-sdk-core

在aliyun-php-sdk-core下面有一个config.php文件

 代码如下 复制代码


include_once 'Autoloader/Autoloader.php';
include_once 'Regions/EndpointConfig.php';

//config sdk auto load path.
Autoloader::addAutoloadPath("aliyun-php-sdk-cdn");
// Autoloader::addAutoloadPath("aliyun-php-sdk-batchcompute");
// Autoloader::addAutoloadPath("aliyun-php-sdk-sts");
// Autoloader::addAutoloadPath("aliyun-php-sdk-push");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ram");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ubsms");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ubsms-inner");
// Autoloader::addAutoloadPath("aliyun-php-sdk-green");
// Autoloader::addAutoloadPath("aliyun-php-sdk-dm");
// Autoloader::addAutoloadPath("aliyun-php-sdk-iot");

//config http proxy   
define('ENABLE_HTTP_PROXY', FALSE);
define('HTTP_PROXY_IP', '127.0.0.1');
define('HTTP_PROXY_PORT', '8888');


Autoloader::addAutoloadPath("aliyun-php-sdk-cdn"); 

 这一句作为核心,表示自动加载aliyun-php-sdk-cdn文件夹下所有的PHP文件。aliyun-php-sdk-cdn是直播服务的SDK,若是想使用阿里云的其他功能,则需要引用其他相关的文件夹。

3、调用直播相关PHP SDK

 代码如下 复制代码


//引用config.php文件,路径根据实际情况自行定义
include_once('aliyunopenapi'.DIRECTORY_SEPARATOR.'aliyun-php-sdk-core'.DIRECTORY_SEPARATOR.'Config.php');
//$accessKeyId,$accessSecret为阿里云密钥
$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", $accessKeyId, $accessSecret);
$client = new DefaultAcsClient($iClientProfile);


//初始化直播的具体操作,DescribeLiveRecordConfigRequest是获取直播云下面,所有的创建的app

 代码如下 复制代码

$request = new Cdn\Request\V20141111\DescribeLiveRecordConfigRequest();
$request ->setDomainName('live.ezoon.cn');
$request->setAppName($appname);
$request->setOssEndpoint('oss-cn-hangzhou.aliyuncs.com');
$request->setOssBucket('liveplaybucket');
$request->setOssObjectPrefix('record/'.$appname.'/{StreamName}/{UnixTimestamp}_{Sequence}');
 
//针对阿里云进行请求
 $response = $this->client->getAcsResponse($request);

 print_r("\r\n");
 print_r($response);

 

4、查看数据返回的结果,返回的值是一个对象,里面

 代码如下 复制代码


stdClass Object
(
    [LiveAppRecordList] => stdClass Object
        (
            [LiveAppRecord] => Array
                (
                    [0] => stdClass Object
                        (
                            [CreateTime] => 2016-07-27T09:48:23Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => asfdsadfsadfafds
                            [OssObjectPrefix] => record/asfdsadfsadfafds/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [1] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T06:46:28Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => live1
                            [OssObjectPrefix] => record/live1/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [2] => stdClass Object
                        (
                            [CreateTime] => 2016-07-27T09:37:54Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => live1213123213
                            [OssObjectPrefix] => record/live1213123213/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [3] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T02:55:09Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => liveezoon
                            [OssObjectPrefix] => record/liveezoon/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [4] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T02:55:26Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => livetest
                            [OssObjectPrefix] => record/livetest/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                )

        )

    [RequestId] => 392B879D-2A09-47B3-85CF-627F7BCD3AC1
)

下面我们来看一篇关于使用 PHP 获取 Linux 系统 CPU 负载的文章,希望这篇文章能够给各位同学带来帮助,具体的细节如下所示。

最近使用 PHP 做了一个服务器负载监控的小东西,在服务器上使用 Workerman 开一个 WebSocket 服务,然后在浏览器中连接到服务。服务每隔 10 秒读取一次主机的相关信息,然后发送给客户端,客户端进行图形化显示。

总体的思路就是使用 PHP 调用 shell 命令,然后解析命令的输出内容。在获取 CPU 负载的时候,遇到了一些小问题。直观来说,直接使用 vmstat 命令就可以获取 CPU 负载,但是实际上,vmstat 命令第一行输出的从主机启动以来的平均 CPU 负载,并不是当前的负载。vmstat 命令还有一些参数,比如可以增加一个延迟参数 delay: vmstat 1,表示每秒输出一次数据,直到用户终止命令:


miroot@miserver:~$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 493644 162940 5727744    0    0     2    15    0    0  1  0 99  0
 0  4      0 568392 162952 5656868    0    0   112 15584 8807 4496 29  6 57  7
 3  0      0 567152 162952 5657416    0    0    40   116 10104 5164 28  6 65  2
 2  1      0 566368 162956 5658476    0    0    84 22220 11126 5632 29  7 58  5
 2  2      0 563320 162964 5659200    0    0    56 49240 9765 4792 21  7 53 19
 0  0      0 566464 162976 5659892    0    0    80  1212 9998 5135 26  6 59  9
 2  0      0 565400 162984 5660736    0    0    92   120 9288 4954 29  5 66  1
 ^C
miroot@miserver:~$
 
第一行数据是平均负载,从第二行数据开始,是当前的负载情况。作为监控来讲,肯定更加关注当前的负载情况。
那么,使用 PHP 调用 vmstat,当然不能使用延迟的方式来等待后续行的输出。

查了一些文档,发现在 Linux 上,系统负载的情况在 /proc/stat 这个文件中,这个文件中的内容比较多,所以我们换一个思路,采用 vmstat -s 的方式直接输出内容:


miroot@miserver:~$ vmstat -s
      8165768 K total memory
      4600664 K used memory
      1980464 K active memory
      2249908 K inactive memory
      3565104 K free memory
       232532 K buffer memory
      2972048 K swap cache
      8378364 K total swap
       253352 K used swap
      8125012 K free swap
      1170373 non-nice user cpu ticks
        25184 nice user cpu ticks
       294692 system cpu ticks
   1309152182 idle cpu ticks
      1867039 IO-wait cpu ticks
          566 IRQ cpu ticks
        76405 softirq cpu ticks
            0 stolen cpu ticks
      4601555 pages paged in
     96400000 pages paged out
         1516 pages swapped in
        67468 pages swapped out
    243751059 interrupts
    384963258 CPU context switches
   1455419401 boot time
       184668 forks
miroot@miserver:~$


可以看到,这里面包含很多和 CPU 相关的数据,实际上这个数据的来源就是 /proc/stat 文件。那么我们关心这么几项数据:


      1170373 non-nice user cpu ticks
        25184 nice user cpu ticks
       294692 system cpu ticks
   1309152182 idle cpu ticks


通过 man 5 proc 找到关于 /proc/stat 文件的说明,我们关心的是 CPU 相关数据的说明:


The  amount  of  time,  measured  in  units  of  USER_HZ  (1/100ths  of  a  second  on  most   architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system spent in various states:
user   (1) Time spent in user mode.
nice   (2) Time spent in user mode with low priority (nice).
system (3) Time spent in system mode.
idle   (4)  Time  spent  in the idle task.  This value should be USER_HZ times the second entry in the /proc/uptime pseudo-file.
 
大概的意思就是说,这些数值都是以 USER_HZ 为单位的。不管什么单位,总之他们的单位是一致的,那么我们就可以通过 2 次 vmstat -s 命令的输出来计算每个项上的增量,然后 4 个项上的增量相加就是总体的增量(其实后面还有更多关于 CPU 的数据,我们先忽略掉),然后计算每个项上的增量和总体增量的比,就是在这两次采样之间 CPU 在用户、系统和闲置状态下的负载。

参考代码如下:

 

// 在 Linux 系统上,需要使用 2 次 vmstat -s
// 结果的差值来计算两次采样之间的 CPU 占用比例
$last_cpu_ticks = array(
    0, // non-nice user cpu ticks
    0, // nice user cpu ticks
    0, // system cpu ticks
    0  // idle cpu ticks
    );
function _get_cpu_status_linux()
{
    global $last_cpu_ticks;
 
    $s = shell_exec('vmstat -s | grep cpu');
    if ($s === false) return false;
    $lines = explode("n", $s);
    if (count($lines) < 4) return false;
    $current_data = array();
    for ($i = 0; $i < 4; $i++)
    {
        $current_data[] = (int)(explode(' ', trim($lines[$i]))[0]);
    }
   
    $ret = array('user' => 0, 'sys' => 0, 'idle' => 0);
 
    if ($last_cpu_ticks[0] > 0)
    {  
        $total_delta = 0;
        foreach ($current_data as $i => $v)
            $total_delta += ($v - $last_cpu_ticks[$i]);
 
        $ret['user'] = (int)(($current_data[0] - $last_cpu_ticks[0] + $current_data[1] - $last_cpu_ticks[1]) / $total_delta * 100);
        $ret['sys'] = (int)(($current_data[2] - $last_cpu_ticks[2]) / $total_delta * 100);
        $ret['idle'] = (int)(($current_data[3] - $last_cpu_ticks[3]) / $total_delta * 100);
    }
 
    for ($i = 0; $i < 4; $i++)
        $last_cpu_ticks[$i] = $current_data[$i];
 
    return $ret;
}
 

exec函数可以运行一些系统命令了,当然许多的主机已经禁止了exec函数运行了,那么我们要如何检查到exec函数是否成功运行呢,下面来看看一篇关于此问题的测试文章。

做一个代码发布的系统,需要用到PHP的exec函数来执行Linux下的命令和git,svn命令,如何判断PHP的exec函数是否执行成功呢?

写个PHP文件来做实验:

exec函数解析

exec语法: string exec(string command, string [array], int [return_var]);
exec返回值: 字符串
Exec参数说明
Command – 需要执行的命令
Array –  是输出值
return_var –是返回值0或1,如果返回0则执行成功,返回1则执行失败。

exec函数第一个参数是执行的命令,第二个参数是执行的结果,第三个参数是执行的状态。


<?php
 
exec('ls', $log, $status);
 
print_r($log);
 
print_r($status);
 
echo PHP_EOL;

执行这个php文件:

 

这里$log,$status输出结果如图。

但是$status为0,给人的感觉是执行失败,其实不是,这是exec执行成功。

改一下这个php文件,给exec第一个参数一个错误的命令。

如:exec(‘lsaa’,$log,$status).

再次执行,运行结果如图:

 

这里$status确是有值的。

那么证明$status为0的时候表示exec执行是成功的。这里PHP官方手册上并没有明确说明。

最终这个执行命令的方法如下:

PHP exec执行命令PHP

public function runLocalCommand($command) {
    $command = trim($command);
    $status = 1;
    $log = '';
    exec($command . ' 2>&1', $log, $status);
    // 执行过的命令
    $this->command = $command;
    // 执行的状态
    $this->status = !$status;
    return $this->status;
}
去除了日志记录和其他的判断。

注意这里:

$this->status = !$status;
返回状态的时候取相反的值!

[!--infotagslink--]

相关文章

  • Laravel4安装配置的方法

    如果我们需要安培Laravel4的话最php最低要求要在php5.3.7版本并且我们需要把mcrypt与openss这两个扩展开启才可以,具体步骤我们参考下文。 前面我们介绍我了 com...2016-11-25
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • Laravel 调试工具 laravel-debugbar 打印日志消息

    laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。 其实不...2016-11-25
  • Laravel 5.1中定义事件、事件监听器以及触发事件例子

    下文我们来看一篇关于Laravel 5.1中定义事件、事件监听器以及触发事件例子,希望能够帮助到各位新手朋友的哦。 这里我们基于之前基于模型+缓存对文章增删改查这篇...2016-11-25
  • Node调试工具JSHint的安装及配置教程

    现在我们介绍一种在Node下检查简单错误的JS代码验证工具JSHint。  JSHint的具体介绍参考http://www.jshint.com/about/,说直白点儿,JSHint就是一个检查JS代码规范与否的工具,它可以用来检查任何(包括server端和client端...2014-05-31
  • Powershell 查询 Windows 日志的方法

    这篇文章主要介绍了Powershell 查询 Windows 日志的方法,需要的朋友可以参考下...2020-06-30
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • JavaScrip调试技巧之断点调试

    首先,在各个浏览器中,断点调试支持的最好的当然是Firefox,Firefox不仅可以使用Firebug调试页面js脚本,还可以用高级调试工具例如JavaScript Debugger (Venkman) 来调试Firefox扩展里的js。除此之外,Firefox还支持一些更为...2015-10-23
  • C#客户端程序Visual Studio远程调试的方法详解

    这篇文章主要给大家介绍了关于C#客户端程序Visual Studio远程调试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • idea 无法debug调试的解决方案

    这篇文章主要介绍了idea 无法debug调试的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-09
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • 搭建php Laravel框架教程详解

    Laravel框架我们用到的不多了,但如果使用需要搭配了,下面我们来看一篇关于搭建php Laravel框架教程详解,具体的操作细节如下所示,希望对各位有帮助。 一、安装 Compos...2016-11-25
  • c# 代码调试技巧和如何远程调试

    这篇文章主要介绍了c# 代码调试技巧和如何远程调试,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...2020-12-08
  • c# 用Dictionary实现日志数据批量插入

    这篇文章主要介绍了c# 用Dictionary实现日志数据批量插入的步骤,帮助大家更好的理解和使用c#中的Dictionary类,感兴趣的朋友可以了解下...2021-02-01
  • C#3.0使用EventLog类写Windows事件日志的方法

    这篇文章主要介绍了C#3.0使用EventLog类写Windows事件日志的方法,以简单实例形式分析了C#写windows事件日志的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Java SSM框架如何添加写日志功能

    这篇文章主要介绍了Java SSM框架如何添加写日志功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-25
  • c#快速写本地日志方法

    下面小编就为大家分享一篇c#快速写本地日志方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • sql server日志处理不当造成的隐患详解

    这篇文章主要给大家介绍了关于sql server日志处理不当造成的隐患的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
  • Android Studio真机无线连接USB设备调试运行详解流程

    你在Android Studio写app时是否也有想过如果可以不用数据线连接手机调试运行就好了?如果需要取出数据线插接的话我肯定是嫌麻烦的,但是模拟器有时候需要测试一些需要硬件支持的功能时又不管用,所以最好的测试还是在真机上,本篇教你扔掉数据线来无线调试...2021-11-04
  • Nginx访问日志及错误日志参数说明

    这篇文章主要介绍了Nginx访问日志及错误日志参数说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-14