PHP编程之从CLI运行模式与HTTP协议的差异

用户在浏览网站时,他对网站的请求,经过Nginx流转后进入PHP-FPM执行。在这个过程中,在客户端与服务端之间通讯的协议是HTTP协议,关于这一点,已经是众所周知的了。与网站开发的很多知识和技术,例如COOKIE、会话、HTTP请求和响应的头部信息、HTML模板的渲染与输出等,我们都已经耳熟能详,以致于我们会不加考虑潜意识地使用这些技术,不管当前上下文场景如何。

可以说,在HTTP协议里的技术,到了CLI命令行运行模式就会出现水土不服的情况。显然,对于CLI下的PHP脚本,是没有COOKIE可言的,也没有Session会话,如果我们设置了头部信息,在命令行终端上就会看到相应的错误或警告提示。例如,在COOKIE中添加值为CLI,名称为mode的PHP代码是:

setcookie('mode', 'CLI');

通过浏览器访问,可以成功响应,并且在响应头部可以看到以下响应报文内容。

Cookie: mode=CLI

但是,如果在命令行终端执行,则会提示类似以下的警告。

PHP Warning: Cannot modify header information – headers already sent by (output started at ……

HTTP协议使用的是HTML标签对内容进行包装,但在控制台上,输出一堆这些嵌套的HTML标签则不合时宜。控制台上,更注意的是原始的文本内容输出,其中又涉及到换行符号的问题,尽量使用PHP_EOL换行变量,而不是固定写死\n 或\r\n 。而控制台的输出又可细分为标准输出和错误输出,在PHP脚本中,进行标准输出大家都知道,使用echo()、var_dump()、print()、print_r()等函数即可。例如经典的Hello World代码。

如果想进行错误输出,可以使用error_log()函数。例如:

你猜猜在哪里可以看到这段错误提示?

把脚本执行的结果保存到err_log.log日志文件后,控制台的屏幕输出就剩下错误日志部分了。这时,查看err_log.log文件,里面的内容是:

$ cat ./err_log.log
错误日记之前……
错误日记之后……

这样就标准输出和错误输出区分开来了。如果想把错误输出也保存到日志文件呢?可以这样:
$ php ./err_log.php > ./err_log.log 2>&1
在命令执行的最后,追加2>&1 ,其中2表示错误输出,1表示标准输出(顺便说一下,0表示标准输入),意思是把错误输出的结果也重定向到标准输出那里。这时执行PHP脚本在屏幕上不会再有任何输出,取而代之,在err_log.log则会包括错误输出和标准输出。

顺便延伸一下,如果希望日志文件在每次执行后都能追加执行结果,而不是每次都被最新的覆盖,则可以使用两个破折号,即:

$ php ./err_log.php >> ./err_log.log 2>&1

这些都是Linux操作系统命令的基本使用。

对于控制台的输出,还有一件有趣的事情是对屏幕字体颜色的控制,当然也可以包括字体背景颜色的控制。针对字体颜色的设置,可以参考以下实现函数。

<?php

function colorfulString($text, $type = NULL) {
    $colors = array(
        'WARNING'   => '1;33',
        'NOTE'      => '1;36',
        'SUCCESS'   => '1;32',
        'FAILURE'   => '1;35',
    );

    if (empty($type) || !isset($colors[$type])){
        return $text;
    }

    return "\033[" . $colors[$type] . "m" . $text . "\033[0m";
}

然后,调用colorfulString(),就可以输出四种不同颜色的字段。当然,也可以追加更多颜色的配置。

echo colorfulString('警告 - 黄色' . PHP_EOL, 'WARNING');
echo colorfulString('提示 - 蓝色' . PHP_EOL, 'NOTE');
echo colorfulString('成功 - 绿色' . PHP_EOL, 'SUCCESS');
echo colorfulString('失败 - 紫色' . PHP_EOL, 'FAILURE');

以上的PHP脚本实现效果,转换成shell脚本命令,等效的处理方式,简单实现如下:

#!/bin/bash

## 四种不同的颜色
WARNING='\033[1;33m'
NOTE='\033[1;36m'
SUCCESS='\033[1;32m'
FAILURE='\033[1;35m'
RES='\033[0m'

echo -e "${WARNING}警告 - 黄色${RES}"
echo -e "${NOTE}提示 - 蓝色${RES}"
echo -e "${SUCCESS}成功 - 绿色${RES}"
echo -e "${FAILURE}失败 - 紫色${RES}"

执行此shell脚本,也可以实现前面对字体的颜色设置效果。说到PHP脚本和shell命令,这两者之间如果能有效地结合,可以发挥强大而积极的作用和影响。

发表评论