2024年波兰PHPC

从命令行使用PHP

目录

介绍

主要关注点CLI(命令行界面) SAPI公司用于使用PHP开发shell应用程序。那里CLI(命令行界面) SAPI公司和其他SAPI公司在本章中解释。这是值得的提到这个CLI(命令行界面)CGI公司是不同的SAPI公司虽然他们有很多相同的行为。

这个CLI(命令行界面) SAPI公司默认情况下使用启用--启用-cli,但可以使用禁用这个--禁用cli运行时的选项./配置.

名称、位置和存在CLI(命令行界面)/CGI公司二进制文件会因PHP在系统上的安装方式而异。执行时默认制作,两个CGI公司CLI(命令行界面)建造和放置为sapi/cgi/php-cgisapi/cli/php分别位于PHP源目录中。您会注意到这两个名称都是php(电话).期间发生了什么进行安装取决于您的配置行。如果模块SAPI公司在配置期间选择,例如apxs,或--禁用cgi选项,则CLI(命令行界面)复制到{前缀}/bin/php在期间进行安装否则CGI公司已放置那里。例如,如果--带像素在配置行中,然后CLI(命令行界面)复制到{前缀}/bin/php在期间进行安装。如果要覆盖安装CGI公司二进制,使用制作安装-cli之后进行安装。或者您可以指定--禁用cgi在您的配置中行。

注释:

因为两者都是--启用-cli--启用cgi默认情况下启用,仅仅拥有--启用-cli在您的配置行不一定意味着CLI(命令行界面)将复制为{前缀}/bin/php在期间进行安装.

这个CLI(命令行界面)二进制文件在主文件夹中作为php.exe文件在Windows上。这个CGI公司版本为分发为php-cgi.exe公司此外php-win.exe如果使用配置PHP,则为分布式--enable-cli-win32。这与这个CLI(命令行界面)版本,除了它不输出任何内容,因此提供没有控制台。

注释:我有什么SAPI?

从shell中键入php-v会告诉你的是否php(电话)CGI公司CLI(命令行界面)。请参阅还有功能php_sapi_name()和常数PHP_SAPI公司.

注释:

一个Unix男人通过键入可以访问ual页面男人php(电话)在shell环境中。

添加注释

用户贡献的笔记33条注释

9月16日在psu dote edu
12年前
通过使用parse_str()函数,可以轻松地将命令行参数解析为$_GET变量。

<?php(电话)

解析str
(内爆('&',数组_切片($argv(美元),1)),$_GET(获取));

?>

它的行为与您对cgi-php的预期完全一样。

$php-f somefile.php a=1b[]=2b[]=3

这将把$_GET['a']设置为“1”,将$_GET['b']设置成数组('2','3')。

更好的是,不要将该行放在每个文件中,而是利用PHP的auto_prepend_file指令。将该行放入其自己的文件中,并在特定于cli的php.ini中设置auto_prepend_file指令,如下所示:

auto_prepend_file=“/etc/php/cli-php5.3/local.prepend.php”

它将自动添加到从命令行运行的任何PHP文件中。
美国dotnet上的apmuthu
6年前
向PHP添加pause()函数,等待任何用户输入返回:

<?php(电话)
功能暂停() {
$句柄=fopen公司("php://标准输入",“r”);
做{
$行=fgets公司($句柄); } 同时($行=='');
f关闭($句柄);
返回
$行
}
?>
弗兰克·诺斯帕姆想要在点上。判定元件
9年前
解析命令行参数GET String而不更改PHP脚本(linux shell):
网址:index.php?a=1和b=2
结果:output.html

echo“”|php-R'包含(“index.php”);'-B“parse_str($argv[1],$_GET);”a=1&b=2'>输出.html

(无需更改php.ini)

你可以把这个
echo“”|php-R'包含(“$1”);'-B'parse_str($argv[1],$_GET);'"$2"
在bash脚本“php_get”中这样使用:
php_get index.php'a=1&b=2'>输出.html
或定向到文本浏览器。。。
php_get索引.php'a=1&b=2'| w3m-T文本/html
lucas dot vasconcelos在gmail网站
16年前
只是前一个脚本的另一个变体,它将参数分组为不以“-”或“--”开头

<?php(电话)
功能论据($argv(美元)){
$_ARG(美元)=阵列();
foreach公司(
$argv(美元)作为$参数){
如果(
埃雷格('--([^=]+)=(.*)',$参数,$reg(美元))) {
$_ARG(美元)[$reg(美元)[1]] =$reg(美元)[2];
}埃尔塞夫(
埃雷格(“^-([a-zA-Z0-9])”,$参数,$reg(美元))) {
$_ARG(美元)[$reg(美元)[1]] =“true”
}其他{
$_ARG(美元)[“输入”][]=$参数
}
}
返回
$_ARG(美元)
}

打印(r)(论据($argv(美元)));
?>

$php myscript.php--user=nobody/etc/apache2/*
阵列
(
[input]=>数组
(
[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可用
[6] =>/etc/apache2/mods已启用
[7] =>/etc/apache2/ports.conf
[8] =>/etc/apache2/sites可用
[9] =>/etc/apache2/已启用站点
)

[user]=>没有人
)
PSIKYO在邮件点dlut点edu点cn
10年前
如果您在windows中编辑php文件,请使用命令行方法在linux上上传并运行它。您可能会遇到这样的运行问题:

[root@ItsCloud02wsdl]#/lnxcli.php公司
扩展名“/lnxcli.php不存在。

或者你可能会遇到其他奇怪的问题。
注意输入键。在windows环境中,输入key生成两个二进制字符“0D0A”。但在Linux中,输入key只生成一个“OA”。
如果您正在使用windows编写php代码,并将其作为命令行程序在linux上运行,我希望它能对某些人有所帮助。
163点com上的ohcc
7年前
在windows上使用带有-r的cli版本时使用“代替”

php-r“echo 1”
--正确

php-r“echo 1”
PHP分析错误:语法错误,意外的“'echo'(T_ENCAPSED_AND_WHITESPACE),第1行的命令行代码中应为文件尾
凯瑟琳豪斯网络公司的drewish
18年前
当您编写单行php脚本时,请记住“php://标准输入“是你的朋友。下面是一个简单的程序,我用它格式化PHP代码,以便包含在我的博客中:

UNIX:
cat test.php | php-r“打印htmlentities(file_get_contents('php://标准输入'));"

DOS/窗口:
type test.php | php-r“打印htmlentities(file_get_contents('php://stdin文件'));"
monte at ispi点网
21年前
当$argv值包含加号(+)时,我遇到了一个问题,即它们被拆分。一定要使用CLI版本,而不是CGI来绕过它。

蒙特
科达特
12年前
不调用函数直接检查:
<?php(电话)
如果(PHP_SAPI公司===“cli”)
{
// ...
}
?>

您可以定义一个常量以在其他地方使用
<?php(电话)
定义
(“ISCLI”,PHP_SAPI公司===“cli”);
?>
匿名
3年前
我们可以将许多参数直接传递到hashbang行。
例如,许多ini设置都是通过php的-d参数进行的。
---
#!/usr/bin/php-d内存限制=2048M-d post_max_size=0
phpinfo();
出口;
---
./script|grep内存
内存限制=>2048M=>2048 M
---
但我们也可以在第二个脚本中使用此行为,因此它通过hashbang调用第一个脚本作为解释器:
---
#!./脚本arg1 arg2 arg3
---
然而,参数以不同的方式发送到$argv

所有参数都在$argv[1]中,$argv[0]是解释器脚本名称,$argv[1]是调用方脚本名称。

要将参数返回到$argv中,只需测试$argv[1]是否包含空格,然后按正常方式再次发送:

#!/usr/bin/php-d内存限制=2048M-d post_max_size=0
<?php(电话)
变量转储
($argv(美元));
如果(
斯特波斯($argv(美元)[1],' ') !==){
$argw(美元)=爆炸(" ",$argv(美元)[1]);
阵列_取消移动($argw(美元),$argv(美元)[2]);
$argv(美元)=$argw(美元)
}
变量转储($argv美元);?>
---
数组(3){
[0]=>
字符串(8)“./script”
[1]=>
string(15)“arg1 arg2 arg3”
[2]=>
string(14)“./other_script”
}
数组(4){
[0]=>
字符串(8)“./other_script”
[1]=>
字符串(4)“arg1”
[2]=>
字符串(4)“arg2”
[3]=>
字符串(4)“arg3”
}
---
这将在所有情况下保持相同的行为,甚至可以双击脚本来调用另一个脚本的两个参数,甚至可以创建完整的解释器语言层。另一个脚本不一定是php。注意路径。
本在slaxrnet网站
20年前
对于试图从命令行使用交互模式的人来说,这只是一个注意事项。

交互模式的目的是在不离开php的情况下解析代码片段,其工作原理如下:

[root@localhostphp-4.3.4]#php-a
已启用交互模式

<?php(电话)回声“嗨!”?>
<注意,这里我们将按CTRL-D来解析到目前为止输入的所有内容>
你好!
<?php(电话)退出();?>
<ctrl-d再次出现>
[root@localhostphp-4.3.4]#

我注意到这是从医生那里得到的,希望它能帮助别人!
不是somerandomaddr dot com的真实地址
14年前
如果您想与用户交互并接受用户输入,只需从stdin中读取即可。

<?php(电话)
回声“是否确实要执行此操作?键入“是”继续:”
$句柄=fopen公司("php://标准输入",“r”);
$行=fgets公司($句柄);
如果(
修剪($行) !=“是”){
回声
“正在中止!\n”
出口;
}
回声
“\n”
回声
“谢谢,继续…\n”
?>
gmail dot com上的溢出636
18年前
我需要这个,你不会的。
将出口参数放入$_GET
<?php(电话)
如果($argv(美元)){
foreach公司(
$argv(美元)作为千美元=>$v(美元))
{
如果(
千美元==0)继续;
美元=爆炸(“=”,$argv(美元)[1美元]);
如果(isset(
美元[1]))$_GET(获取)[美元[0]] =美元[1];
}
}
?>
萨姆·马歇尔
5年前
使用-R标志时,包含当前行内容(不包括LF)的变量的名称为$argn。

例如,您可以执行以下代码:

cat file.txt | php-R’echo$argn。“\n”;'

这将只输出输入文件的每一行,而不对其进行任何操作。
托马斯·多特·哈丁在拉普斯特网点
15年前
解析命令行:优化是邪恶的!

这个页面上所有的贡献者都忘记了一件事,那就是你可以用单引号或双引号来搜索argv。因此,与preg_match_all耦合在一起的连接总是会打破这一点:)

这里有一个建议:

#!/usr/bin/php
<?php(电话)
打印(r)
(论据($argv(美元)));

功能
论据($个参数)
{
阵列_移位($个参数);
$内选项=

$ret(美元)=数组
(
“命令”=>数组(),
'选项'=>数组(),
'标志'=>数组(),
'参数'=>数组(),
);

同时(
$参数=阵列_移位($个参数) )
{

//如果我们已经到了选项的末尾,
//我们将所有剩余的argv强制转换为参数
如果($内选项)
{
$ret美元['参数'][] =$参数
继续;
}

//这是命令吗?(前缀为--)
如果(子(substr)($参数,0,2) ==='--')
{

//这是选项结束标志吗?
if(!is设置($参数[]))
{
$内选项=真的;;//期权终止;
继续;
}

价值$=""
$com美元=子(substr)($参数,2);

//它是语法“--option=argument”吗?
如果(斯特波斯($com美元,'='))
列表(
$com美元,价值$) =分裂("=",$com美元,2);

//选项后面不是另一个选项而是参数
埃尔塞夫(斯特波斯($个参数[0],'-') !==0)
{
同时(
斯特波斯($个参数[0],'-') !==0)
价值$=阵列_移位($个参数).' '
价值$=rtrim公司(价值$,' ');
}

$ret(美元)['选项'][$com美元] = !空(价值$)?价值$:真的
继续;

}

//它是一个旗帜还是一系列旗帜?(前缀为-)
如果(子(substr)($参数,0,1) ==='-')
{
对于(
$i美元=1; 发行($参数[1美元]);1美元++)
$ret美元['标志'][] =$参数[1美元];
继续;
}

//最后,它不是选项、标志或参数
$ret(美元)[“命令”][] =$参数
继续;
}

如果(!
计数($ret(美元)['选项']) && !计数($ret(美元)['标志']))
{
$ret(美元)['参数'] =阵列_合并($ret(美元)[“命令”],$ret(美元)['参数']);
$ret(美元)[“命令”]=阵列();
}
返回
$ret(美元)
}

退出(
0)

/*vim:设置expandtab tabstop=2 shiftwidth=2:*/
?>
抢劫
17年前
我在c模式下使用emacs进行编辑。在4.3中,像这样启动cli脚本:

#!/usr/bin/php-q/*-*-c-*-*/
<?php(电话)

告诉emacs加入c
-加载文件时自动模式对于编辑.这个“-q”旗帜没有实际上,它没有做任何事情(在较旧的cgi版本中,它在运行脚本时禁止html输出),但它导致php忽略注释的模式行。

在5.2中,'
-q个”显然已被弃用。将其替换为“--'以使用emacs模式行行为实现4.3调用:

#!/usr/bin/php--/*-*-c-*-*/
<?php(电话)

不要
不要回到4.3系统代替“-q”具有'--'这似乎导致php挂起等待STDIN...
匿名
13年前
使用CLI(至少在WIN上),一些INI路径是相对于当前工作目录的。例如,如果您的error_log=“php_errors.log”,那么如果您有写访问权限,那么将在您当前所在的任何目录中创建(或追加到其中,如果已经存在)php_errors.log。由于这种行为,您可能希望将error_log设置为完整路径,可能是php.exe目录,而不是到处都有随机错误日志。
jeff at noSpam[]dot genhex dot net
21年前
您还可以在chmod文件(即:chmod 755 file.php)之后从命令行调用该脚本。

在文件的第一行中,输入“#!/usr/bin/php”(或到php可执行文件所在的位置)。如果要禁止显示PHP头,请在路径中使用“#!/usr/bin/PHP-q”行。
守门员吃gmail don com
17年前
如果php脚本没有与shebang(#!/usr/bin/php)一起运行,
并发出美丽且信息丰富的错误消息:
“找不到命令。”只需dos2unix yourscript.php
等等,瞧。

如果您仍然收到“找不到命令”
请尝试将其作为运行/myscript.php,带有“./”
如果有效,则表示当前目录不在可执行搜索路径中。

如果php脚本没有与shebang(#/usr/bin/php)一起运行,
它发出了美丽而翔实的信息:
“无效的null命令。”这可能是因为shebang行(如上面所示)中缺少“!”或该区域中的其他内容。

\阿龙
gmail dot com的roberto dot dimas
19年前
我喜欢perl和vbscripts的一点是,我可以命名一个文件,例如“test.pl”,只需在windows命令行上键入“test,但不带.pl扩展名”,命令处理程序就会知道它是一个perl文件,并使用perl命令解释程序执行它。

我对文件扩展名.php3也做了同样的操作(我将只对命令行php脚本使用php3,因为我的文本编辑器VIM 6.3已经为.php3文件提供了正确的语法高亮显示)。

我在Windows XP中从“系统”控制面板小程序->“高级”选项卡->“环境变量”按钮->“系统变量”文本区域修改了PATHEXT环境变量。

然后从控制面板“文件夹选项”小程序->“文件类型”选项卡,我添加了一个新的文件扩展名(php3),使用按钮“新建”并在弹出的窗口中键入php3。

然后在“php3扩展名的详细信息”区域中,我使用“更改”按钮查找Php.exe可执行文件,以便php3文件扩展名与Php可执行文件关联。

您还必须修改“PATH”环境变量,指向安装php可执行文件的文件夹

希望这对某人有用
位于ssilk dot de的php注释
21年前
要像HTTP-mode那样以交互模式移交GET-变量(例如,您的URI是myprog.html?hugo=bla&bla=hugo),您必须调用

php myprog.html“&hugo=bla&bla=hugo”

(两个&而不是?和&!)

$ARGC和$ARGV值略有不同,但我认为这与这些情况无关。
自由点fr处的losbrutos
16年前
另一个“另一种变体”:

<?php(电话)
功能论据($argv(美元))
{
$_ARG(美元)=阵列();
foreach公司(
$argv(美元)作为$参数)
{
如果(
预匹配(_M)('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#',$参数,$个匹配项))
{
$键=$个匹配项[1];
交换机(
$个匹配项[2])
{
案例
'':
案例
“true”:
$参数=真的
断裂;
案例
“false”:
$参数=
断裂;
违约:
$参数=$个匹配项[2];
}
$_ARG(美元)[$键] =$参数
}
其他的
{
$_ARG(美元)[“输入”][] =$参数
}
}
返回
$_ARG(美元)
}
?>

$php myscript.php arg1-arg2=val2--arg3=arg3-arg4--arg5-arg6=false

阵列
(
[input]=>数组
(
[0]=>myscript.php
[1] =>arg1
)

[arg2]=>值2
[参数3]=>参数3
[arg4]=>真
[arg5]=>真
[参数5]=>假
)
埃里克·多布里森在anakeen dot com
17年前
只是前一个脚本的变体,它还接受带“=”的参数
<?php(电话)
功能论据($argv(美元)){
$_ARG(美元)=阵列();
foreach公司(
$argv(美元)作为$参数){
如果(
埃雷格('--([^=]+)=(.*)',$参数,$reg(美元))) {
$_ARG(美元)[$reg(美元)[1]] =$reg(美元)[2];
}埃尔塞夫(
埃雷格(“-([a-zA-Z0-9])”,$参数,$reg(美元))) {
$_ARG(美元)[$reg(美元)[1]] =“true”
}

}
返回
$_ARG(美元)
}
?>
$php myscript.php--user=nobody--password=secret-p--access=“host=127.0.0.1 port=456”
阵列
(
[user]=>没有人
[密码]=>机密
[p] =>真
[访问]=>主机=127.0.0.1端口=456
)
linn在backendmedia网站
20年前
对于那些希望更改为脚本实际目录的旧CGI行为的用户,请使用:
chdir(目录名($_SERVER['argv'][0]);

在脚本的开头。
Adam,php(位于)getwebspace.com
20年前
好的,我对PHP>4.3.x以及是否使用CLI与CGI有过一段时间。4.3.2的CGI版本将返回(在浏览器中):
---
未指定输入文件。
---

CLI版本将返回:
---
500内部服务器错误
---

似乎在CGI模式下,PHP会查看环境变量PATH_TRANSLATED以确定要执行的脚本,并忽略命令行。这就是为什么在没有这个环境变量的情况下,您会得到“未指定输入文件”。但是,在CLI模式下,不会打印HTTP标头。我认为这是两种情况下的预期行为,但如果您有一个CGI包装器,它发送环境变量,但在命令行上传递实际的脚本名称,则会产生问题。

通过修改CGI包装器来创建这个PATH_TRANSLATED环境变量,它解决了我的问题,并且我能够运行4.3.2的CGI构建
多西
18年前
不知道这是否在linux上,但每次都在windows上
您向php等待的控制台屏幕发送了一些信息
要返回的控制台。因此,如果你寄很多小的
短文本,控制台开始使用
cpu循环次数多于php,从而减慢了脚本的速度。

看看这个展示:
cpu-cycle:1->php:print(“a”);
cpu循环:2->cmd:输出(“a”);
cpu-cycle:3->php:print(“b”);
cpu循环:4->cmd:输出(“b”);
cpu-cycle:5->php:print(“c”);
cpu循环:6->cmd:输出(“c”);
cpu-cyce:7->php:print(“d”);
cpu循环:8->cmd:输出(“d”);
cpu-cyce:9->php:print(“e”);
cpu循环:0->cmd:输出(“e”);

屏幕上只显示“abcd”。但如果你写
这样脚本速度会快得多:
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周期:7->cmd:输出(“abcde”);

现在这只是一个小例子,但如果您正在编写
向控制台输出大量内容(即文本)的应用程序
基于频繁更新的屏幕,这样会更好
首先cach所有输出,输出是作为一大块
文本,而不是每次一个字符。

输出缓冲是理想的选择。在我的脚本中,我输出了
将近4000个字符的信息,只要先缓存它
速度提高了近400%,减少了cpu的使用。

因为显示的内容无关紧要,不管是2
字符或40.0000个字符,仅对输出的调用需要
很多时间。记住这一点。

也许有人可以在基于unix的平台上测试这是否相同
系统。STDOUT流似乎只是等待
在继续执行之前,要准备好报告的控制台。
在emailaddress dot com上模糊显示
19年前
这篇帖子并不仅仅是一个php问题,但很有可能会让一些人省下几个小时的头痛。在MacOS上运行(虽然我认为这可能会发生在任何*nix上),但如果不从命令行中特别启用php,我就无法执行脚本:

[macg4:valencia/jobs]蒂姆%测试.php
./test.php:找不到命令。

然而,当在命令行中调用php时,它工作得很好:

[macg4:valencia/jobs]tim%php测试.php
好了,我们到了。。。现在怎么办?

是否为可执行文件设置了文件访问模式?是的。

[macg4:巴伦西亚/作业]tim%ls-l
总计16
-rwxr-xr-x 1 tim staff 242 2月24日17:23 test.php

当然,您确实记得在脚本的第一行添加php命令,是吗?当然。

#!/usr/bin/php
<?php(电话)打印“好了,我们到了……现在怎么办?”?>

那为什么它不起作用?嗯,就像我说的。。。在Mac上。。。。但我偶尔也会在我的Windows便携机上编辑文件(例如,当我旅行时,没有可信赖的Mac电脑)。。。在Windows上使用写字板。。。和Mac上的BBEdit。。。

啊啊。。。在BBEdit中检查文件是如何保存的!雨衣?Unix?还是Dos?宾果。它已保存为Dos格式。将其更改为Unix:

[macg4:valencia/jobs]蒂姆%/测试.php
好了,我们到了。。。现在怎么办?
[macg4:valencia/jobs]蒂姆%

注意:如果您在多个平台(即Windows和Linux)上编辑php文件,请确保仔细检查文件是否以Unix格式保存。。。那些人会咬你的!
bluej100@gmail公司
16年前
在5.1.2(我假设还有其他)中,-f表单会自动删除$_SERVER['argv']中脚本名称后面的第一个参数。我建议避免使用它,除非你在特殊情况下需要它。
亚历山大·普莱基丁
21年前
使用PHP 4.3.0从命令行运行PHP脚本时,如何将其当前目录更改为脚本目录?
(为了向后兼容,在PHP 4.3.0下运行旧脚本时,可能需要将其添加到旧脚本中)

我使用的是:
chdir(preg_replace('/\\/[^\\/]+$/',“”,$PHP_SELF);

注意:文档说明“PHP_SELF”在命令行PHP脚本中不可用。不过,它是可用的。这可能在未来版本中会更改,所以不要依赖这行代码。。。

如果register_globals=Off,请使用$_SERVER['PHP_SELF'],而不是仅使用$PHP_SEL
P-t-B网站上的大力水手
21年前
在*nix系统中,使用WHICH命令显示php二进制可执行文件的位置。这是用作php shell脚本文件中第一行的路径。(#!/path/to/php-q)并使用-v开关从命令行执行php,以查看您正在运行的版本。

例子:

#哪个php
/usr/local/bin/php
#php-v
PHP 4.3.1(cli)(建造日期:2003年3月27日14:41:51)
版权所有(c)1997-2002 The PHP Group
Zend Engine v1.3.0,版权所有(c)1998-2002 Zend Technologies

在上面的示例中,您将使用:#/usr/local/bin/php

还要注意,如果PATH(.)中没有当前/默认目录,则必须使用/scriptfilename从命令行执行脚本文件(否则将收到“找不到命令”错误)。使用ENV命令显示PATH环境变量值。
hotmail网站上的stromdotcom
18年前
将php-win.exe作为一个子进程来处理Windows应用程序中的脚本有一些奇怪之处(所有这些都与Windows应用程序和控制台应用程序之间的管道有关)。

要在C++中执行此操作:

//我们将在创建
//两个管道并将其连接到stdin和stdout
//子进程的
//定义sa结构,以便子级继承我们的句柄

SECURITY_ATTRIBUTES sa={sizeof(SECURITY _ATTRIBATES)};
sa.bInheritHandle=真;
sa.lpSecurityDescriptor=空;

//为我们的两个管道创建句柄(每个管道两个句柄,每个端点一个)
//我们将有一个stdin管道和一个stdout管道,每个管道都有一个READ和WRITE端
处理hStdoutRd、hStdountWr、hStdinRd、h StdinWr;

//现在创建管道,并使其可继承
创建管道(&hStdoutRd,&hStdoutWr,&sa,0)
设置句柄信息(hStdoutRd,HANDLE_FLAG_INHERIT,0);
创建管道(&hStdinRd,&hStdinWr,&sa,0)
设置句柄信息(hStdinWr,HANDLE_FLAG_INHERIT,0);

//现在我们有两个管道,我们可以创建流程
//首先,填写用法结构
STARTUPINFO si={sizeof(STARTUPINFO)};
过程信息pi;
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdOutput=hStdoutWr;
si.hStdInput=hStdinRd;

//最后,创建流程
CreateProcess(空,“c:\\php\\php-win.exe”,空,空,真,NORMAL_PRIORITY_CLASS,空,NULL,&si,&pi);

//关闭我们不使用的手柄
关闭手柄(hStdoutWr);
关闭手柄(hStdinRd);

//现在我们已经运行了该进程,我们可以开始在其上使用PHP了
写入文件(hStdinWr,“<?php(电话)回声“测试”?>“,9,&dwWritten,NULL);

//当我们完成对stdin的写入后,我们关闭了该管道
关闭手柄(hStdinWr);

//从标准输出中读取只是稍微复杂一些
整数i;

std::字符串已处理(“”);
char buf[128];

while((读取文件(hStdoutRd,buf,128,&dwRead,NULL)&&(dwRead!=0)){
对于(i=0;i<dwRead;i++)
已处理+=buf[i];
}

//阅读完毕,也请关闭此手柄
关闭手柄(hStdoutRd);

完整的实现(作为C++类实现)可在http://www.stromcode.com
杰雷尔网络公司的pyxl
22年前
假设--prefix=/usr/local/php,那么最好创建一个从/usr/bin/php或/usr/local/bin/php到目标/usr/局部/php/bin/pph的符号链接,这样它就在您的路径中,并且在每次重建时都会自动更正。如果您在重建后忘记了复制二进制文件,那么当出现问题时,您可以进行各种各样的疯狂追逐。
james_s2010在NOSPAM dot hotmail dot com
16年前
我正在寻找一种方法,以交互方式从用户那里获得单个字符的响应。将STDIN与fread、fgets等一起使用仅在按下enter后才有效。所以我想到了这个:

#!/usr/bin/php-q
<?php(电话)
功能inKey(输入键)($vals(美元)){
$in键=""
同时(!
阵列中(_A)($in键,$vals(美元))) {
$in键=修剪(`读取-s-n1值;回声\$valu`);
}
返回
$in键
}
功能
回波AT($行,$列,$提示=""){
//在特定屏幕坐标处显示提示
回声"\033[".$行.";".$列.“H”.$提示
}
//位置10,10显示提示
回波AT(10,10,“选项:”);

//定义可接受的响应
$个选项=数组("1","2","3","4",“X”);

//获取用户响应
$键=inKey(输入键)($个选项);

//显示用户响应和退出
回波AT(12,10,“按下:$键\n“);
?>

希望这对某人有所帮助。
到顶部