PHP CLI模式开发不须要任何一种Web服务器(包括Apache或MS IIS等),这样,CLI能够运行在各类场合。
有两种方法能够运行PHP CLI脚本。php
第一种方法是使用 # php /path/to/yourFile.php 调用PHP CLI解释器,并给脚本传递参数。这种方法要指定php解释器的路径。
第二种方法是首先运行chmod +x <要运行的脚本文件名>(UNIX/Linux环境),将该PHP文件置为可执行权限,而后在CLI脚本头部第一行加入声明(相似于#! /usr/bin/php 或 PHP CLI 解释器位置),接着在命令行直接执行。html
1、从命令行上读取参数
若是想从命令行获取参数,CLI能够从 $_SERVER['argv'] 和 $_SERVER['argc'] 取得参数的值和参数个数。
咱们创建一个文件,名字为 cliPHP1.php 脚本代码以下:数组
#! /usr/local/php/bin/php -q <?php /** * PHP CLI带有两个特殊的变量,专门用来达到这个目的: * 一个是 $_SERVER['argv'] 变量,它经过命令行把传递给PHP脚本的参数保存为单独的数组元素; * 另外一是 $_SERVER['argc'] 变量,它用来保存$_SERVER['argv']数组里元素的个数。 * * * 运行效果: * # /usr/local/php/bin/php ./cliPHP1.php aa bb cc * Array * ( * [0] => ./cliPHP1.php ---> 0 指当前脚本名称 * [1] => aa --------------> 1 第1个参数 * [2] => bb --------------> 2 第2个参数 * [3] => cc --------------> n 第n个参数 * ) * number: 4 -----------------> 参数数量 * */ ini_set('error_reporting', 'E_ALL & ~E_NOTICE'); //设置错误报告模式 $argv = $_SERVER['argv']; //获取参数(array 数组) $argc = $_SERVER['argc']; //获取参数数量(integer 整数) print_r($argv); echo 'number: '.$argc; echo "\r\n"; ?>
2、处理I/O通道
PHP最初设计不是用于与用户直接的键盘输入或文本输出结合使用。了解这一设计是相当重要的,由于若是须要在命令行中执行任何操做,都必须可以与用户来回通讯。
输入输出(I/O)通道这个思想来源于UNIX系统,UNIX系统提供3个文件句柄,用以从一个应用程序及用户终端发送和接收数据。服务器
咱们能够把一个脚本的输出重定向到一个文件,例如:
# php world.php > outputfile编辑器
若是是在UNIX系统下,也能够使用通道定向到另外一个命令或应用程序中。例如:
# php world.php | sortspa
在PHP 5 CLI中,有一个文件流句柄,能够使用3个系统常量,分别为 STDIN、 STDOUT 和 STDERR。下面咱们分别介绍。命令行
(1) STDIN
STDIN 全称为 standard in 或 standard input 标准输入能够从终端取得任何数据。设计
(2) STDOUT
STDOUT 全称为 standard out 或 standard output 标准输出能够直接输出到屏幕(也能够输出到其余程序,使用STDIN取得),若是在PHP CLI模式里使用print或echo语句,则这些数据将发送到STDOUT。code
(3) STDERR
STDERR 全称为 standard error 在默认状况下会直接发送至用户终端,当使用STDIN文件句柄从其余应用程序没有读取到数据时会生成一个“stdin.stderr”。server
咱们创建一个文件,名字为 cliPHP2.php 脚本代码以下:
#! /usr/local/php/bin/php -q <?php /** * 本例是一个CLI与用户交互脚本,让其输出用户名与年龄并输出 * 标准输出: fwrite(STDOUT,'请输出用户名:') //输出内容 * 标准输入: fgets(STDIN) //获取用户输入的内容 * 标准错误输出: fwrite(STDERR,'错误:xxxxx') //输出错误信息 * * 运行效果: * [root@zzx tmp]# /usr/local/php/bin/php /wwwroot/test/httpsqs/cliPHP.php * Enter your name: * Enter your name:zhangsan * Enter your age:abc * Notice: age must be an integer,try again! * Enter your age:aaa * Notice: age must be an integer,try again! * Enter your age:22 * Hello zhangsan, your age is 22 */ $name = ''; $age = ''; while(true){ fwrite(STDOUT,"Enter your name:"); //标准输出,等待用户输入用户名 $name = trim(fgets(STDIN)); //标准输入,当即获取用户名 if(!empty($name)){ break 1; } } while(true){ fwrite(STDOUT,"Enter your age:"); $age = trim(fgets(STDIN)); if(empty($age)){ continue 1; } $matchNum = preg_match('/^\d+$/',$age); //验证整型,获取匹配次数 if($matchNum == 0){ fwrite(STDERR,"Notice: age must be an integer,try again!\r\n"); }else{ break 1; } } //do something here... $outStr = "Hello $name, your age is $age"; fwrite(STDOUT,$outStr); echo "\n\n"; ?>
3、用 nohup 后台运行CLI
若是正在运行一个进程,并且在退出帐户时该进程还不会结束,即在系统后台或背景下运行,那么就能够使用nohup命令。该命令能够在退出帐户以后继续运行相应的进程。
nohup在英文中就是不挂起的意思(no hang up)。该命令的通常形式为:
# nohup <脚本名.php> &
使用nohup命令提交做业,在默认状况下该做业的全部输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件:
# nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt & 将标准输出重定向到log.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt 2>/tmp/err.txt & 将标准输出重定向到/tmp/log.txt 错误输出重定向到/tmp/err.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/tmp/log.txt 2>&1 & 将标准输出重定向到/tmp/log.txt 而后再将标准错误输出重定向到标准输出,即:二者一块儿重定向到/tmp/log.txt # nohup /usr/local/php/bin/php ./scriptName.php 1>/dev/null 2>&1 & 将标准输出和错误输出一块儿到重定向到/dev/null
这样,PHP CLI脚本执行后的结果将输出到log.txt中,咱们能够使用tail命令动态查看内容:
# tail -f -n20 /tmp/log.txt
如今再来实现一个例子,是每隔10秒钟自动生成一个静态HTML文件,并一直执行下去。脚本代码以下:
脚本名称: cliPHP3.php
#! /usr/local/php/bin/php -q <?php /** * 本例是每隔10秒钟自动生成一个静态HTML文件,并一直执行下去 */ while(true){ file_put_contents("/tmp/article_".time().".html",date('Y-m-d H:i:s')); sleep(10); //10秒 (单位: 秒) //usleep(1000000 * 0.5); //0.5秒(单位: 微秒 注: 1000000微秒=1秒) } ?>
保存而且退出vi编辑器,而后赋予 genHTML.php 文件可执行权限,并执行(在Linux命令行下执行脚本建议写绝对路径,这是良好习惯):
# chmod 755 cliPHP3.php
# nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php 1>/dev/null 2>&1 &
执行上述命令后出现以下提示:[2] 3300
在当前会话下,使用jobs命令能够查看全部后台运行的全部进程:
# jobs
[1]- Running nohup /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php > /opt/httpsqs/data/log.txt 2> /opt/httpsqs/data/err.txt &
[2]+ Running nohup /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php > /dev/null 2>&1 &
如何终止CLI程序的后台运行呢?
使用 # ps aux 可查看当前系统全部进程,使用grep过滤选项便可,以下:
# ps aux | grep php
root 3227 0.1 1.6 106796 8408 pts/3 S 06:03 0:02 /usr/local/php/bin/php /wwwroot/httpsqs/usage_server.php
root 3300 0.0 1.5 106796 8080 pts/3 S 06:39 0:00 /usr/local/php/bin/php /wwwroot/httpsqs/cliPHP3.php
root 3312 0.0 0.1 5980 744 pts/4 S+ 06:41 0:00 grep php
可以轻松找到 /wwwroot/httpsqs/cliPHP3.php 对应的PID为3300,使用kill命令杀死进程便可:# kill 3300