通过exec()使用ls输出更改

时间:2011-06-24 14:59:18

标签: php date format exec ls

我通过PHP和ls使用exec()命令,并且获得的输出与通过shell运行相同命令时的输出不同。通过PHP运行ls时,日期的年份和月份将更改为月份名称:

通过shell运行命令:

$ ls -lh /path/to/file
 -rw-r--r-- 1 sysadmin sysadmin 36M 2011-05-18 13:25 file

通过PHP运行命令:

<?php
exec("ls -lh /path/to/file", $output);
print_r($output);

/*
Array
(
    [0] => -rw-r--r-- 1 sysadmin sysadmin  36M May 18 13:25 file
)
*/

请注意:
- 当我通过cli运行PHP脚本时不会发生这个问题(它只在通过apache运行时发生)
- 我检查了页面的源代码,以确保我所看到的是我得到的东西(我确实得到月份名称而不是正确的日期)
- 我还通过shell运行ls命令作为www-data用户,看看ls是否根据用户提供不同的输出(输出从shell始终是相同的,那就是我在yyyy-mm-dd而不是月份名称中得到日期)

以答案更新

alias给了我这个:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

从这些别名中我找不到直接负责时间显示的开关:

-C  list entries by columns
-F  append indicator (one of */=>@|) to entries
-A  do not list implied . and ..
-a  do not ignore entries starting with .
-l  use a long listing format

然而,在PHP中使用--time-style=long-iso确实解决了这个问题。

2 个答案:

答案 0 :(得分:4)

ls有几个日期显示格式的命令行选项。检查您的命令行版本是否没有别名以包含ls --time-style=locale之类的内容。 PHP exec'd版本很可能不会出现此别名并使用默认的ls设置。

答案 1 :(得分:0)

ls输出取决于当前的区域设置。当您代表自己从控制台运行它时,它会使用您的区域设置,但用户www-data具有自己的区域设置(可能与您的区别设置不同)。因此,我建议您明确指定区域设置:

exec("LC_TIME=POSIX ls -lh /", $output);

而不是POSIX,您可以替换您想要使用的区域设置。