我在Mac OS X 10 Yosemite上,所以我想知道其他人是否也遇到了同样的问题。此代码使您能够深入了解问题。制作一个index.php文件,里面是:
<?php
$exec = "diskutil list";
echo $exec;
$output = shell_exec($exec);
echo $output;
这是在使用内置的Apache+PHP版本时发生的。当使用XAMPP或Nightrain时,运行上面的命令没有问题。所以我想知道Apache或PHP版本的OSX是否会阻止某些shell_exec命令?
到目前为止我的经验:
当我在命令行中键入以下命令时:
diskutil info /dev/disk1s1
我得到了磁盘信息的完整概述。
但是当我在OSX上使用shell_exec()
在PHP中执行相同的命令时,我会得到一个错误:
找不到磁盘:/dev/disk1s1
Apache被配置为使用与我的用户(user:staff)相同的所有权,并且所有其他命令都可以工作。
此外,当我在命令行中使用以下命令时:
diskutil list
我得到了一个完整的概述。但是shell_exec()
没有返回任何内容,在Apache错误日志中我看到:
无法启动DiskManagement会话
我在谷歌上搜索了一下,结果为零。
首先,命令行命令是一回事,但PHP脚本中的命令是另一回事。这意味着你的命令行示例是:
diskutil info /dev/disk1s1
但是PHP脚本中的命令遗漏了磁盘/dev/disk1s1
,如下所示:
diskutil list
太不清楚你在做什么了,这是行不通的。此外,通常在PHP脚本中,您需要为正在调用的任何二进制文件设置完整路径。所以代替这行:
$exec = "diskutil info";
将其更改为此;注意:我添加了/dev/disk1s1
,所以命令有一个磁盘可以操作:
$exec = "/usr/sbin/diskutil info /dev/disk1s1";
这就是diskutil
在我的Mac OS X 10.9.5设置中的位置。为了确保它在相同的路径上,使用which
,如下所示:
which diskutil
它会返回这样的东西:
/usr/sbin/diskutil
当我从命令行运行它时,我是这样做的;假设测试文件名为shell_exec_test.php
:
php ./shell_exec_test.php