PHP中CLI命令行模式接受参数的方法

 更新时间:2016年11月25日 16:46  点击:1414
PHP CLI模式开发不需要任何一种Web服务器(包括Apache或MS IIS等),这样,CLI可以运行在各种场合,下面我就来简单的介绍一下php cli命令的用法。

PHP CLI(命令行模式下)接受参数有多种方法:

(1)使用$argv接受参数

<?php
 

 代码如下 复制代码
//变量仅在 register_argc_argv 打开时可用。
print_r($argc); //CLI下获取参数的数目,最小值为1
print_r($argv); //CLI下传递给脚本的参数数组,第一个参数总是当前脚本的文件名,因此 $argv[0] 就是脚本文件名。


 结果:

 

PHP中CLI命令行模式接受参数的方法


PHP CLI下接受参数的几种方法(2)使用getopt()函数获取参数

<?php
 

 代码如下 复制代码
//获取 -a -b -c参数
$args = getopt('a:b:c:');
print_r($args);


执行结果:

PHP中CLI命令行模式接受参数的方法


使用getopt获取cli参数

今天在php直接使用date函数会发现提示date(): It is not safe to rely...错误了,提示是不是一个安全的用法,那么要如何解决此问题呢。


在PHP代码中调用date函数时,在日志里看到如下报错

PHP Warning:  date(): It is not safe to rely on the system's timezone settings.
You are *required* to use the date.timezone setting or the date_default_timezone_set() function.
In case you used any of those methods and you are still getting this warning,
you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead

为什么会出现这样的报错?

从 PHP 5.1.0 引用了时区设置(date.timezone),但其默认又是关闭的,所以使用date()等函数时,都会产生E_NOTICE 或者 E_WARNING 信息。

处理方法1

在调用date前加入下代码


在页头加入代码:ate_default_timezone_set("PRC");
在页头加入代码:ini_set('date.timezone','注释:RPC');
在php.ini中启用date.timezone设置并设置其值:date.timezone=PRC,并重启apache;

注释:RPC代表中华人民共和国。

今天发现在php5.4使用date函数时提示PHP Warning: date() [function.date]: It is not safe to rely on the system’s timezone错误,但在php5.2中没有任何问题啊,那是怎么一回事呢?

在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个
“PHP Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings.
You are *required* to use the date.timezone setting or the date_default_timezone_set() function.
In case you used any of those methods and you are still getting this warning, you most likely
misspelled the timezone identifier. We selected ‘UTC’ for ’8.0/no DST’ instead in”
这样的错。如何解决呢
 
实际上,从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会
产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0中,date.timezone这个选项,默认情况下是关闭的,无
论用什么php命令都是格林威治标准时间,但是PHP5.3中好像如果没有设置也会强行抛出了这个错误的,解决此问
题,只要本地化一下,就行了。
以下是三种方法(任选一种都行):
一、在页头使用date_default_timezone_set()设置 date_default_timezone_set(‘PRC’); //东八时区 echo
date(‘Y-m-d H:i:s’);
 
二、在页头使用 ini_set(‘date.timezone’,'Asia/Shanghai’);
 
三、修改php.ini。打开php5.ini查找date.timezone 去掉前面的分号修改成为:date.timezone =PRC
重启http服务(如apache2或iis等)即可。
XXX可以任意正确的值。对于我们国内来说:可以为以下值:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi
(依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门
,香港,台北),还有新加坡:Asia/Singapore,当然PRC也行。

总结,原来在php5.3之前的版本对日期没有严格的限制所以就是我日期设置不正确也没有问题,但在php5.3之后就不行了哦。

本文章介绍的call_user_func是PHP的内置函数,该函数允许用户调用直接写的函数并传入一定的参数,而call_user_func_array用一个数组作为参数调用一个回调函数 返回值为回调函数执行的结果或者为false,要传递参数给函数,作为一个索引数组。

call_user_func() 函数类似于一种特别的调用函数的方法,使用方法如下:

 代码如下 复制代码

 
function test($a, $b) {
    echo $a*$b;
}
call_user_func('test', 4, 5);
//---- echo 20 ----//

函数第一个参数为用户自定义函数,第二个参数为自定义函数中的参数。

调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:

 

 代码如下 复制代码

class test {
    function demo($param) {
        echo $param;
    }
}
call_user_func(array("test", "demo"), "this is output result!");
//--- echo this is output result! ---//

call_user_func_array()函数和call_user_func()很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:

 

 代码如下 复制代码

function test($b, $c) {
    echo $b;
    echo $c;
}
call_user_func_array('test', array("a", "b"));
//------echo ab ---------//

call_user_func_array()函数也可以调用类内部的方法的

 

 代码如下 复制代码

class class_demo {
    function fun_demo($param1, $param2) {
        echo $param1 + $param2;
    }
}
call_user_func_array(array('class_demo', 'fun_demo'), array("1", "2"));
//---- echo 3 -----//

这里只是说了函数的使用方法。具体的事例可以在网上找找。

 代码如下 复制代码

<?php
function debug($var, $val)
{
    echo "***DEBUGGINGnVARIABLE: $varnVALUE:";
    if (is_array($val) || is_object($val) || is_resource($val)) {
        print_r($val);
    } else {
        echo "n$valn";
    }
    echo "***n";
}

$c = mysql_connect();
$host = $_SERVER["SERVER_NAME"];

call_user_func_array('debug', array("host", $host));
call_user_func_array('debug', array("c", $c));
call_user_func_array('debug', array("_POST", $_POST));
?>

在PHP利用Header函数跳转时需会碰到一些无法跳转的问题,这里一聚教程小编总结了常见的三种导致无法跳转的例子与解决方法给各位,希望此例子对大家带来帮助。

在通过php的header('Location:http://www.111cn.net')做跳转时.有时会不成功.追其原因有以下几种情况:

写法错误

•location和“:”号间不能有空格,否则会出错。

•在用header()前不能有任何的输出。

•header后的PHP代码还会被执行,所以在函数之前最好加上exit()来停止之后程序的执行

另外还有一个问题,算是比较低级了


编码报错

 代码如下 复制代码

<?php
 header("location:http://www.111cn.net/");
?>

要求header前没有任何输出,否则会报错。

当我们以 ANSI 格式编码时(多数默认情况),可以正常实现PHP跳转。

 代码如下 复制代码
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

有时我们需要在网页中事先判断跳转条件,如果符合则正常显示网页,而网页是以 UTF-8 格式编码,此时使用header则会报错。
原因是 UTF-8 编码在文本开始处偷偷地输出了三个字符(BOM),默认对我们不可见。因此不满足“header前没有任何输出”的条件,从而报错。

 
解决方法是使用Notepad++等文本编辑器打开文件,转为 UTF-8 无 BOM 编码格式,保存退出即可。

PHP header 默认302临时重定向,如需要使用301永久重定向,可使用以下代码。

 代码如下 复制代码
<?php
 header("HTTP/1.1 301 Moved Permanently");
 header("Location: http://feitsui.net/");
?>

如果不关注HTTP状态,可以使用JavaScript实现跳转。

 代码如下 复制代码

<script type="text/javascript">
 window.location.href="http://www.111cn.net/";
</script>

三,顺序问题

 代码如下 复制代码

<?php
if(1){
    header("Location:http://www.baidu.com/");
}
    header("Location:01.php");
    header("Location:03.php");
    header("Location:http://www.sina.com");
    echo "111";
    header("Location:http://www.g.cn");
    echo "222";
    header("Location:http://www.163.cn");
    echo "333";
?>

如上代码为什么不跳转到header("Location:http://www.baidu.com/");?

另外一个问题服务器读PHP文件,是读一点发送给客户端一点,还是一次读完后,才发送给客户.Javascript是怎么个读法?

 php脚本是从上往下是顺序读的,在服务器端一次性读完以后发给客户端,这个文件,当读到if时本应该发送header("Location:http://www.baidu.com/");但是下面还有header("Location:01.php");
header("Location:03.php");
header("Location:http://www.sina.com");就会继续读到最后一条而echo的优先级低于低于header,当很多个header并列时就会把最后一条显示,就像显示数组一样,$forum[],当你写 echo $forum就只会把数组中的最后一条记录显示。javascript是客户端脚本,当你的页面下载后以后所有的javascript脚本文件就已经在你的电脑里面了,只有对其操作时才会有响应。

[!--infotagslink--]

相关文章

  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • Linux中grep命令详解

    grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
  • C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
  • PHP实现连接设备、通讯和发送命令的方法

    本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • 查看Redis内存信息的命令

    Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。...2021-01-15
  • C#命令行编译器配置方法

    这篇文章主要介绍了C#命令行编译器配置方法,本文讲解了配置C#命令行编译器、配置其它.NET命令行工具、通过csc命令行编译器来编译C#文件实例等内容,需要的朋友可以参考下...2020-06-25
  • 解决jmap命令打印JVM堆信息异常的问题

    这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • MySQL的常用命令集锦

    下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL服务器,是在mysql客户端执行mysql命令。 登录MySQL,如果连接远程数据库,需要用-h指定hostname。登...2015-11-24
  • shell脚本批量复制及执行命令的示例详解

    这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • 如何使用Swift来实现一个命令行工具的方法

    这篇文章主要介绍了如何使用Swift来实现一个命令行工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • C#实现的调用DOS命令操作类实例

    这篇文章主要介绍了C#实现的调用DOS命令操作类,实例分析了C#调用系统常用DOS命令的相关技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • 一条命令重启所有已停止的docker容器操作

    这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • 在docker中执行linux shell命令的操作

    这篇文章主要介绍了在docker中执行linux shell命令的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-30
  • Redis Scan命令的基本使用方法

    这篇文章主要给大家介绍了关于Redis中Scan命令的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-01-15
  • Jmeter如何基于命令行运行jmx脚本

    这篇文章主要介绍了Jmeter如何基于命令行运行jmx脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-22
  • Redis常用数据类型命令实例汇总

    这篇文章主要介绍了Redis常用数据类型命令实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-01-15
  • MySQL中的binlog相关命令和恢复技巧

    操作命令:复制代码 代码如下:show binlog events in 'mysql-bin.000016' limit 10;reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件show master logs; 或者 show binary logs; 查看二进制文...2014-05-31
  • 基于命令行执行带参数的php脚本并取得参数的方法

    这篇文章主要介绍了基于命令行执行带参数的php脚本并取得参数的方法,分析了命令行运行PHP代码的原理、用法与相关注意事项,需要的朋友可以参考下...2016-01-26