Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我与Apache一起使用时,为什么PHP不能识别Windows系统路径中的程序?_Php - Fatal编程技术网

当我与Apache一起使用时,为什么PHP不能识别Windows系统路径中的程序?

当我与Apache一起使用时,为什么PHP不能识别Windows系统路径中的程序?,php,Php,在我的本地开发环境中,我在Windows7上安装了Apache和PHP。我正在用exec从PHP程序调用7-Zip。一开始我试着用 exec('7z a example.zip example.pdf'); 但是它没有创建zip文件。在检查Apache错误日志后,我发现 “7z”不被识别为内部或外部命令、可操作程序或批处理文件 在将exec更改为包含7-Zip.exe的完整路径后,它工作了 exec('"C:\\Program Files\\7-Zip\\7z" a example.zip e

在我的本地开发环境中,我在Windows7上安装了Apache和PHP。我正在用exec从PHP程序调用7-Zip。一开始我试着用

exec('7z a example.zip example.pdf');
但是它没有创建zip文件。在检查Apache错误日志后,我发现

“7z”不被识别为内部或外部命令、可操作程序或批处理文件

在将
exec
更改为包含7-Zip.exe的完整路径后,它工作了

exec('"C:\\Program Files\\7-Zip\\7z" a example.zip example.pdf');
但是
C:\Program Files\7-Zip
包含在我的Windows系统路径中。相同的PHP代码在命令行中工作,而不使用完整路径

php -r "exec('7z a example.zip example.pdf');"
为什么我在Apache中使用它时需要完整路径


当我最初发布这个问题时,我忽略了一个重要的问题,那就是我已经能够使用
exec()
调用Windows系统路径中包含的其他程序,而不必通过它们的完整路径引用它们


另一点我最初没有提到,因为我没有意识到它的相关性,那就是7-Zip最近才被添加到路径中,我在添加它之后重新启动了Apache服务。

我已经在windows 8上安装了WAMP,在阅读了您的问题后,我决定测试一些东西

运行echo exec('whoami')回声:

nt authority\system
这证实了所说的,Apache不是在与您相同的用户下运行的,因此,
路径不同

我决定停止Apache并在管理员帐户下手动启动它。 然后我试着:

echo exec('whoami');
输出:

computername\administrator
我假设现在
exec
将使用
PATH
并尝试:

echo exec('adb')//android adb工具位于我的
路径上

令人惊讶的是,尽管Apache运行的用户与我相同,但是
路径仍然不起作用。我不知道为什么会发生这种情况,如果有人有线索,请在下面评论

我设法将
路径
(使用管理员帐户)与以下代码一起使用:

$WshShell=newcom(“WScript.Shell”); $oExec=$WshShell->Run(“cmd/C 7z a example.zip example.pdf”,0);//0不可见/1可见


我没有测试下面的代码,但您可以尝试在Apache服务帐户(
nt authority\system
)下设置
路径
,然后使用命令,即:

echo exec('set PATH=%PATH%;C:/path/to/7z');
echo exec('7z a example.zip example.pdf');
我相信
路径
在重启之间仍然有效


更新: ,可以帮助您设置帐户
nt authority\system
路径

指定本地系统用户的个人环境变量 在“HKEY_用户.默认\环境””处。机器范围的环境 变量是在 “HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session 管理器\环境”。前者并不容易从计算机上访问 除注册表之外的任何位置,但后者可从 “系统”的“高级”选项卡上的“环境变量”对话框 属性


对于未来的用户,设置Apache路径的正确方法是:

您可以使用
.htaccess
中的
setEnv
PHP
中的
putenv
进行设置
$PATH


功劳归

我刚刚找出了这个问题的原因。这实际上与我最初的假设无关

我记得在
phpinfo()
中看到了
PATH
信息,所以我看了看。在“Apache环境”部分,它确实显示了所有的
路径
,除了7-Zip的路径,我最近刚刚添加到系统
路径
。很明显,它似乎可以访问该路径,但它没有使用当前版本。为什么不呢


通常情况下,我会认为在更新路径后忘记了重新启动Apache,但我在尝试解决这个问题时反复重新启动了它。但显然,重新启动Apache不会刷新此值。我必须停止它,然后开始它。然后7-Zip路径出现在phpinfo的
path
中,我可以将我的程序改回使用纯
7z

Apache没有从您的帐户运行,它没有您的
PATH
设置。@Barmar我想把它放在系统
PATH
而不是我的用户
PATH
中会解决这个问题。不是这样吗?。。。你应该试试
/usr/bin/7z
哦,那么应该是
C:\\Programs\which\7z
@PedroLobito我认为hek2mgl的评论有助于解释这一点。我一直在阅读关于如何更好地理解它的文章。此处的路径在重新启动之间无效,这仅适用于正在运行的会话。您需要在其他地方设置环境变量。这一行显示了一个这样的例子:谢谢你的评论,但是我假设
管理员的路径与
nt authority\system
不同,因此,按照说明设置路径并不能解决问题。@PedroLobito我发现了这一问题的实际原因。我添加了一个答案来描述它。我想毕竟是我没有正确理解Apache。谢谢你的关注,如果我在这里浪费了你的时间,我也很抱歉。