PHP: get_current_user() 与 exec('whoami') 的区别

22

问题简述:

get_current_user();exec('whoami'); 有什么区别?

问题详述:

  1. 我在Mac上使用XAMPP本地主机。
  2. 我正在使用Apache,在htdocs文件夹中的一个文件夹(我们称其为folderxyz)中构建基于PHP的网站。
  3. 我正在测试PDO::ERRMODE_EXCEPTION,参见此链接

然后我遇到了以下错误:

file_put_contents(PDOErrors.txt): failed to open stream: Permission denied...

所以我进行了一些调查,似乎要解决这个问题,我需要将PDOErrors.txt文件的CHMOD设置更改为777。

但是,我的问题与此无关。 在这个过程中,我意识到我并不清楚Apache、PHP和MySQL中的用户概念。

  • PHP手册说get_current_user() “获取当前PHP脚本的所有者名称”,参见此链接
  • PHP手册说exec('whoami')返回“拥有运行php/httpd进程的用户名”,参见此链接
  • 使用get_current_user()时,会得到计算机账户名firstnamelastname
  • 使用exec('whoami')时,会得到daemon
  • firstnamelastnamedaemon之间的关系是什么?
  • “当前PHP脚本的所有者”和“拥有运行php/httpd进程的用户名”的关系是什么?
  • 谁需要权限来写入PDOErrors.txt?是firstnamelastname还是daemon
  • 谁需要权限来写入PDOErrors.txt?是Apache还是PHP(或两者都是)?
  • 这里是否涉及类似Unix的root帐户的概念?

  • 编辑:我更新了这个问题,以反映我不是必须更改CHMOD设置的folderxyz。我必须更改PDOErrors.txt文件的设置。


    发问者在此:供参考,我在Linux平台上提出了类似的问题(附带一个直观的解释):https://stackoverflow.com/questions/31389892/why-is-the-output-www-data-in-one-case-and-root-in-another

    更新:那个问题被删除了,因为它被认为是这个问题的重复(尽管那是针对Linux平台,而我在执行echo exec('whoami');后得到的是www-data而不是daemon)。

    从在Linux论坛上提出这个问题中我学到的:

    运行的进程与脚本不同。是的,该进程源自脚本,但它不是同一件事。脚本归 root 所有,但进程被 Apache 接管并作为 www-data 运行。


    总体结论:我从这个过程中学到的是,用户应该是 Apache 守护进程(Mac 本地主机)或 www-data(在互联网服务器上运行的 Linux),我应该使用exec('whoami')来确定这一点,并且我不应该太关心get_current_user()(可能应该被命名为get_current_owner())。


    我想为将来的参考添加以下Stackoverflow答案,解释了为什么Apache用户在本地机器上显示为“daemon”,而在公共机器上显示为“www-data”(即任何人都可以使用互联网)。 我查看了本地机器上Apache httpd.conf文件中的设置,usergroup设置确实设置为daemon:http://stackoverflow.com/questions/26063556/php5-not-being-run-as-www-data - thanks_in_advance
    1个回答

    12
    1. get_current_user() 应该返回文件的所有者,在本例中是 firstnamelastname。然而,据报道这个函数在不同平台上的结果是不一致的。因此,我不会信任它的输出。daemon 是 Apache 运行的用户。
    2. PHP 脚本的所有者是根据操作系统拥有该文件的用户。您可以在存放脚本的目录中运行 ls -la 命令来查找文件所属的用户和组。
    3. 无论您使用哪个用户编辑脚本,都需要能够对其进行写入,所以最可能是 firstnamelastname (+rw)。
    4. 对于文件夹本身,您应该有 +rx(执行和读取)权限,对于 PHP 文件,应该有 +r(读取)权限。在我的 XAMPP 安装中,他们通过将 htdocs 中的所有内容设置为公共可读来实现这一点,因此 daemon 可以读取它,但不能写入它。
    5. Mac 有一个根帐户,通常拥有 htdocswww 目录。它填补了传统 Unix 根用户的角色。

    以下是有关文件所有者/组和进程所有者的一些信息:

    host:~$ ls -l /Applications/XAMPP/xamppfiles/htdocs
    drwxr-xr-x 3 root admin  4096 2015-01-01 00:01 .
    drwxr-xr-x 3 root admin  4096 2015-01-01 00:01 ..
    -rw-r--r-- 1 firstnamelastname admin   189 2015-01-31 20:45 index.php
    
    host:~$ ps aux | grep httpd | head -n1    
    daemon          45204   0.0  0.1  2510176  10328   ??  S    Tue11AM   0:01.38 /Applications/XAMPP/xamppfiles/bin/httpd -k start -E /Applications/XAMPP/xamppfiles/logs/error_log -DSSL -DPHP
    

    如果您想让一个文件可被守护进程用户写入,您可以创建一个新文件夹,并将其命名为所有者及拥有 admin 组的名称(这样您也可以使用它),然后为用户和组授予 +rwx 权限,为公众授予 +rx 权限:

    host:~$ cd /Applications/XAMPP/xamppfiles/htdocs
    host:htdocs$ mkdir some_dir
    host:htdocs$ chmod 775 some_dir
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接