当前位置:  开发笔记 > 编程语言 > 正文

PHP @exec静默失败

如何解决《PHP@exec静默失败》经验,为你挑选了2个好方法。

这真让我抓狂.我正在尝试在我的PHP Web应用程序的Windows框中执行命令行语句.它运行在Windows XP,IIS5.1上.Web应用程序运行正常,但我不能让@exec()使用特定的contactenated变量.我的命令结构如下:

$cmd = ($config->svn." cat ".$this->repConfig->svnParams().quote($path).' -r '.$rev.' > '.quote($filename));

当它生成以下字符串时,此命令不能如上所述:

svn --non-interactive --config-dir /tmp cat "file:///c:/temp/test/acccount/dbo_sproctest.sql" -r 1 > "C:\Inetpub\sites\websvn\temp\wsv5B45.tmp"

如果我将其复制/粘贴到我自己的命令行,它可以正常工作.

如果我硬编码相同的路径而不是添加变量,它的工作原理!我已尝试使用和不带引号的文件名.我在整个命令周围尝试过和没有引号.我试过其他目录.我已经尝试将输出参数传递给exec(),它返回空(Array()).我已经尝试将命令错误流的输出重定向到文件,并且永远不会创建错误输出文件.

我唯一可以理解的是,exec()默默地失败了.我到底是做错了什么?如果我硬编码文件路径,使用相同的目录结构和文件名,它工作正常.如果我不这样做,那就没有.

也许文件路径中的斜杠()没有正确转义,但是当我用单引号手动执行它们时,它们不被视为转义序列?

更新:

我接过了执行官的@ off,但仍然没有看到任何错误.

我给了SVN的完整路径,但仍然没有运气.应该注意的是,只要我手动指定cat的文件目的地,该命令就可以使用非完整路径SVN.

更新2:RE:Kieth

我通过尝试两个来调用exec:

exec($cmd);

要么

exec($cmd, $out);

我的php.ini已经有safe_mode = 0.

我添加了error_reporting(E_ALL); 并没有看到任何新的东西

如果我回复(或打印)我的执行电话,我实际上并没有做任何事情

如果我在包含输出变量时回显(或print_r)我的exec调用,我得到一个空的arr

更新3

我试过escapeshellcmd和escapeshellarg都没有用(虽然好主意).

我应该补充说,该文件是通过调用创建的

tempnam("temp", "wbsn");

事实上,如果我手动指定字符串而不是让它由tempname生成,它的工作正常似乎表明问题的根源,但我无法弄清楚如何.我对手动字符串与生成的字符串进行了比较,然后将其作为匹配返回.



1> Powerlord..:

@exec 将始终无声地失败,因为@是PHP的错误抑制运算符.



2> matt..:

由于您使用的是Windows,而我使用的是Linux,因此不确定是否会对您有所帮助,但是我遇到了来自PHP exec()的相同的静默错误问题。我发现我尝试发出的命令(nconvert)将其错误消息发送到标准错误流,而不是标准输出。所以我加了

2>&1

在命令行末尾将我的错误重定向回标准流。然后我可以看到nconvert给了我一个权限被拒绝的错误。

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有