热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP基础:CLI模式开发不需要任何一种Web服务器

PHPCLI模式开发不需要任何一种Web服务器(包括Apache或MSIIS等),这样,CLI可以运行在各种场合。有两种方法可以运行PHPCLI脚本。

PHP CLI模式开发不需要任何一种Web服务器(包括Apache或MS IIS等),这样,CLI可以运行在各种场合。 
有两种方法可以运行PHP CLI脚本。

第一种方法是使用php -f /path/to/yourfile.php。调用PHP CLI解释器,并给脚本传递参数。这种方法首先要设置php解释器的路径,Windows平台在运行CLI之前,需设置类似path c:\php的命令,也失去了CLI脚本第一行的意义,因此不建议使用该方法。

第二种方法是首先运行chmod+x <要运行的脚本文件名>(UNIX/Linux环境),将该PHP文件置为可执行权限,然后在CLI脚本头部第一行加入声明(类似于#! /usr/bin/php或PHP CLI解释器位置),接着在命令行直接执行。这是CLI首选方法,建议采用。

下面我们来看看怎样编写PHP CLI脚本。

1.编写第一个CLI脚本 1
首先创建一个名为myfile.php的PHP脚本,用于运行PHP CLI。该脚本很简单,仅显示“你好 PHP CLI!”。该脚本代码如下:

#!/usr/local/bin/php –q 不要忘了给该文件设置为可执行的权限:$ chmod 755 myfile.php然后直接输入以下命令,按回车键即可以运行:$ ./myfile.php 如果要在Windows系统下运行该脚本,则不需要设置文件属性,可以直接运行该脚本。Microsoft Windows [版本 6.0.6000] 版权所有 (C) 2006 Microsoft Corporation。保留所有权利。C:\ >myfile.php你好 PHP CLI!

再重申一次:如果在Windows平台,CLI脚本的第一行一定要写正确php.exe所在的位置,像这样(另外,如果要在CLI脚本中加注释语句,则要把注释写在PHP标签里面,因为CLI解释只认识第一行,不在PHP标签里认为是语法错误):

#!C:\php\php.exe -q

这样,可以看到在命令行下信息已经打印出来,证明该CLI脚本已经成功运行。

2.从命令行上读取参数

如果想从命令行获取参数,CLI可以从$_SERVER['argc']和$_SERVER['argv'']取得参数的个数和值。我们再建立一个文件,名字为testargs.php,脚本代码如下:

#!C:\php\php.exe –q 在命令行输入如下代码: C:\Users\John>testargs.php Always To Be Best测试获取参数:4AlwaysToBeBest

因为我们输入了一串单词,为“Always To Be Best”,脚本参数以空格分隔。因此,PHP将其计为4个参数,下面对此说明。

$_SERVER["argc"]数组返回一个整型的数,代表从命令行上回车后一共输入了几个参数。

从上例的结果已经看出,要访问已经传入的参数值,需要从索引1开始。因为脚本本身的文件已经占用了索引0,即$_SERVER["argv"][0]。

3.处理I/O通道

PHP最初设计不是用于与用户直接的键盘输入或文本输出结合使用。了解这一设计是至关重要的,因为如果需要在命令行中执行任何操作,都必须能够与用户来回通信。

输入输出(I/O)通道这个思想来源于UNIX系统,UNIX系统提供3个文件句柄,用以从一个应用程序及用户终端发送和接收数据。

我们可以把一个脚本的输出重定向到一个文件:

php world.php > outputfile

如果是在UNIX系统下,也可以使用通道定向到另一个命令或应用程序中。例如:

php world.php | sort.

在PHP 5 CLI中,有一个文件流句柄,可以使用3个系统常量,分别为STDIN、STDOUT和STDERR。下面我们分别介绍。

(1)STDIN

STDIN全称为standard in或standard input,标准输入可以从终端取得任何数据。

格式:stdin (’php://stdin’)

下面的例子是显示用户输入:

#!/usr/local/bin/php -q

这段代码的工作原理与cat命令很相似,回转提供给它的所有输入。但是,这时它还不能接收参数。

STDIN是PHP的标准输入设备,利用它,CLI PHP脚本可以做更多的事情。如下面例子:

#!/usr/local/bin/php -q 该脚本执行后将显示:你好!你叫什么名字(请输入):比如,输入Raymond之后,将显示:欢迎你Raymond

(2)STDOUT

STDOUT全称为standard out或standard output,标准输出可以直接输出到屏幕(也可以输出到其他程序,使用STDIN取得),如果在PHP CLI模式里使用print或echo语句,则这些数据将发送到STDOUT。

格式:stdout (’php://stdout’)

我们还可以使用PHP函数进行数据流输出。如下面例子:

#!/usr/local/bin/php –q输出结果如下:Hello World例如,echo和print命令打印到标准输出。 #!/usr/local/bin/php –qOutput #1.这将得到:Output #1.Output #2.Output #3.

说明:PHP标记外的新行已被输出,但是echo命令或print命令中没有指示换行。事实上,命令提示符重新出现在Output #2.Output #3. 所在的行中。PHP拥有的任何其他打印函数将会像此函数一样运行正常,任何写回文件的函数也是一样的。

#!/usr/local/bin/php -q

以上代码将把php://stdout作为输出通道显式打开,并且php://output通常以与php://stdout相同的方法运行。

(3)STDERR

STDERR全称为standard error,在默认情况下会直接发送至用户终端,当使用STDIN文件句柄从其他应用程序没有读取到数据时会生成一个“stdin.stderr”。

格式:stderr (’php://stderr’)

下面的脚本表示如何把一行文本输出到错误流中。

#!/usr/local/bin/php –q

PHP 5.2可以直接使用STDOUT作为常量,而不是定义上面使用的变量$STDOUT,为了兼容之前版本,我们仍使用了自定义变量,如果您使用的是PHP 5.2,则可以参考STDIN的第二个例子。

4.后台运行CLI

如果正在运行一个进程,而且在退出账户时该进程还不会结束,即在系统后台或背景下运行,那么就可以使用nohup命令。该命令可以在退出账户之后继续运行相应的进程。

nohup在英文中就是不挂起的意思(no hang up)。该命令的一般形式为:

nohup –f scriptname.php &

使用nohup命令提交作业,在默认情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。

nohup scriptname.php > log.txt &

这样,PHP CLI脚本执行后的结果将输出到log.txt中,我们可以使用tail命令查看该内容:

tail -n50 -f log.txt

现在再来实现两个例子,第一个是每隔10分钟自动生成一个静态HTML文件,并一直执行下去。脚本代码如下:

#! /usr/local/bin/php

保存并且退出vi编辑器,然后赋予genHTML.php文件可执行权限:

#>chmod 755 genHTML.php 然后让脚本在后台执行,执行如下命令:$nohup genHTML.php –f &执行上述命令后出现如下提示:[1] 16623

按回车键后将出现shell提示符。上面的提示就是说,所有命令执行的输出信息都会放到nohup.out文件中。

执行上面命令后,每隔10分钟就会在指定的目录生成指定的HTML文件,如article_111990120.html等文件。

如何终止CLI程序的后台运行呢?

可以使用kill命令来终止这个进程,终止进程之前要知道进程的PID号,即进程ID,我们使用ps命令:

www# ps PID TT STAT TIME COMMAND 561 v0 Is+ 0:00.00 /usr/libexec/getty Pc ttyv0 562 v1 Is+ 0:00.00 /usr/libexec/getty Pc ttyv1 563 v2 Is+ 0:00.00 /usr/libexec/getty Pc ttyv2 564 v3 Is+ 0:00.00 /usr/libexec/getty Pc ttyv3 565 v4 Is+ 0:00.00 /usr/libexec/getty Pc ttyv4 566 v5 Is+ 0:00.00 /usr/libexec/getty Pc ttyv5 567 v6 Is+ 0:00.00 /usr/libexec/getty Pc ttyv6 568 v7 Is+ 0:00.00 /usr/libexec/getty Pc ttyv7 16180 p0 I 0:00.01 su 16181 p0 S 0:00.06 _su (csh) 16695 p0 R+ 0:00.00 ps 16623 p0 S 0:00.06 /usr/local/bin/php /usr/local/www/data/genHTML.php 已经看到PHP的进程ID是:16623,于是再执行kill命令:$ kill -9 16623 [1]+ Killed nohup /usr/local/www/data/genHTML.php 这时该命令的进程就已经被终止了,再使用ps命令:$ ps PID TT STAT TIME COMMAND 82374 p3 Ss 0:00.17 -bash (bash) 82535 p3 R+ 0:00.00 ps

刚才的PHP CLI脚本已经没有了,如果直接运行ps命令无法看到进程,那么就结合使用ps & apos两个命令来查看。

注意:上面例子必须运行在UNIX或者Linux系统中,如FreeBSD、Redhat Linux等,在Windows环境不支持nohup命令。


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
author-avatar
jinshiyuan1123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有