PHP exec(),shell_exec(),proc_open()& powershell在CMD中工作但在浏览器中没有

时间:2017-10-06 21:45:30

标签: php process exec shell-exec proc-open

下面的脚本在CMD窗口中工作正常但在浏览器中没有。下面的脚本位于'front.php',win10的命令窗口命令'php front.php'做得不错但http://localhost/blahblah/front.php通过不触发'back.php'来吸我。花了差不多半个晚上尝试所有可能性包括shell_execproc_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);

更新

为了缩小范围,我正在使用Win 10 Admin用户,并且所有WAMP设置仅在我的本地PC中,使用PHP 5.6.x. front.php和back.php都在同一个工作文件夹中,并且前面能够写入文件但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'));
?>

back.php:

<?php
sleep(5);   // some delay
file_put_contents('timelog.txt', date('Y-m-d/H:i:s.u'). "\n"); 
?>

1 个答案:

答案 0 :(得分:0)

这有很多问题。

我注意到back.php没有向stdoutstderr发送任何内容(除非文件操作有错误)。

此外,您的两个脚本正在将时间戳写入一个文件,并且它们不处于追加模式,因此将覆盖另一个。尝试登录到不同的文件名,或使用FILE_APPEND作为file_put_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");

<强> outer.php

<?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
Array
(
    [0] => Stdout
)
Array
(
    [0] => Stdout
    [1] => Stderr
)

您可以在第一种情况下看到,stderr输出作为exec()输出本身的一部分呈现给控制台,即除非我们进行2>&1重定向,否则它的可捕获性较差。

然后我跨越了一个Web服务器:

php -S localhost:10000

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

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

  

数组([0] =&gt; Stdout)数组([0] =&gt; Stdout [1] =&gt; 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

因此,我认为这里的一切都很好。

您可能希望创建一个简单的可重现的测试用例 - 包含大量编辑和评论更新,您的问题变得过于复杂而无法回答。如果它是X-Y problem,那么解释您尝试实现的目标也可能很有价值。