PHP exec()、shell_exec()、proc_open();powershell在CMD中工作,但不在浏览器中工作

PHP exec()、shell_exec()、proc_open();powershell在CMD中工作,但不在浏览器中工作,php,process,exec,shell-exec,proc-open,Php,Process,Exec,Shell Exec,Proc Open,下面的脚本在CMD窗口中工作正常,但在浏览器中不工作。下面的脚本在“front.php”中,win10的命令窗口命令“php front.php”做得很好,但是http://localhost/blahblah/front.php通过不触发“back.php”来吸引我。几乎花了半个晚上尝试所有可能的方法,包括shell\u exec,proc\u open,但最终都出现了上述问题。基本权限、php.ini相关问题都得到了解决 pclose(popen('powershell.exe "Start

下面的脚本在CMD窗口中工作正常,但在浏览器中不工作。下面的脚本在“front.php”中,win10的命令窗口命令“php front.php”做得很好,但是
http://localhost/blahblah/front.php
通过不触发“back.php”来吸引我。几乎花了半个晚上尝试所有可能的方法,包括
shell\u exec
proc\u open
,但最终都出现了上述问题。基本权限、php.ini相关问题都得到了解决

pclose(popen('powershell.exe "Start-Process php -ArgumentList \'back.php\' -WindowStyle Hidden"','r'));

echo exec('D:\Wamp\php\php.exe D:\Wamp\apache2\htdocs\MySite\admin\back.php > output.txt 2>&1 echo $!', $pid);
使现代化 只是为了缩小范围,我使用Win10管理员用户,所有WAMP设置仅在本地pc中使用PHP5.6.x。front.php和back.php都在同一个工作文件夹中,front可以写入文件,但back.php不能从浏览器执行。从CMD,同样的工作

front.php:

<?php
ini_set("display_errors",1);
error_reporting(E_ALL);
file_put_contents('timelog.txt', date('Y-m-d/H:i:s.u')); 

echo exec('php back.php > output.txt 2>&1 echo $!');
// pclose(popen('powershell.exe "Start-Process php -ArgumentList \'back.php\' -WindowStyle Hidden"','r'));
?>
<?php
sleep(5);   // some delay
file_put_contents('timelog.txt', date('Y-m-d/H:i:s.u'). "\n"); 
?>

这方面有很多问题

我注意到
back.php
不会向
stdout
stderr
发送任何内容(除非文件op有错误)

另外,您的两个脚本正在向一个文件写入时间戳,并且它们没有处于追加模式,因此一个脚本将覆盖另一个。尝试记录到不同的文件名,或使用
file\u APPEND
作为
file\u put\u contents()
中的第三个参数

最后,不清楚
echo
php back.php>output.txt 2>&1 echo$中应该做什么。在我看来,这似乎是一个语法错误

为了研究控制台重定向与浏览器重定向的性质,我编写了以下两个文件:

inner.php

<?php
// Writes something to stdout and stderr

echo "Stdout\n";
fwrite(STDERR, "Stderr\n");
<?php
// Execs the inner file with and without redirection

exec('php inner.php', $output);
print_r($output);

exec('php inner.php 2>&1', $output2);
print_r($output2);
您可以看到,在第一种情况下,stderr输出作为
exec()
输出本身的一部分呈现到控制台,也就是说,除非执行
2>&1
重定向,否则它的可捕获性较低

然后我跨越一个web服务器:

php -S localhost:10000
并访问了地址:
http://localhost:10000/outer.php

我在浏览器中收到此消息:

数组([0]=>Stdout)数组([0]=>Stdout[1]=>Stderr)

并且杂散错误出现在控制台输出中:

PHP 7.0.22-0ubuntu0.16.04.1 Development Server started at Sat Oct  7 11:01:43 2017
Listening on http://localhost:10000
Document root is /home/jon/Development/Personal/Missive
Press Ctrl-C to quit.
Stderr
[Sat Oct  7 11:01:56 2017] 127.0.0.1:54392 [200]: /outer.php
[Sat Oct  7 11:01:56 2017] 127.0.0.1:54394 [404]: /favicon.ico - No such file or directory
因此,我认为这里一切都很好


您可能希望创建一个简单的可复制的测试用例——有大量的编辑和注释更新,您的问题变得非常复杂,无法回答。在解释您试图实现的目标时也可能有价值,如果它是一个。

显然,权限和php.ini设置的“常见问题”没有得到解决。第二行中的路径(
D:\Wamp\php\php.exe
D:\Wamp\apache2\htdocs\MySite\admin\back.php
)是错误的,因为你没有加倍你的反斜杠。在第一行中,您将它们用作转义字符,在第二行中也需要这样做。您需要的顺序是每一个都使用双反斜杠。这可能不是您的问题,但值得修复。接下来,请单独尝试
echo exec('D:\\Wamp\\php\\php.exe-v')
,看看是否有任何输出。如果您这样做了,请尝试下一位,等等。此外,您不需要执行
重定向-PHP可以在
exec
命令本身中执行此操作。请阅读一个元注释-总结是,这不是解决志愿者问题的理想方法,可能会对获得答案产生反作用。请不要将此添加到您的问题中。symscbean,我首先处理了与权限相关的常规内容、安全模式、禁用的功能等。正如我所说的,我可以在CMD中运行它,我的所有东西都在本地的单个管理员用户中运行。另外,front.php可以写,back.php什么也不做,请注意,我所有的东西都在同一个文件夹中,所以我看不到任何需要进一步使用权限的东西。
PHP 7.0.22-0ubuntu0.16.04.1 Development Server started at Sat Oct  7 11:01:43 2017
Listening on http://localhost:10000
Document root is /home/jon/Development/Personal/Missive
Press Ctrl-C to quit.
Stderr
[Sat Oct  7 11:01:56 2017] 127.0.0.1:54392 [200]: /outer.php
[Sat Oct  7 11:01:56 2017] 127.0.0.1:54394 [404]: /favicon.ico - No such file or directory