php cli模式学习(PHP命令行模式)

php_cli模式简介

php-cli是php Command Line Interface的简称,如同它名字的意思,就是php在命令行运行的接口,区别于在Web服务器上运行的php环境(php-cgi, isapi等) 也就是说,php不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端!——注:windows和linux下都支持php_cli模式

PHP-cli应用场景:

1.多线程应用
这方面的好处,引用鸟哥的话:

优点:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源
2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

php的多线程—没错就是php多线程应用,虽然大家都普遍认为php没有多线程(curl属于模拟多线程而不是真实的),但是在php_cli模式下的php彻底的是属于多线程。这个时候php属于linux的一个守护进程。 在本人之前写过的《PHP多线程批量采集下载美女图片(续)》的时候在采集程序里虽然使用curl来模拟多线程,但是在浏览器执行的时候也是会遇到执行超时或内存abort而导致程序中断,(要尝试几次才可以彻底成功),但是如果在php-cli模式下执行,你就会发现这个程序执行的很快,php多线程执行的优势被彻底表现出来了.

备注:这种多线程方式不是很成熟,不适合大规模的生成应用,偶尔使用还是可以的

2.定时执行php程序

之前本人总结关于《PHP定时执行计划任务》的三种方式,利用有一张就是利用linux的cron方式,那么这个方式是如何定时执行php程序?请看下文

3.开发桌面程序

你可以做您的Windows或Linux中使用PHP的图形用户界面(GUI)应用!所有你需要的是PHP的命令行接口和一包GTK。这将允许建立真正的便携式图形用户界面应用程序(呵呵,之前只是知道php可以做桌面程序,现在才知道是使用php_cli模式),并且不需要学习别的。

4.编写PHP的shell脚本
如果你不会bash shell或者Perl等的使用,但是你又需要一些脚本去执行的时候,怎么办?这个时候你完全可以使用你熟悉的php编写shell脚本,这个时候你是不是突然感觉PHP是不是太强大了!—–真正做到一种语言,到处开发!

PHP_CLI使用方法

win下面的执行方法:
假设php.exe 在D:xamppphp在dos命令在可以这个执行:

代码如下:

D:\xamppphpphp.exe D:\xampphtdocstest.php

就可以执行test.php这个文件了 。这里推荐win平台下xampp集成环境,真正比wamp强大N倍,这个集成包可以直接进入dos模式。

linux下php_cli使用
首先找到你安装php的路径,以我为例:

php安装在路径/usr/local/php/bin/php下

代码如下:

/usr/local/php/bin/php /usr/local/apache/htdocs/a.php

就可以执行a。php文件

PHP_CLI编程需知
如何检测环境支持php_cli模式?

代码如下:

<?php
//方法1
if (PHP_SAPI === 'cli')
{
   // ...
}
//方法2
if (php_sapi_name() === 'cli')
{
   // ...
}

PHP_ClI如何接收参数?
默认情况下/usr/local/php/bin/php接收参数是$argv,这个变量是固定的!在php文件中var_dump($argv);

得到下面结果:

可以写个简单的处理函数把这个方式转化为大家常用的GET/post的参数模式。

简单代码:


代码如下:

<?php
function parseArgs($argv){
array_shift($argv);
$out = array();
foreach ($argv as $arg){
if (substr($arg,0,2) == '--'){
$eqPos = strpos($arg,'=');
if ($eqPos === false){
$key = substr($arg,2);
$out[$key] = isset($out[$key]) ? $out[$key] : true;
} else {
$key = substr($arg,2,$eqPos-2);
$out[$key] = substr($arg,$eqPos+1);
}
} else if (substr($arg,0,1) == '-'){
if (substr($arg,2,1) == '='){
$key = substr($arg,1,1);
$out[$key] = substr($arg,3);
} else {
$chars = str_split(substr($arg,1));
foreach ($chars as $char){
$key = $char;
$out[$key] = isset($out[$key]) ? $out[$key] : true;
}
}
} else {
$out[] = $arg;
}
}
return $out;
}
var_dump($argv);
var_dump(parseArgs($argv));exit;

执行结果:

当然实现的方法不止一个,大家可以尝试其他方法实现!

例外关于php的cli还有很多参数可以加入:具体可以参考:http://php.net/manual/en/features.commandline.php

关于定时执行
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业,周期性作业,比如备份数据 打开/etc/crontab,添加:

代码如下:

/usr/bin/php -f /data/htdocs/test.php

关于corntab的详细使用参考51cto专题:Linux计划任务——cron服务

本文参考资料
http://www.jb51.net/article/1716.htm 
http://www.jb51.net/article/37804.htm 
http://www.jb51.net/article/37796.htm

附注:2012-06-16 增加php_cli编程需知等

(0)

相关推荐

  • php cli模式下获取参数的方法

    PHP在cli模式下接收参数有两种方法 1.使用argv数组 2.使用getopt方法 1.使用argv数组 例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, limit=5) 创建test.php <?php print_r($argv); ?> 在命令行执行 php test.php news 1 5 输出: Array ( [0] => test.php [1] => news [2] => 1 [3] => 5 ) 可以看到ar

  • PHP CLI模式下的多进程应用分析

    PHP在很多时候不适合做常驻的SHELL进程, 他没有专门的gc例程, 也没有有效的内存管理途径. 所以如果用PHP做常驻SHELL, 你会经常被内存耗尽导致abort而unhappy. 而且, 如果输入数据非法, 而脚本没有检测, 导致abort, 也会让你很不开心. 那? 怎么办呢? 多进程-. 为什么呢? 优点: 1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3. 一个常驻主进程, 只

  • ThinkPHP在Cli模式下使用模板引擎的方法

    本文实例讲述了ThinkPHP在Cli模式下使用模板引擎的方法.分享给大家供大家参考.具体如下: 关于Cli模式与模版引擎,2.1中的手册是这样说明的: Cli模式默认不使用任何模板引擎(可以自己在操作方法里面调用): 但是怎么调用,手册中没有提到.于是自己动手丰衣足食. 在介绍怎么调用之前,简单的说说什么情况可能需要用到模块引擎: 1. 利用dompdf在计划任务自动生成PDF或HTML报告 2. 计划任务发送HTML类型的邮件 3. 后台自动生成静态页面 4. 其他关于模板的后台操作 <?p

  • 利用php-cli和任务计划实现刷新token功能的方法

    1.业务需求 需要实现这样一个功能:在第三方授权的认证当中,在用户首次登录授权我们会得到一个access_token,有效期为25小时,还会得到一个refresh_token,有效期为30天. 我们只要保存好这个refresh_token,在30天内我们都可以用这个refresh_token去请求一个api,他会返回一个新的access_token.这样我们只需要让用户授权一次,我们就可以获得长达30天的一个授权期限. 这里可以分为几个点: <1>这个应该是要定期执行的一个任务. 25小时才会

  • 通过PHP CLI实现简单的数据库实时监控调度

    要实现的功能:监控user表,若有新纪录增加,将其向user2表中添加.(实际应用上可以引深一些,例如对数据进行相关处理等) 下面是PHP代码(dbtest.php) 复制代码 代码如下: !#/usr/local/php/bin/php <?php mysql_connect('localhost', 'username', 'password'); mysql_select_db("test"); echo 'PID: '.posix_getpid().' '; //当前进程

  • php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法

    在php命令行下执行.php文件时,执行环境的工作目录(getcwd( ))是php命令程序(php.exe)所在目录,所以如果想在文件内使用相对路径时,要先切换当前的工作目录才行. 小测试程序: 复制代码 代码如下: <?php  $oldpath = getcwd();    // 原始工作目录 php.exe所在目录  $path = dirname(__FILE__);     chdir($path);           // 切换工作目录为当前文件所在目录  $fpath = &quo

  • php命令行(cli)模式下报require 加载路径错误的解决方法

    今天,同事突然告诉我,我写的一个做计划任务的php脚本执行总是不成功. 脚本本身很简单,里面只有包含了几个库文件并执行了一个函数,函数应该没有错误,这个函数在别处也调用过,没有问题.我在本地用浏览器访问页面,执行成功,看来没有问题,我有点怀疑是同事的计划任务的问题.我又打开命令行,用php直接执行脚本,这回报错了,是require 包含文件错误,看来是路径不对. 不明白是什么原因引起的,只是从报错来看是路径不对,我猜测是跟相对路径有关,于是把相对路径的全部改成绝对路径,再执行,问题解决. 在百度

  • 利用php-cli和任务计划实现订单同步功能的方法

    1.应用场景 用户的订单情况,需要我们去平台网站通过API获取.有两个要点: (1)用户遍历,我们必须遍历每个用户,去获取他们的订单: (2)定时获取,获取用户订单不是一劳永逸的,现在没有不代表下一秒没有,我们必须设定一个合适的时间间隔去获取他. 2.通过遍历表来实现用户遍历 用户遍历的问题,我们可以通过把所有用户放在一个表里,并且表里有一个自增id,我们计算出id的最大值,然后从0开始循环取id等于指定值的行出来,这样可以实现遍历整个表 3.定时获取的方法探讨 (1)用死循环不断执行fetch

  • php-cli简介(不会Shell语言一样用Shell)

    1.基础知识 1.1 什么是Shell编程? 在 Unix 中,shell 可不是简单的命令解释器(典型的有 Windows 中的 DOS ),而是一个全功能的编程环境.Shell 是操作系统的一部分,用来与用户打交道,并且可以用来协调各个命令[1].用Shell编程可以灵活地解决大量重复任务,十分方便.但是,Shell的语法十分怪异(个人意见),不容易记,如果现在熟悉的语言可以用来写shell那就好了--比如php--就可以快速开发Shell程序了(比如我的Preminder的后台程序),于是

  • php cli 方式 在crotab中运行解决

    复制代码 代码如下: /var/www/html/bt/e/BtSys:.:/usr/share/pear:/usr/share/phpPHP Warning: require(../class/connect.php): failed to open stream: No such file or directory in /var/www/html/bt/e/BtSys/torrents-scrape.php on line 17 PHP Fatal error: require(): Fa

随机推荐