windowsee新三板是什么么

acdseeprobeta-3-0-304-win-en.exe是什么软件_百度知道
acdseeprobeta-3-0-304-win-en.exe是什么软件
是一种叫ACDSee的图片查看和管理软件,”probeta-3-0-304-win-en“是它的一个版本,而且是英文版的
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Keyboard Shortcuts?
Next menu item
Previous menu item
Previous man page
Next man page
Scroll to bottom
Scroll to top
Goto homepage
Goto search(current page)
Focus search box
Change language:
Brazilian Portuguese
Chinese (Simplified)
PHP 的命令行模式
Table of Contents
从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server
Application Programming Interface,服务端应用编程端口)支持,名为
CLI,意为 Command Line
Interface,即命令行接口。顾名思义,该
CLI SAPI 模块主要用作 PHP 的开发外壳应用。CLI SAPI
和其它 CLI SAPI
模块相比有很多的不同之处,我们将在本章中详细阐述。值得一提的是,CLI
和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行为。
CLI SAPI 最先是随 PHP 4.2.0
版本发布的,但仍旧只是一个实验性的版本,并需要在运行
./configure 时加上
--enable-cli
参数。从 PHP 4.3.0
版本开始,CLI SAPI 成为了正式模块,--enable-cli
参数会被默认得设置为
on,也可以用参数 --disable-cli
从 PHP 4.3.0开始,CLI/CGI 二进制执行文件的文件名、位置和是否存在会根据
PHP 在系统上的安装而不同。在默认情况下,当运行
make 时,CGI 和 CLI 都会被编译并且分别放置在
PHP 源文件目录的 sapi/cgi/php 和
sapi/cli/php 下。可以注意到两个文件都被命名为了
php。在 make install
的过程中会发生什么取决于配置行。如果在配置的时候选择了一个
SAPI 模块,如 apxs,或者使用了
--disable-cgi
参数,则在
make install 的过程中,CLI 将被拷贝到
{PREFIX}/bin/php,除非 CGI
已经被放置在了那个位置。因此,例如,如果在配置行中有
--with--apxs
make install 的过程中,CLI 将被拷贝到
{PREFIX}/bin/php。如果希望撤销 CGI
执行文件的安装,请在 make install
之后运行 make install-cli。或者,也可以在配置行中加上
--disable-cgi
由于 --enable-cli
--enable-cgi
同时默认有效,因此,不必再配置行中加上
--enable-cli
来使得 CLI 在
make install 过程中被拷贝到
{PREFIX}/bin/php。
在 PHP 4.2.0 到 PHP 4.2.3 之间的 Windows 发行包中,CLI 的文件名为
php-cli.exe,相同文件夹下的
php.exe 为 CGI。从 PHP 4.3.0 版本开始,Windows
的发行包中 CLI 的执行文件为
php.exe,被放置在一个单独的名为
cli 的文件夹下,即
cli/php.exe。在 PHP 5 中,CLI
存在于主文件夹中,名为 php.exe,而
CGI 版本名为
php-cgi.exe。
从 PHP 5 起,一个名为 php-win.exe
的新文件随包发布。它相当于 CLI 版本,但是 php-win
不输出任何内容,便不提供控制台(不会弹出“DOS 窗口”)。这种方式类似于
php-gtk。需要使用
--enable-cli-win32
选项来配置它。
如何得知自己使用的是哪个 SAPI?
在命令行下,运行 php -v 便能得知该
php 是 CGI 还是 CLI。请参考函数
以及常量 PHP_SAPI。
在 PHP 4.3.2 中加入了 Unix 的 man 页面。可以在命令行中键入
man php 来查看。
以下为 CLI SAPI 和其它 CLI SAPI 模块相比的显著区别:
与 CGI SAPI 不同,其输出没有任何头信息。
尽管 CGI SAPI 提供了取消 HTTP 头信息的方法,但在
CLI SAPI 中并不存在类似的方法以开启 HTTP 头信息的输出。
CLI 默认以安静模式开始,但为了保证兼容性,-q
--no-header
参数为了向后兼容仍然保留,使得可以使用旧的 CGI 脚本。
在运行时,不会把工作目录改为脚本的当前目录(可以使用
和 --no-chdir
参数来兼容 CGI 模式)。
出错时输出纯文本的错误信息(非 HTML 格式)。
CLI SAPI 强制覆盖了 php.ini
中的某些设置,因为这些设置在外壳环境下是没有意义的。
覆盖 php.ini 设置选项
CLI SAPI 默认值
无意义的 HTML
标记符会使得出错信息很凌乱,所以在外壳下阅读报错信息是十分困难的。因此将该选项的默认值改为 FALSE。
在命令行模式下,所有来自
的输出将被立即写到输出端,而不作任何地缓冲操作。如果希望延缓或控制标准输出,仍然可以使用
0(无限值)
鉴于在外壳环境下使用 PHP 的无穷的可能性,最大运行时间被设置为了无限值。为
web 开发的应用程序可能只需运行几秒钟时间,而外壳应用程序的运行时间可能会长的多。
由于该设置为 TRUE,将总是可以在 CLI SAPI
中访问到 argc(传送给应用程序参数的个数)和
argv(包含有实际参数的数组)。
对于 PHP 4.3.0,在使用 CLI SAPI 时,PHP 变量
$argc 和 $argv
已被注册并且设定了对应的值。而在这之前的版本,这两个变量在
CGI 或者 模块
版本中的建立依赖于将 PHP 的设置选项
设为 on。除了版本和
register_globals 设定以外,可以随时通过调用
或者 $HTTP_SERVER_VARS
来访问它们。例如:
这些设置无法在设置文件 php.ini
或任何指定的其它文件中被初始化为其它值。这些默认值被限制在所有其它的设置文件被解析后改变。不过,它们的值可以在程序运行的过程中被改变(尽管对于该运行过程来说,这些设置项是没有意义的)。
为了减轻外壳环境下的工作,我们定义了如下常量:
CLI 专用常量
一个已打开的指向 stdin 的流。可以用如下方法来调用:
&?php$stdin&=&fopen('php://stdin',&'r');?&
如果想从 stdin 读取一行内容,可以使用
&?php$line&=&trim(fgets(STDIN));&//&从&STDIN&读取一行fscanf(STDIN,&"%d\n",&$number);&//&从&STDIN&读取数字?&
一个已打开的指向 stdout 的流。可以用如下方式来调用:
&?php$stdout&=&fopen('php://stdout',&'w');?&
一个已打开的指向 stderr 的流。可以用如下方式来调用:
&?php$stderr&=&fopen('php://stderr',&'w');?&
有了以上常量,就无需自己建立指向诸如 stderr
的流,只需简单的使用这些常量来代替流指向:
php -r 'fwrite(STDERR, &stderr\n&);'
无需自己来关闭这些流,PHP 会自动完成这些操作。
不会将当前目录改为已运行的脚本所在的目录。
以下范例显示了本模块与 CGI SAPI 模块之间的不同:
&?php//&名为&test.php&的简单测试程序echo&getcwd(),&"\n";?&
在使用 CGI 版本时,其输出为
$ php-cgi -f another_directory/test.php
/tmp/another_directory
明显可以看到 PHP 将当前目录改成了刚刚运行过的脚本所在的目录。
使用 CLI SAPI 模式,得到:
$ php -q another_directory/test.php
这使得在利用 PHP 编写外壳工具时获得了很大的便利。
可以在命令行运行时给该 CGI SAPI 加上
参数,使其支持 CLI SAPI 的功能。
以下是 PHP 二进制文件(即 php.exe
程序)提供的命令行模式的选项参数,随时可以运行带
参数的 PHP 命令来查询这些参数。
Usage: php [options] [-f] &file& [--] [args...]
php [options] -r &code& [--] [args...]
php [options] [-B &begin_code&] -R &code& [-E &end_code&] [--] [args...]
php [options] [-B &begin_code&] -F &file& [-E &end_code&] [--] [args...]
php [options] -- [args...]
php [options] -a
Run interactively
-c &path&|&file& Look for php.ini file in this directory
No php.ini file will be used
-d foo[=bar]
Define INI entry foo with value 'bar'
Generate extended information for debugger/profiler
Parse &file&.
PHP information
Syntax check only (lint)
Show compiled in modules
Run PHP &code& without using script tags &?..?&
-B &begin_code&
Run PHP &begin_code& before processing input lines
Run PHP &code& for every input line
Parse and execute &file& for every input line
-E &end_code&
Run PHP &end_code& after processing all input lines
Hide any passed arguments from external tools.
Display colour syntax highlighted source.
Version number
Display source with stripped comments and whitespace.
Load Zend extension &file&.
Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
CLI SAPI 模块有以下三种不同的方法来获取要运行的 PHP 代码:
让 PHP 运行指定文件。
php my_script.php
php -f my_script.php
以上两种方法(使用或不使用 -f
参数)都能够运行给定的
my_script.php 文件。可以选择任何文件来运行,指定的
PHP 脚本并非必须要以 .php
为扩展名,它们可以有任意的文件名和扩展名。
在命令行直接运行 PHP 代码。
php -r 'print_r(get_defined_constants());'
在使用这种方法时,请注意外壳变量的替代及引号的使用。
请仔细阅读以上范例,在运行代码时没有开始和结束的标记符!加上
参数后,这些标记符是不需要的,加上它们会导致语法错误。
通过标准输入(stdin)提供需要运行的 PHP 代码。
以上用法提供了非常强大的功能,使得可以如下范例所示,动态地生成
PHP 代码并通过命令行运行这些代码:
$ some_application | some_filter | php | sort -u &final_output.txt
以上三种运行代码的方法不能同时使用。
和所有的外壳应用程序一样,PHP 的二进制文件(php.exe
文件)及其运行的 PHP 脚本能够接受一系列的参数。PHP
没有限制传送给脚本程序的参数的个数(外壳程序对命令行的字符数有限制,但通常都不会超过该限制)。传递给脚本的参数可在全局变量
中获取。该数组中下标为零的成员为脚本的名称(当
PHP 代码来自标准输入获直接用 -r
参数以命令行方式运行时,该名称为“-”)。另外,全局变量
数组中成员变量的个数(而非传送给脚本程序的参数的个数)。
只要传送给脚本的参数不是以 -
符号开头,就无需过多的注意什么。向脚本传送以
- 开头的参数会导致错误,因为 PHP
会认为应该由它自身来处理这些参数。可以用参数列表分隔符
-- 来解决这个问题。在 PHP
解析完参数后,该符号后所有的参数将会被原样传送给脚本程序。
# 以下命令将不会运行 PHP 代码,而只显示 PHP 命令行模式的使用说明:
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] &file& [args...]
# 以下命令将会把“-h”参数传送给脚本程序,PHP 不会显示命令行模式的使用说明:
$ php -r 'var_dump($argv);' -- -h
array(2) {
string(1) &-&
string(2) &-h&
除此之外,还有另一个方法将 PHP 用于外壳脚本。可以在写一个脚本,并在第一行以
#!/usr/bin/php 开头,在其后加上以 PHP
开始和结尾标记符包含的正常的 PHP
代码,然后为该文件设置正确的运行属性(例如:chmod +x test)。该方法可以使得该文件能够像外壳脚本或 PERL 脚本一样被直接执行。
#!/usr/bin/php&?php&&&&var_dump($argv);?&
假设改文件名为 test 并被放置在当前目录下,可以做如下操作:
$ chmod +x test
$ ./test -h -- foo
array(4) {
string(6) &./test&
string(2) &-h&
string(2) &--&
string(3) &foo&
正如所看到的,在向该脚本传送以 - 开头的参数时,脚本仍然能够正常运行。
PHP 4.3.3 以来有效的长选项:
命令行选项
--interactive
交互式运行 PHP。如果编译 PHP 时加入了
扩展(Windows
下不可用),那将会得到一个很好的外壳,包括一个自动完成的功能(例如可以在键入变量名的时候,按下
TAB 键,PHP 会自动完成该变量名)以及命令历史记录,可以用上下键来访问。历史记录存在
~/.php_history 文件中。
包含的文件在此模式下会被解析,但有些限制,例如函数必须在被调用之前定义。
用该参数,可以指定一个放置 php.ini
文件的目录,或者直接指定一个自定义的 INI
文件(其文件名可以不是 php.ini),例如:
$ php -c /custom/directory/ my_script.php
$ php -c /custom/directory/custom-file.ini my_script.php
如果不指定此选项,PHP 将在搜索文件。
--no-php-ini
完全忽略 php.ini。此参数在 PHP 4.3.0 以后有效。
用该参数可以自行设置任何可以在 php.ini
文件中设置的配置选项的值,其语法为:
-d configuration_directive[=value]
例子(因版面原因而折行显示):
# 取值部分被省略,将会把配置选项设为 &1&
$ php -d max_execution_time
-r '$foo = ini_get(&max_execution_time&); var_dump($foo);'
string(1) &1&
# 取值部分为空白,将会把配置选项设为 &&
php -d max_execution_time=
-r '$foo = ini_get(&max_execution_time&); var_dump($foo);'
string(0) &&
# 配置选项将被设置成为任何 '=' 字符之后的值
php -d max_execution_time=20
-r '$foo = ini_get(&max_execution_time&); var_dump($foo);'
string(2) &20&
-d max_execution_time=doesntmakesense
-r '$foo = ini_get(&max_execution_time&); var_dump($foo);'
string(15) &doesntmakesense&
--profile-info
激活扩展信息模式,被用于调试/测试。
解析并运行 -f
选项给定的文件名。该参数为可选参数,可以省略,仅指明需要运行的文件名即可。
--help and --usage
使用该参数,可以得到完整的命令行参数的列表及这些参数作用的简单描述。
该命令行参数会调用
函数并显示出结果。如果 PHP 没有正常工作,建议执行
命令来查看在信息表格之前或者对应的地方是否有任何错误信息输出。请注意当使用
CGI 摸索时,输出的内容为 HTML
格式,因此输出的信息篇幅较大。
--syntax-check
该参数提供了对指定 PHP
代码进行语法检查的方便的方法。如果成功,则向标准输出写入
No syntax errors detected in &filename&
字符串,并且外壳返回值为
0。如果失败,则输出
Errors parsing
&filename&
以及内部解析器错误信息到标准输出,同时外壳返回值将别设置为
该参数将无法检查致命错误(如未定义函数),如果也希望检测致命错误,请使用
该参数不能和 -r
一同使用。
使用该参数,PHP 将打印出内置以及已加载的 PHP 及 Zend 模块:
[PHP Modules]
[Zend Modules]
使用该参数可以在命令行内运行单行 PHP
代码。无需加上 PHP
的起始和结束标识符(&?php 和
?&),否则将会导致语法解析错误。
使用这种形式的 PHP 时,应注意避免和外壳环境进行的命令行参数替换相冲突。
显示语法解析错误的范例
$ php -r &$foo = get_defined_constants();&
Command line code(1) : Parse error - parse error, unexpected '='
这里的问题在于即使使用了双引号
&,sh/bash 仍然实行了参数替换。由于
没有被定义,被替换后它所在的位置变成了空字符,因此在运行时,实际被
PHP 读取的代码为:
$ php -r & = get_defined_constants();&
正确的方法是使用单引号
'。在用单引号引用的字符串中,变量不会被
sh/bash 还原成其原值。
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
[&E_ERROR&]=&
[&E_WARNING&]=&
[&E_PARSE&]=&
[&E_NOTICE&]=&
[&E_CORE_ERROR&]=&
如果使用的外壳不是 sh/bash,可能会碰到更多问题。请将碰到的 Bug
报告。注意,当试图将 shell 变量用到代码中或者使用反斜线时仍然很容易碰到问题。
在 CLI SAPI
中有效,在 CGI SAPI 中无效。
此选项只用于非常基本的用途。因此一些配置指令(例如
和 )在此模式下被忽略。
--process-begin
在处理 stdin 之前先执行 PHP 代码。PHP 5 新加。
--process-code
对每个输入行都执行 PHP 代码。PHP 5 新加。
此模式下有两个特殊变量:$argn
和 $argi。$argn
包含 PHP 当前处理的行内容,而
$argi 则包含该行号。
--process-file
对每个输入行都执行 PHP 文件。PHP 5 新加。
--process-end
在处理完输入后执行的 PHP 代码。PHP 5 新加。
选项来计算一个项目总行数的例子。
$ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo &Total Lines: $l\n&;'
Total Lines: 37328
--syntax-highlight and --syntax-highlight
显示有语法高亮色彩的源代码。
该参数使用内建机制来解析文件并为其生成一个 HTML
高亮版本并将结果写到标准输出。请注意该过程所做的只是生成了一个
&code& [...] &/code& 的
HTML 标记的块,并不包含任何的 HTML 头。
该选项不能和 -r
参数同时使用。
将 PHP,PHP SAPI 和 Zend 的版本信息写入标准输出。例如:
PHP 4.3.0 (cli), Copyright (c)
The PHP Group
Zend Engine v1.3.0, Copyright (c)
Zend Technologies
显示除去了注释和多余空白的源代码。
该选项不能和 -r
参数同时使用。
--zend-extension
加载 Zend 扩展库。如果仅给定一个文件名,PHP
将试图从当前系统扩展库的默认路径(在 Linux
系统下,该路径通常由 /etc/ld.so.conf
指定)加载该扩展库。如果用一个绝对路径指定文件名,则不会使用系统的扩展库默认路径。如果用相对路径指定的文件名,则
PHP 仅试图在当前目录的相对目录加载扩展库。
PHP 的命令行模式能使得 PHP 脚本能完全独立于 web 服务器单独运行。如果使用
Unix 系统,需要在 PHP
脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用哪个程序去运行该脚本。在
Windows 平台下可以将 php.exe 和 .php
文件的双击属性相关联,也可以编写一个批处理文件来用 PHP
执行脚本。为 Unix 系统增加的第一行代码不会影响该脚本在
Windows 下的运行,因此也可以用该方法编写跨平台的脚本程序。以下是一个简单的
PHP 命令行程序的范例。
Example #1 试图以命令行方式运行的 PHP 脚本(script.php)
#!/usr/bin/php&?phpif&($argc&!=&2&||&in_array($argv[1],&array('--help',&'-help',&'-h',&'-?')))&{?&This&is&a&command&line&PHP&script&with&one&option.&&Usage:&&&?php&echo&$argv[0];&?&&&option&&&&option&&can&be&some&word&you&would&like&&to&print&out.&With&the&--help,&-help,&-h,&&or&-?&options,&you&can&get&this&help.&?php}&else&{&&&&echo&$argv[1];}?&
在以上脚本中,用第一行特殊的代码来指明该文件应该由 PHP
来执行。在这里使用 CLI 的版本,因此不会有 HTTP 头信息输出。在用
PHP 编写命令行应用程序时,可以使用两个参数:
和 。前面一个的值是比参数个数大 1
的整数(运行的脚本本身的名称也被当作一个参数)。第二个是包含有参数的数组,其第一个元素为脚本的名称,下标为数字
以上程序中检查了参数的个数是大于 1 个还是小于 1
个。此外如果参数是 --help
时,打印出帮助信息,并同时动态输出脚本的名称。如果还收到了其它参数,将其显示出来。
如果希望在 Unix 下运行以上脚本,需要使其属性为可执行文件,然后简单的运行
script.php echothis 或 script.php -h。在
Windows 下,可以为此编写一个批处理文件:
Example #2 运行 PHP 命令行脚本的批处理文件(script.bat)
@C:\php\php.exe script.php %1 %2 %3 %
假设将上述程序命名为 script.php,且
CLI 版的 php.exe 文件放置在
c:\php\cli\php.exe,该批处理文件会帮助将附加的参数传给脚本程序:script.bat
echothis 或 script.bat -h。
扩展模块的有关文档,以获取更多的函数的信息。这些函数可以帮助完善 PHP 命令行应用程序。
You can easily parse command line arguments into the $_GET variable by using the parse_str() function.&?phpparse_str(implode('&', array_slice($argv, 1)), $_GET);?&It behaves exactly like you'd expect with cgi-php.$ php -f somefile.php a=1 b[]=2 b[]=3This will set $_GET['a'] to '1' and $_GET['b'] to array('2', '3').Even better, instead of putting that line in every file, take advantage of PHP's auto_prepend_file directive.& Put that line in its own file and set the auto_prepend_file directive in your cli-specific php.ini like so:auto_prepend_file = "/etc/php/cli-php5.3/local.prepend.php"It will be automatically prepended to any PHP file run from the command line.
Just a note for people trying to use interactive mode from the commandline.The purpose of interactive mode is to parse code snippits without actually leaving php, and it works like this:[root@localhost php-4.3.4]# php -aInteractive mode enabled&?php echo "hi!"; ?&&note, here we would press CTRL-D to parse everything we've entered so far&hi!&?php exit(); ?&&ctrl-d here again&[root@localhost php-4.3.4]#I noticed this somehow got ommited from the docs, hope it helps someone!
To hand over the GET-variables in interactive mode like in HTTP-Mode (e.g. your URI is myprog.html?hugo=bla&bla=hugo), you have to callphp myprog.html '&hugo=bla&bla=hugo'(two & instead of ? and &!)There just a little difference in the $ARGC, $ARGV values, but I think this is in those cases not relevant.
Using CLI (on WIN at least), some INI paths are relative to the current working directory.& For example, if your error_log = "php_errors.log", then php_errors.log will be created (or appended to if already exists) in whatever directory you happen to be in at the moment if you have write access there.& Instead of having random error logs all over the place because of this behavior, you may want to set error_log to a full path, perhaps to the php.exe directory.
Check directly without calling functions:
&?php
if (PHP_SAPI === 'cli')
{
&& }
?&
You can define a constant to use it elsewhere
&?php
define('ISCLI', PHP_SAPI === 'cli');
?&
If a module SAPI is chosen during configure, such as apxs, or the --disable-cgi option is used, the CLI is copied to {PREFIX}/bin/php during make install& otherwise the CGI is placed there.versusChanged CGI install target to php-cgi and 'make install' to install CLI when CGI is selected. (changelog for 5.2.3)
This took me all day to figure out, so I hope posting it here saves someone some time:Your PHP-CLI may have a different php.ini than your apache-php.& For example: On my Debian-based system, I discovered I have /etc/php4/apache/php.ini and /etc/php4/cli/php.iniIf you want MySQL support in the CLI, make sure the line extension=mysql.sois not commented out.The differences in php.ini files may also be why some scripts will work when called through a web browser, but will not work when called via the command line.
Parsing command line: optimization is evil!One thing all contributors on this page forgotten is that you can suround an argv with single or double quotes. So the join coupled together with the preg_match_all will always break that :)Here is a proposal:#!/usr/bin/php&?phpprint_r(arguments($argv));function arguments ( $args ){& array_shift( $args );& $endofoptions = false;& $ret = array& & (& & 'commands' =& array(),& & 'options' =& array(),& & 'flags'& & =& array(),& & 'arguments' =& array(),& & );& while ( $arg = array_shift($args) )& {& & if ($endofoptions)& & {& & & $ret['arguments'][] = $arg;& & && & }& & if ( substr( $arg, 0, 2 ) === '--' )& & {& & & if (!isset ($arg[3]))& & & {& & & & $endofoptions = true;; & & & }& & & $value = "";& & & $com&& = substr( $arg, 2 );& & & if (strpos($com,'='))& & & & list($com,$value) = split("=",$com,2);& & & elseif (strpos($args[0],'-') !== 0)& & & {& & & & while (strpos($args[0],'-') !== 0)& & & & & $value .= array_shift($args).' ';& & & & $value = rtrim($value,' ');& & & }& & & $ret['options'][$com] = !empty($value) ? $value : true;& & && & }& & if ( substr( $arg, 0, 1 ) === '-' )& & {& & & for ($i = 1; isset($arg[$i]) ; $i++)& & & & $ret['flags'][] = $arg[$i];& & && & }& & $ret['commands'][] = $arg;& && }& if (!count($ret['options']) && !count($ret['flags']))& {& & $ret['arguments'] = array_merge($ret['commands'], $ret['arguments']);& & $ret['commands'] = array();& }return $ret;}exit (0)?&
Parsing commandline argument GET String without changing the PHP script (linux shell):URL: index.php?a=1&b=2Result: output.htmlecho "" | php -R 'include("index.php");' -B 'parse_str($argv[1], $_GET);' 'a=1&b=2' &output.html(no need to change php.ini)You can put this & echo "" | php -R 'include("'$1'");' -B 'parse_str($argv[1], $_GET);' "$2"in a bash script "php_get" to use it like this:& php_get index.php 'a=1&b=2' &output.htmlor directed to text browser...& php_get index.php 'a=1&b=2' |w3m -T text/html
If you want to be interactive with the user and accept user input, all you need to do is read from stdin.& &?phpecho "Are you sure you want to do this?& Type 'yes' to continue: ";$handle = fopen ("php://stdin","r");$line = fgets($handle);if(trim($line) != 'yes'){& & echo "ABORTING!\n";& &}echo "\n";echo "Thank you, continuing...\n";?&
To pass more than 9 arguments to your php-script on Windows, you can use the 'shift'-command in a batch file. After using 'shift', %1 becomes %0, %2 becomes %1 and so on - so you can fetch argument 10 etc. Here's an example - hopefully ready-to-use - batch file:foo.bat:---------@echo off:init_argset args=:get_argshiftif "%0"=="" goto :finish_argset args=%args% %0goto :get_arg:finish_argset php=C:\path\to\php.exeset ini=C:\path\to\php.ini%php% -c %ini% foo.php %args%---------Usage on commandline:foo -1 -2 -3 -4 -5 -6 -7 -8 -9 -foo -barA print_r($argv) will give you all of the passed arguments.
If you edit a php file in windows, upload and run it on linux with command line method. You may encounter a running problem probably like that:[root@ItsCloud02 wsdl]# ./lnxcli.phpExtension './lnxcli.php' not present.Or you may encounter some other strange problem.Care the enter key. In windows environment, enter key generate two binary characters '0D0A'. But in Linux, enter key generate just only a 'OA'.I wish it can help someone if you are using windows to code php and run it as a command line program on linux.
Just a variant of previous script to accept arguments with '=' also&?phpfunction arguments($argv) {& & $_ARG = array();& & foreach ($argv as $arg) {& & & if (ereg('--([^=]+)=(.*)',$arg,$reg)) {& & & & $_ARG[$reg[1]] = $reg[2];& & & } elseif(ereg('-([a-zA-Z0-9])',$arg,$reg)) {& & & & & & $_ARG[$reg[1]] = 'true';& & & & }&& & & }& return $_ARG;}?&$ php myscript.php --user=nobody --password=secret -p --access="host=127.0.0.1 port=456" Array(& & [user] =& nobody& & [password] =& secret& & [p] =& true& & [access] =& host=127.0.0.1 port=456)
Note that parsing of the shebang line may not always work as expected...#!/usr/bin/php -dmemory_limit=512M -dsafe_mode=Off&?phpprint "memory_limit=".ini_get("memory_limit")."\n";print "safe_mode=".ini_get("safe_mode")."\n";?&gives...$ ./test.php PHP:& Invalid configuration directivememory_limit=512M -dsafe_modesafe_mode=
Use PHP as Scripting Language in Windows Vista and 7:ASSOC .phs=PHPScriptFTPYE PHPScript=[path to]\php.exe -f "%1" -- %*optional set PATHEXT=.%PATHEXT%now you can execute any php-script (ext: .phs) from the shell like a .vbs or .cmd."c:\testscript.phs arg1 arg2" or with the optional step "c:\testscript arg1 arg2"i hope this helps somebody.
Here goes a very simple clrscr function for newbies...function clrscr() { system("clear"); }
In the notes it there is an example of running 1 line of PHP using:php -r 'print_r(get_defined_constants());'This might work on a UNIX machine but unfortunately on windows it produces the following error message:Parse error: parse error in Command line code on line 1Instead of using ' (single quotes) to encompass the PHP code use " (double quotes) instead. You can safely use ' within the code itself however such as:php -r "echo 'hello';"
For those who was unable to clear the windows screen trying to run CLS command:CLS is not an windows executable file! It is an option !So, the rigth command is&& system("command /C cls");
I had a problem with PHP 5.2.0 (cli) (winXP) that no output was printed when I tried to run any file. Using the -n switch solved the problem. Apparently the interpreter can't always find php.ini, even though both exist in the same folder and the PATH variable is set correctly. No error messages were printed either.
To display colored text when it is actually supported :&?phpecho "\033[31m".$myvar; echo "\033[41m".$myvar; ?&To reset these settings : &?phpecho "\033[0m";?&More fun :&?phpecho "\033[5;30m;\033[48mWARNING !"; ?&More info here :
Hi,This function clears the screen, like "clear screen"&?php& function clearscreen($out = TRUE) {& & $clearscreen = chr(27)."[H".chr(27)."[2J";& & if ($out) print $clearscreen;& & else return $clearscreen;& }?&
An addition to my previous post (you can replace it)If your php script doesn't run with shebang (#!/usr/bin/php),and it issues the beautifull and informative error message:"Command not found."& just dos2unix yourscript.phpet voila.If you still get the "Command not found." Just try to run it as ./myscript.php , with the "./"if it works - it means your current directory is not in the executable search path.If your php script doesn't run with shebang (#/usr/bin/php),and it issues the beautifull and informative message:"Invalid null command." it's probably because the "!" is missing in the the shebang line (like what's above) or something else in that area.\Alon
You can use this function to ask user to enter something.
&?php
function read ($length='255')
{
&& if (!isset ($GLOBALS['StdinPointer']))
&& {
& & & $GLOBALS['StdinPointer'] = fopen ("php://stdin","r");
&& }
&& $line = fgets ($GLOBALS['StdinPointer'],$length);
&& return trim ($line);
}
echo "Enter your name: ";
$name = read ();
echo "\nHello $name! Where you came from? ";
$where = read ();
echo "\nI see. $where is very good place.";
?&
It seems like 'max_execution_time' doesn't work on CLI. &?phpphp -d max_execution_time=20& & & & -r '$foo = ini_get("max_execution_time"); var_dump($foo);'?&will print string(2) "20", but if you'l run infinity while: while(true) for example, it wouldn't stop after 20 seconds.Testes on Linux Gentoo, PHP 5.1.6.
On windows, you can simulate a cls by echoing out just \r.& This will keep the cursor on the same line and overwrite what was on the line.for example:&?php& & echo "Starting Iteration" . "\n\r";& & for ($i=0;$i&10000;$i++) {& & & & echo "\r" . $i;& & }& & echo "Ending Iteration" . "\n\r";?&
Spawning php-win.exe as a child process to handle scripting in Windows applications has a few quirks (all having to do with pipes between Windows apps and console apps).To do this in C++:// We will run php.exe as a child process after creating// two pipes and attaching them to stdin and stdout// of the child process// Define sa struct such that child inherits our handlesSECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) };sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;// Create the handles for our two pipes (two handles per pipe, one for each end)// We will have one pipe for stdin, and one for stdout, each with a READ and WRITE endHANDLE hStdoutRd, hStdoutWr, hStdinRd, hStdinWr;// Now create the pipes, and make them inheritableCreatePipe (&hStdoutRd, &hStdoutWr, &sa, 0))SetHandleInformation(hStdoutRd, HANDLE_FLAG_INHERIT, 0);CreatePipe (&hStdinRd, &hStdinWr, &sa, 0)SetHandleInformation(hStdinWr, HANDLE_FLAG_INHERIT, 0);// Now we have two pipes, we can create the process// First, fill out the usage structsSTARTUPINFO si = { sizeof(STARTUPINFO) };PROCESS_INFORMATIONsi.dwFlags = STARTF_USESTDHANDLES;si.hStdOutput = hStdoutWr;si.hStdInput& = hStdinRd;// And finally, create the processCreateProcess (NULL, "c:\\php\\php-win.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);// Close the handles we aren't usingCloseHandle(hStdoutWr);CloseHandle(hStdinRd);// Now that we have the process running, we can start pushing PHP at itWriteFile(hStdinWr, "&?php echo 'test'; ?&", 9, &dwWritten, NULL);// When we're done writing to stdin, we close that pipeCloseHandle(hStdinWr);// Reading from stdout is only slightly more complicatedstd::string processed("");char buf[128];while ( (ReadFile(hStdoutRd, buf, 128, &dwRead, NULL) && (dwRead != 0)) ) {& & for (i = 0; i & dwR i++)& & & & processed += buf[i];}& & // Done reading, so close this handle tooCloseHandle(hStdoutRd);A full implementation (implemented as a C++ class) is available at
I needed this, you proly wont tho.
puts the exicution args into $_GET
&?php
if ($argv) {
& & foreach ($argv as $k=&$v)
& & {
& & & & if ($k==0)
& & & & $it = explode("=",$argv[$i]);
& & & & if (isset($it[1])) $_GET[$it[0]] = $it[1];
& & }
}
?&
dunno if this is on linux the same but on windows evertimeyou send somthing to the console screen php is waiting forthe console to return. therefor if you send a lot of small short amounts of text, the console is starting to be using more cpu-cycles then php and thus slowing the script.take a look at this sheme:cpu-cycle:1 -&php: print("a");cpu-cycle:2 -&cmd: output("a");cpu-cycle:3 -&php: print("b");cpu-cycle:4 -&cmd: output("b");cpu-cycle:5 -&php: print("c");cpu-cycle:6 -&cmd: output("c"); cpu-cylce:7 -&php: print("d");cpu-cycle:8 -&cmd: output("d"); cpu-cylce:9 -&php: print("e");cpu-cycle:0 -&cmd: output("e"); on the screen just appears "abcde". but if you write your script this way it will be far more faster:cpu-cycle:1 -&php: ob_start();cpu-cycle:2 -&php: print("abc");cpu-cycle:3 -&php: print("de");cpu-cycle:4 -&php: $data = ob_get_contents();cpu-cycle:5 -&php: ob_end_clean();cpu-cycle:6 -&php: print($data);cpu-cycle:7 -&cmd: output("abcde");now this is just a small example but if you are writing anapp that is outputting a lot to the console, i.e. a textbased screen with frequent updates, then its much better to first cach all output, and output is as one big chunk oftext instead of one char a the time. ouput buffering is ideal for this. in my script i outputtedalmost 4000chars of info and just by caching it first, itspeeded up by almost 400% and dropped cpu-usage.because what is being displayed doesn't matter, be it 2chars or 40.0000 chars, just the call to output takes a great deal of time. remeber that.maybe someone can test if this is the same on unix-basedsystems. it seems that the STDOUT stream just waits for the console to report ready, before continueing execution.
If you are using Windows XP (I think this works on 2000, too) and you want to be able to right-click a .php file and run it from the command line, follow these steps:1. Run regedit.exe and *back up the registry.*2. Open HKEY_CLASSES_ROOT and find the ".php" key.IF IT EXISTS:------------------3. Look at the "(Default)" value inside it and find the key in HKEY_CLASSES_ROOT with that name.4. Open the "shell" key inside that key. Skip to 8.IF IT DOESN'T:------------------5. Add a ".php" key and set the "(Default)" value inside it to something like "phpscriptfile".6. Create another key in HKEY_CLASSES_ROOT called "phpscriptfile" or whatever you chose.7. Create a key inside that one called "shell".8. Create a key inside that one called "run".9. Set the "(Default)" value inside "run" to whatever you want the menu option to be (e.g. "Run").10. Create a key inside "run" called "command".11. Set the "(Default)" value inside "command" to:cmd.exe /k C:\php\php.exe "%1"Make sure the path to PHP is appropriate for your installation. Why not just run it with php.exe directly? Because you (presumably) want the console window to remain open after the script ends.You don't need to set up a webserver for this to work. I downloaded PHP just so I could run scripts on my computer. Hope this is useful!
One of the things I like about perl and vbscripts, is the fact that I can name a file e.g. 'test.pl' and just have to type 'test, without the .pl extension' on the windows command line and the command processor knows that it is a perl file and executes it using the perl command interpreter.I did the same with the file extension .php3 (I will use php3 exclusivelly for command line php scripts, I'm doing this because my text editor VIM 6.3 already has the correct syntax highlighting for .php3 files ).I modified the PATHEXT environment variable in Windows XP, from the " 'system' control panel applet-&'Advanced' tab-&'Environment Variables' button-& 'System variables' text area".Then from control panel "Folder Options" applet-& 'File Types' tab, I added a new file extention (php3), using the button 'New'& and typing php3 in the window that pops up.Then in the 'Details for php3 extention' area I used the 'Change' button to look for the Php.exe executable so that the php3 file extentions are associated with the php executable.You have to modify also the 'PATH' environment variable, pointing to the folder where the php executable is installedHope this is useful to somebody
This posting is not a php-only problem, but hopefully will save someone a few hours of headaches.& Running on MacOS (although this could happen on any *nix I suppose), I was unable to get the script to execute without specifically envoking php from the command line:[macg4:valencia/jobs] tim% test.php./test.php: Command not found.However, it worked just fine when php was envoked on the command line:[macg4:valencia/jobs] tim% php test.phpWell, here we are...& Now what?Was file access mode set for executable?& Yup.[macg4:valencia/jobs] tim% ls -l total 16-rwxr-xr-x& 1 tim& staff&& 242 Feb 24 17:23 test.phpAnd you did, of course, remember to add the php command as the first line of your script, yeah?& Of course.#!/usr/bin/php&?php print "Well, here we are...& Now what?\n"; ?&So why dudn't it work?& Well, like I said... on a Mac.... but I also occasionally edit the files on my Windows portable (i.e. when I'm travelling and don't have my trusty Mac available)...& Using, say, WordPad on Windows... and BBEdit on the Mac...Aaahhh... in BBEdit check how the file is being saved!& Mac?& Unix?& or Dos?& Bingo.& It had been saved as Dos format.& Change it to Unix:[macg4:valencia/jobs] tim% ./test.phpWell, here we are...& Now what?[macg4:valencia/jobs] tim% NB: If you're editing your php files on multiple platforms (i.e. Windows and Linux), make sure you double check the files are saved in a Unix format...& those \r's and \n's 'll bite cha!
For those of you who want the old CGI behaviour that changes to the actual directory of the script use:chdir(dirname($_SERVER['argv'][0]));at the beginning of your scripts.
Ok, I've had a heck of a time with PHP & 4.3.x and whether to use CLI vs CGI. The CGI version of 4.3.2 would return (in browser):---No input file specified.---And the CLI version would return:---500 Internal Server Error---It appears that in CGI mode, PHP looks at the environment variable PATH_TRANSLATED to determine the script to execute and ignores command line. That is why in the absensce of this environment variable, you get "No input file specified." However, in CLI mode the HTTP headers are not printed. I believe this is intended behavior for both situations but creates a problem when you have a CGI wrapper that sends environment variables but passes the actual script name on the command line.By modifying my CGI wrapper to create this PATH_TRANSLATED environment variable, it solved my problem, and I was able to run the CGI build of 4.3.2
I had a problem with the $argv values getting split up when they contained plus (+) signs. Be sure to use the CLI version, not CGI to get around it.Monte
In *nix systems, use the WHICH command to show the location of the php binary executable. This is the path to use as the first line in your php shell script file. (#!/path/to/php -q) And execute php from the command line with the -v switch to see what version you are running.example:# which php/usr/local/bin/php# php -vPHP 4.3.1 (cli) (built: Mar 27 :51)Copyright (c)
The PHP GroupZend Engine v1.3.0, Copyright (c)
Zend TechnologiesIn the above example, you would use: #!/usr/local/bin/phpAlso note that, if you do not have the current/default directory in your PATH (.), you will have to use ./scriptfilename to execute your script file from the command line (or you will receive a "command not found" error). Use the ENV command to show your PATH environment variable value.
How to change current directory in PHP script to script's directory when running it from command line using PHP 4.3.0?(you'll probably need to add this to older scripts when running them under PHP 4.3.0 for backwards compatibility)Here's what I am using:chdir(preg_replace('/\\/[^\\/]+$/',"",$PHP_SELF));Note: documentation says that "PHP_SELF" is not available in command-line PHP scripts. Though, it IS available. Probably this will be changed in future version, so don't rely on this line of code...Use $_SERVER['PHP_SELF'] instead of just $PHP_SELF if you have register_globals=Off
TIP: If you want different versions of the configuration file& depending on what SAPI is used,just name them php.ini (apache module), php-cli.ini (CLI) and php-cgi.ini (CGI) and dump them all in the regular configuration directory. I.e no need to compile several versions of php anymore!
If you are trying to set up an interactive command line script and you want to get started straight away (works on 4+ I hope). Here is some code to start you off:&?php& & set_time_limit(0);& & define('STDIN',fopen("php://stdin","r"));& & while(!0)& & {& & & & & & & & echo "Select an option..\n\n";& & & & echo "& & 1) Do this\n";& & & & echo "& & 2) Do this\n";& & & & echo "& & 3) Do this\n";& & & & echo "& & x) Exit\n";& & & & switch(trim(fgets(STDIN,256)))& & & & {& & & & & & case 1:& & & & & & & && & & & & & & & & & & & & & case 2:& & & & & & & && & & & & & case 3:& & & & & & & && & & & & & case "x":& & & & & & & & exit();& & & & & & & & & & & & & & default: & & & & & & & && & & & }& & }& & fclose(STDIN);?&
You can also call the script from the command line after chmod'ing the file (ie: chmod 755 file.php).On your first line of the file, enter "#!/usr/bin/php" (or to wherever your php executable is located).& If you want to suppress the PHP headers, use the line of "#!/usr/bin/php -q" for your path.
Example 43-2 shows how to create a DOS batch file to run a PHP script form the command line using: @c:\php\cli\php.exe script.php %1 %2 %3 %4Here is an updated version of the DOS batch file:@c:\php\cli\php.exe %~n0.php %*This will run a PHP file (i.e. script.php) with the same base file name (i.e. script) as the DOS batch file (i.e. script.bat) and pass all parameters (not just the first four as in example 43-2) from the DOS batch file to the PHP file.& This way all you have to do is copy/rename the DOS batch file to match the name of your PHP script file without ever having to actually modify the contents of the DOS batch file to match the file name of the PHP script.
A very important point missing here (I lost hours on it and hope to avoid this to you) :* When using PHP as CGI* When you just become crazy because of "No input file specified" appearing on the web page, while it never appears directly in the shellThen I have a solution for you :1. Create a script for example called cgiwrapper.cgi2. Put inside : #!/bin/sh - export SCRIPT_FILENAME=/var/www/realpage.php /usr/bin/php -f $SCRIPT_FILENAME3. Name your page realpage.phpFor example with thttpd the problem is that SCRIPT_FILENAME is not defined, while PHP absolutely requires it.My solution corrects that problem !
If you want to use named command line parameters in your script, the following code will parse command line parameters in the form of name=value and place them in the $_REQUEST super global array.cli_test.php&?phpecho "argv[] = ";print_r($argv);& if ($argc & 0){& for ($i=1;$i & $argc;$i++)& {& & parse_str($argv[$i],$tmp);& & $_REQUEST = array_merge($_REQUEST, $tmp);& }}echo "\$_REQUEST = ";print_r($_REQUEST);?&rwre:~/tmp$ /usr/local/bin/php cli_test.php foo=1 bar=2 third=a+valueargv[] = Array(& & [0] =& t.php& & [1] =& foo=1& & [2] =& bar=2& & [3] =& third=a+value)$_REQUEST = Array(& & [foo] =& 1& & [bar] =& 2& & [third] =& a value)
In 5.1.2 (and others, I assume), the -f form silently drops the first argument after the script name from $_SERVER['argv']. I'd suggest avoiding it unless you need it for a special case.
Under Solaris (at least 2.6) I have some problems with reading stdin. Original pbms report may be found here: q=Re:+%5BPHP%5D+Q+on+php://stdin+--+an+answer!&hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=3C74AF57.&rnum=1At a first glance the only solution for it is 'fgetcsv'#!/usr/local/bin/php -q&?phpset_magic_quotes_runtime(0);$fd=fopen("php://stdin","r");if (!$fd)&while (!feof ($fd)){& $s = fgetcsv($fd,128,"\n");& if ($s==false)& && echo $s[0]."\n";}?&& But... keep reading....&&& I wroteHello,Sometimes I hate PHP... ;)Right today I was trapped by some strange bug in my code with reading stdin using fgetcsv.After a not small investigation I found that strings like "foo\nboo\ndoo"goo\n (take note of double quatation sign in it)interpreted by fgetcsv like:1-&foo\nboo\ndoo2-&goosince double quotation mark has a special meaning and get stripped off of the input stream.Indeed, according to PHP manual:[quote]array fgetcsv ( int fp, int length [, string delimiter [, string enclosure]])[skip]another delimiter with the optional third parameter. _The_enclosure_character_is_double_quote_,_unless_it_is_specified_.[skip]_enclosure_is_added_from_PHP 4.3.0.& & && !!!!!![/quote]Means no chance for us prior to 4.3.0 :(But file() works just fine !!!! Of course by the price of memory, so be careful with large files.set_magic_quotes_runtime(0); // important, do not forget it !!!$s=file("php://stdin");for ($i=0,$n=sizeof($s);$i&$n;$i++){& do_something_useful(rtrim($s[$i]));}Conclusion:1. If you have no double quotation mark in your data use fgetcsv2. From 4.3.0 use&& fgetcsv($fd,"\n",""); // I hope it will help3. If you data is not huge use file("php://stdin");Hope now it's cleared for 100% ()Good luck!DimPS. Don't forget that it's only Solaris specific problem. Under Linux just use usual fgets()...
If you want to get the output of a command use the function shell_exec($command) - it returns a string with the output of the command.
Assuming --prefix=/usr/local/php, it's better to create a symlink from /usr/bin/php or /usr/local/bin/php to target /usr/local/php/bin/php so that it's both in your path and automatically correct every time you rebuild.& If you forgot to do that copy of the binary after a rebuild, you can do all kinds of wild goose chasing when things break.
In Windows [NT4.0 sp6a] the example php -r ' echo getcwd();' It appears you have to use the following php -r "echo getcwd();" --not the " around the command&& to get the output to screen , just took me half an hour to figure out what was going on.
A simple way to check if script is running from browser or cli.
&?php
if(defined('STDIN') )
& echo("Running from CLI");
else
& echo("Not Running from CLI");
?&
In a bid to save time out of lives when calling up php from the Command Line on Mac OS X. I just wasted hours on this. Having written a routine which used the MCRYPT library, and tested it via a browser, I then set up a crontab to run the script from the command line every hour (to do automated backups from mysql using mysqldump, encrypt them using mcrypt, then email them and ftp them off to remote locations). Everything worked fine from the browser, but failed every time from the cron task with "Call to undefined function: mcrypt [whatever]". Only after much searching do I realise that the CGI and CLI versions are differently compiled, and have different modules attached (I'm using the entropy.ch install for Mac OS-X, php v4.3.2 and mysql v4.0.18).I still can not find a way to resolve the problem, so I have decided instead to remove the script from the SSL side of the server, and run it using a crontab with CURL to localhost or 127.0.0.1 in order that it will run through Apache's php module.Just thought this might help some other people tearing their hair out. If anyone knows a quick fix to add the mcrypt module onto the CLI php without any tricky re-installing, it'd be really helpful.Meantime the workaround does the job, not as neatly though.
I had problems running php as CGI in thttpd. I have followed instructions posted by db at digitalmediacreation dot ch, but I was still getting "500 Internal Error" answer from the server. However, I had no problems running php as CLI using a simple wrapper file named index.cgi:#!/usr/bin/php&?php& require_once 'index.php';?&but i needed to pass user data through GET and POST, and this method couldn't handle it. I have spent 2 hours figuring out how to run the CGI mode properly, until I finally gave up, and done it in "manual" way. I have just added some code to the wrapper that reads GET and POST data into the proper variables:#!/usr/bin/php&?php& parse_str($_SERVER['QUERY_STRING'], $_GET);& & if (($_SERVER['REQUEST_METHOD'] === 'POST')&& && ($_SERVER['CONTENT_LENGTH'] & 0))& {& & parse_str(fread(STDIN, $_SERVER['CONTENT_LENGTH']), $_POST);& }& require_once 'index.php';?&It works well for me. It may be useful if someone else have similar problem.
i use emacs in c-mode for editing.& in 4.3, starting a cli script like so:#!/usr/bin/php -q /* -*- c -*- */&?phptold emacs to drop into c-mode automatically when i loaded the file for editing.& the '-q' flag didn't actually do anything (in the older cgi versions, it suppressed html output when the script was run) but it caused the commented mode line to be ignored by php.in 5.2, '-q' has apparently been deprecated.& replace it with '--' to achieve the 4.3 invocation-with-emacs-mode-line behavior:#!/usr/bin/php -- /* -*- c -*- */&?phpdon't go back to your 4.3 system and replace '-q' with '--'; it seems to cause php to hang waiting on STDIN...
PHP 4.3 and above automatically have STDOUT, STDIN, and STDERR openned ... but & 4.3.0 do not.& This is how you make code that will work in versions previous to PHP 4.3 and future versions without any changes:
&?php
& & if (version_compare(phpversion(),'4.3.0','&')) {
& & & & define('STDIN',fopen("php://stdin","r"));
& & & & define('STDOUT',fopen("php://stout","r"));
& & & & define('STDERR',fopen("php://sterr","r"));
& & & & register_shutdown_function( create_function( '' , 'fclose(STDIN); fclose(STDOUT); fclose(STDERR);' ) );
& & }
$str = fgets(STDIN,256);
?&
I've just found that the fact that the CLI does *not* change the current directory will make include() and require() calls with relative paths fail. This is because they are relative to the current directory, not to the current executing file, the documentation notwithstanding. In CGI mode, this is the same because it changes the current directory.One solution is to call the CGI binary rather than the CLI one. A better solutions is to use dirname(__FILE__) in your path names.
For command-line option definition and parsing, don't forget about the beauty of getopt().There's a php-native version () and a PEAR package -- Console_GetOpt ().
To allow a "zero" option value:replace:$ret['options'][$com] = !empty($value) ? $value :by:$ret['options'][$com] = (strlen($value) & 0 ? $value : true);In the sample below.Thanks to Chris Chubb to point me out the problem
#!/usr/bin/php -q
&?php
class arg_parser {
& & var $argc;
& & var $argv;
& & var $parsed;
& & var $force_this;
& & function arg_parser($force_this="") {
& & & & global $argc, $argv;
& & & & $this-&argc = $argc;
& & & & $this-&argv = $argv;
& & & & $this-&parsed = array();
& & & &
& & & & array_push($this-&parsed,
& & & & & & & & & & & & && array($this-&argv[0]) );
& & & & if ( !empty($force_this) )
& & & & & & if ( is_array($force_this) )
& & & & & & & & $this-&force_this = $force_this;
& & & & if ( $this-&argc & 1 ) {
& & & & & & for($i=1 ; $i& $this-&argc ; $i++) {
& & & & & & & & if ( substr($this-&argv[$i],0,1) == "-" ) {
& & & & & & & & & & if ( $this-&argc & ($i+1) ) {
& & & & & & & & & & & & if ( substr($this-&argv[$i+1],0,1) != "-" ) {
& & & & & & & & & & & & & & array_push($this-&parsed,
& & & & & & & & & & & & & & & & array($this-&argv[$i],
& & & & & & & & & & & & & & & & & & $this-&argv[$i+1]) );
& & & & & & & & & & & & & & $i++;
& & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & array_push($this-&parsed,
& & & & & & & & & & & & & & & & & & & & & & & & & array($this-&argv[$i]) );
& & & & & & }
& & & & }
& & & & & & & & $this-&force();
& & }
& & function passed($argumento) {
& & & & for($i=0 ; $i& $this-&argc ; $i++)
& & & & & & if ( $this-&parsed[$i][0] == $argumento )
& & & & & & & & return $i;
& & & & return 0;
& & }
& & function full_passed($argumento) {
& & & & $findArg = $this-&passed($argumento);
& & & & if ( $findArg )
& & & & & & if ( count($this-&parsed[$findArg] ) & 1 )
& & & & & & & & return $findArg;
& & & & return 0;
& & }
& & & & function get_full_passed($argumento) {
& & & & & & & & $findArg = $this-&full_passed($argumento);
& & & & & & & & if ( $findArg )
& & & & & & & & & & return $this-&parsed[$findArg][1];
& & & & & & & &
& & & & }
& &
& & function force() {
& & & & if ( is_array( $this-&force_this ) ) {
& & & & & & for($i=0 ; $i& count($this-&force_this) ; $i++) {
& & & & & & & & if ( $this-&force_this[$i][1] == "SIMPLE"
& & & & & & & & & && && !$this-&passed($this-&force_this[$i][0])
& & & & & & & & )
& & & & & & & & & & die("\n\nMissing " . $this-&force_this[$i][0] . "\n\n");
& & & & & & & & & & & & & & & & if ( $this-&force_this[$i][1] == "FULL"
& & & & & & & & & & & & & & & & & && && !$this-&full_passed($this-&force_this[$i][0])
& & & & & & & & )
& & & & & & & & & & & & & & & & & & & & die("\n\nMissing " . $this-&force_this[$i][0] ." &arg&\n\n");
& & & & & & }
& & & & }
& & }
}
$forcar = array(
& & & & array("-name", "FULL"),
& & & & array("-email","SIMPLE") );
$parser = new arg_parser($forcar);
if ( $parser-&passed("-show") )
& & echo "\nGoing...:";
echo "\nName: " . $parser-&get_full_passed("-name");
if ( $parser-&full_passed("-email") )&
& & echo "\nEmail: " . $parser-&get_full_passed("-email");
else
& & & & echo "\nEmail: default";
if ( $parser-&full_passed("-copy") )
& & & & echo "\nCopy To: " . $parser-&get_full_passed("-copy");
echo "\n\n";
?&
TESTING
=====
[diego@Homer diego]$ ./en_arg_parser.php -name -email cool -copy Ana
Missing -name &arg&
[diego@Homer diego]$ ./en_arg_parser.php -name diego -email cool -copy Ana
Name: diego
Email: cool
Copy To: Ana
[diego@Homer diego]$ ./en_arg_parser.php -name diego -email& -copy Ana
Name: diego
Email: default
Copy To: Ana
[diego@Homer diego]$ ./en_arg_parser.php -name diego -email
Name: diego
Email: default
[diego@Homer diego]$
You could use the Linux way of knowing that everything went ok by dying with a numeric code: 0 if everything went ok and practically anything else if something goes terribly wrong. T&?php echo 'hello';exit(0);?&&?php echo 'bye';exit(1);?&&?php echo 'hi world!';exit(0);?&calling:php hello.php && php bye.php && php hello-again.phpwould only execute the first two scripts, the last one doesn't get executed because an error ocurred in that script.Greetings.
I was looking for a way to interactively get a single character response from user. Using STDIN with fread, fgets and such will only work after pressing enter. So I came up with this instead:
#!/usr/bin/php -q
&?php
function inKey($vals) {
& & $inKey = "";
& & While(!in_array($inKey,$vals)) {
& & & & $inKey = trim(`read -s -n1echo \$valu`);
& & }
& & return $inKey;
}
function echoAT($Row,$Col,$prompt="") {
& & echo "\033[".$Row.";".$Col."H".$prompt;
}
& & echoAT(10,10,"Opt : ");
& & $options = array("1","2","3","4","X");
& & $key = inKey($options);
& & echoAT(12,10,"Pressed : $key\n");
?&
Hope this helps someone.
Here's& my modification of "thomas dot harding at laposte dot net" script (below) to read arguments from $argv of the form --name=VALUE and -flag."Input":./script.php -a arg1 --opt1 arg2 -bcde --opt2=val2 arg3 arg4 arg5 -fg --opt3"print_r Output":Array(& & [exec] =& ./script.php& & [options] =& Array& & & & (& & & & & & [0] =& opt1& & & & & & [1] =& Array& & & & & & & & (& & & & & & & & & & [0] =& opt2& & & & & & & & & & [1] =& val2& & & & & & & & )& & & & & & [2] =& opt3& & & & )& & [flags] =& Array& & & & (& & & & & & [0] =& a& & & & & & [1] =& b& & & & & & [2] =& c& & & & & & [3] =& d& & & & & & [4] =& e& & & & & & [5] =& f& & & & & & [6] =& g& & & & )& & [arguments] =& Array& & & & (& & & & & & [0] =& arg1& & & & & & [1] =& arg2& & & & & & [2] =& arg3& & & & & & [3] =& arg4& & & & & & [4] =& arg5& & & & ))&?phpfunction arguments($args ) {& & $ret = array(& & & & 'exec'& & & =& '',& & & & 'options'&& =& array(),& & & & 'flags'& && =& array(),& & & & 'arguments' =& array(),& & );& & $ret['exec'] = array_shift( $args );& & while (($arg = array_shift($args)) != NULL) {& & & & if ( substr($arg, 0, 2) === '--' ) {& & & & & & $option = substr($arg, 2);& & & & & & if (strpos($option,'=') !== FALSE)& & & & & & & & array_push( $ret['options'], explode('=', $option, 2) );& & & & & & else& & & & & & & & array_push( $ret['options'], $option );& & & & & & & & & & & && & & & }& & & & if ( substr( $arg, 0, 1 ) === '-' ) {& & & & & & for ($i = 1; isset($arg[$i]) ; $i++)& & & & & & & & $ret['flags'][] = $arg[$i];& & & & & && & & & }& & & & $ret['arguments'][] = $arg;& & & && & }& & return $ret;}?&
Just another variant of previous script that group arguments doesn't starts with '-' or '--'
&?php
function arguments($argv) {
& & $_ARG = array();
& & foreach ($argv as $arg) {
& & & if (ereg('--([^=]+)=(.*)',$arg,$reg)) {
& & & & $_ARG[$reg[1]] = $reg[2];
& & & } elseif(ereg('^-([a-zA-Z0-9])',$arg,$reg)) {
& & & & & & $_ARG[$reg[1]] = 'true';
& & & } else {
& & & & & & $_ARG['input'][]=$arg;
& & & }
& & }
& return $_ARG;
}
print_r(arguments($argv));
?&
$ php myscript.php --user=nobody /etc/apache2/*
Array
(
& & [input] =& Array
& & & & (
& & & & & & [0] =& myscript.php
& & & & & & [1] =& /etc/apache2/apache2.conf
& & & & & & [2] =& /etc/apache2/conf.d
& & & & & & [3] =& /etc/apache2/envvars
& & & & & & [4] =& /etc/apache2/httpd.conf
& & & & & & [5] =& /etc/apache2/mods-available
& & & & & & [6] =& /etc/apache2/mods-enabled
& & & & & & [7] =& /etc/apache2/ports.conf
& & & & & & [8] =& /etc/apache2/sites-available
& & & & & & [9] =& /etc/apache2/sites-enabled
& & & & )
& & [user] =& nobody
)
When you're writing one line php scripts remember that 'php://stdin' is your friend. Here's a simple program I use to format PHP code for inclusion on my blog:UNIX:& cat test.php | php -r "print htmlentities(file_get_contents('php://stdin'));"DOS/Windows:& type test.php | php -r "print htmlentities(file_get_contents('php://stdin'));"
I find regex and manually breaking up the arguments instead of havingon $_SERVER['argv'] to do it more flexiable this way.cli_test.php asdf asdf --help --dest=/var/ -asd -h --option mew arf moo -z& & Array& & (& & & & [input] =& Array& & & & & & (& & & & & & & & [0] =& asdf& & & & & & & & [1] =& asdf& & & & & & )& & & & [commands] =& Array& & & & & & (& & & & & & & & [help] =& 1& & & & & & & & [dest] =& /var/& & & & & & & & [option] =& mew arf moo& & & & & & )& & & & [flags] =& Array& & & & & & (& & & & & & & & [0] =& asd& & & & & & & & [1] =& h& & & & & & & & [2] =& z& & & & & & )& & )&?phpfunction arguments ( $args ){& & array_shift( $args );& & $args = join( $args, ' ' );& & preg_match_all('/ (--\w+ (?:[= ] [^-]+ [^\s-] )? ) | (-\w+) | (\w+) /x', $args, $match );& & $args = array_shift( $match );& & $ret = array(& & & & 'input'& & =& array(),& & & & 'commands' =& array(),& & & & 'flags'& & =& array()& & );& & foreach ( $args as $arg ) {& & & & if ( substr( $arg, 0, 2 ) === '--' ) {& & & & & & $value = preg_split( '/[= ]/', $arg, 2 );& & & & & & $com&& = substr( array_shift($value), 2 );& & & & & & $value = join($value);& & & & & & $ret['commands'][$com] = !empty($value) ? $value : true;& & & & & && & & & }& & & & if ( substr( $arg, 0, 1 ) === '-' ) {& & & & & & $ret['flags'][] = substr( $arg, 1 );& & & & & && & & & }& & & & $ret['input'][] = $arg;& & & && & }& & return $ret;}print_r( arguments( $argv ) );?&
Here are some instructions on how to make PHP files executable from the command prompt in Win2k.& I have not tested this in any other version of Windows, but I'm assuming it will work in XP, but not 9x/Me.There is an environment variable (control panel-&system-&advanced-&environment variables) named PATHEXT.& This is a list of file extensions Windows will recognize as executable at the command prompt.& Add .PHP (or .PL, or .CLASS, or whatever) to this list.& Windows will use the default action associated with that file type when you execute it from the command prompt.To set up the default action:Open Explorer.Go to Tools-&folder options-&file typesFind the extension you're looking for.& If it's not there, click New to add it.Click on the file type, then on Advanced, then New.For the action, type "Run" or "Execute" or whatever makes sense.For the application, type& {path to application} "%1" %*The %* will send any command line options that you type to the program.The application field for PHP might look like& c:\php\php.exe -f "%1" -- %*(Note, you'll probably want to use the command line interface version php-cli.exe)or for Java& c:\java\java.exe "%1" %*Click OK.Click on the action that was just added, then click Set default.If this helps you or if you have any changes/more information I would appreciate a note.& Just remove NOSPAM from the email address.
Here's &losbrutos at free dot fr& function modified to support unix like param syntax like &B Crawford& mentions:&?phpfunction arguments($argv) {& & $_ARG = array();& & foreach ($argv as $arg) {& & & & if (preg_match('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#', $arg, $matches)) {& & & & & & $key = $matches[1];& & & & & & switch ($matches[2]) {& & & & & & & & case '':& & & & & & & & case 'true':& & & & & & & & $arg = true;& & & & & & & && & & & & & & & case 'false':& & & & & & & & $arg = false;& & & & & & & && & & & & & & & default:& & & & & & & & $arg = $matches[2];& & & & & & }& & & & & & & & & & & & if(preg_match("/^-([a-zA-Z0-9]+)/", $matches[0], $match)) {& & & & & & & & $string = $match[1];& & & & & & & & for($i=0; strlen($string) & $i; $i++) {& & & & & & & & & & $_ARG[$string[$i]] = true;& & & & & & & & }& & & & & & } else {& & & & & & & & $_ARG[$key] = $arg;& & & & & & & & }& & & & & & & & & & } else {& & & & & & $_ARG['input'][] = $arg;& & & & }& & & & & & }& & return $_ARG;& & }?&Sample:eromero@ditto ~/workspace/snipplets $ foxogg2mp3.php asdf asdf --help --dest=/var/ -asd -hArray(& & [input] =& Array& & & & (& & & & & & [0] =& /usr/local/bin/foxogg2mp3.php& & & & & & [1] =& asdf& & & & & & [2] =& asdf& & & & )& & [help] =& 1& & [dest] =& /var/& & [a] =& 1& & [s] =& 1& & [d] =& 1& & [h] =& 1)
I'm figuring out how to pipe an email to a php script with postfix. For the email :I created the following line in /etc/aliases:user:& & & & "|/www/file.php"file.php is chmod 755This works fine. But I wanted to test this without having to send an email every time. And this took some searching to figure out, yet it's oh-so simple:To pipe the file email.txt to the script, write the following in the terminal window:user@host: php file.php & testepost.txtI was confused by the | in the aliases file, and didn't get what came after what, etc etc.Regards,Willy T. KochNorway
Here's an update to the script a couple of people gave below to read arguments from $argv of the form --name=VALUE and -flag. Changes include:
Don't use $_ARG - $_ is generally considered reserved for the engine.
Don't use regex where a string operation will do just as nicely
Don't overwrite --name=VALUE with -flag when 'name' and 'flag' are the same thing
Allow for VALUE that has an equals sign in it
&?php
function arguments($argv) {
& & $ARG = array();
& & foreach ($argv as $arg) {
& & & & if (strpos($arg, '--') === 0) {
& & & & & & $compspec = explode('=', $arg);
& & & & & & $key = str_replace('--', '', array_shift($compspec));
& & & & & & $value = join('=', $compspec);
& & & & & & $ARG[$key] = $value;
& & & & } elseif (strpos($arg, '-') === 0) {
& & & & & & $key = str_replace('-', '', $arg);
& & & & & & if (!isset($ARG[$key])) $ARG[$key] = true;
& & & & }
& & }
& & return $ARG;
}
?&
an another "another variant" :&?phpfunction arguments($argv){& $_ARG = array();& foreach ($argv as $arg)& {& & if (preg_match('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#', $arg, $matches))& & {& & & $key = $matches[1];& & & switch ($matches[2])& & & {& & & & case '':& & & & case 'true':& & & & & $arg = true;& & & & && & & & case 'false':& & & & & $arg = false;& & & & && & & & default:& & & & & $arg = $matches[2];& & & }& & & $_ARG[$key] = $arg;& & }& & else& & {& & & $_ARG['input'][] = $arg;& & }& }& return $_ARG;}?&$php myscript.php arg1 -arg2=val2 --arg3=arg3 -arg4 --arg5 -arg6=falseArray(& & [input] =& Array& & & & (& & & & & & [0] =& myscript.php& & & & & & [1] =& arg1& & & & )& & [arg2] =& val2& & [arg3] =& arg3& & [arg4] =& true& & [arg5] =& true& & [arg5] =& false)
I append this to most of my PHP files, to allow command line unit testing of a class.& It ensures that the unit test is only run if the script is run directly, and won't be triggered by an include from another CLI script.&?phpif (!empty($argc) && strstr($argv[0], basename(__FILE__))) {&& $test = new TestClass();&& $rv = $test-&Test();&& die("Test returned $rv\n");}?&
Instead of all these long and .. interesting .. ways to check if you're running from cli, you could always do this:&?phpfunction isCli() {& & return php_sapi_name()==="cli";}?&

我要回帖

更多关于 o2o是什么意思 的文章

 

随机推荐