我通过PHP和exec()
使用ls
命令,得到的输出与通过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运行时才会出现)
-我检查了页面的源代码,以确保我看到的是我得到的(我确实得到了月份名称,而不是正确的日期)
-我还以www-data
用户的身份通过shell运行ls
命令,查看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
确实解决了这个问题。
ls
有两个日期显示格式的命令行选项。检查您的命令行版本是否有别名,以包含类似ls --time-style=locale
的内容。PHP执行版本很可能不会出现这种别名,而是使用默认的ls
设置。
ls
的输出取决于当前的区域设置。当您代表自己从控制台运行它时,它使用您的区域设置,但用户www-data
有自己的区域设置(可能与您的不同)。因此,我建议您明确指定区域设置:
exec("LC_TIME=POSIX ls -lh /", $output);
其中,您可以替换要使用的语言环境,而不是POSIX
。