2011-06-24 59 views
3

我通過PHP和exec()使用ls命令,並且獲得與通過shell運行相同命令時不同的輸出。當通過PHP年份和日期的月份運行ls會改成月份名稱:當通過exec使用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 

但是使用--time-style=long-iso在PHP確實解決問題。

+0

在shell中輸入「別名」。也許你在那裏有一個別名。 – Leif

+0

[ls -ltr使用PHP exec()]的可能重複(http://stackoverflow.com/questions/3157092/ls-ltr-using-php-exec) –

回答

4

ls有幾個用於日期顯示格式的命令行選項。檢查你的命令行版本是不是別名,包括像ls --time-style=locale。 PHP exec'd版本很可能不會出現此別名,並且使用默認的ls設置。

0

ls輸出取決於當前的區域設置。當您代表您自己從控制檯運行它時,它會使用您的區域設置,但用戶www-data具有自己的區域設置(可能與您的區別不同)。所以,我建議你明確指定區域設置:

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

,其中,代替POSIX您可以取代您要使用的語言環境。

相關問題