【问题标题】:Executing file via file_get_contents on remote host通过远程主机上的 file_get_contents 执行文件
【发布时间】:2015-11-11 09:45:04
【问题描述】:

我有一个脚本,但我不知道它为什么以及如何工作 - 原因之一是我发现关于 file_get_contents 的信息相互矛盾。

我有三个(内部)网络服务器 - 都以相同的方式设置,运行相同的软件。 我需要计算每台服务器上一个特定文件夹中的文件数(以获取登录到某个应用程序的用户数)。

对于本地服务器,我的文件计数 PHP 脚本由一个简单的 include 调用,对于两个远程服务器,我使用 file_get_contents。 在这两种情况下,我都引用同一个 PHP 文件。这行得通 - 我为每台服务器上的文件夹获取了正确数量的文件。

有时您阅读file_get_contents 只返回文件内容但不执行文件。在我的情况下,文件被执行并且我得到了正确数量的文件。所以,我有点困惑,为什么我的脚本真的可以工作。

我的脚本保存在一台服务器上。我希望更加灵活,并且能够从每个服务器调用脚本。因此,我在网络文件夹上创建了一个新的虚拟目录并将脚本文件移到那里,虚拟文件​​夹在每台服务器上都有相同的设置。我不得不稍微更改我的脚本才能再次获得相同的结果。我现在有echo $num 而不是return $num。如果我使用return,我不会得到结果,如果我使用echo,则会给出正确的文件数。我更愿意通过return 接收结果 - 但我不知道为什么这在新环境中不再起作用。

显示文件数量的脚本:

function getUserNum($basis_url_server, $url_vaw_scripte, $script_number_users)

{

    $serverName = strtoupper($_SERVER['SERVER_NAME']);
    //local server
    if(strpos(strtoupper($basis_url_server),$serverName) !== false)
    {                           
        $numUsers = (include($script_number_users));                
    }
    //remote server
    else 
    {                       
        $path = $basis_url_server.$url_vaw_scripte.$script_number_users;    
        $numUsers = file_get_contents($path);                                                   
        //include($path);                                                   
    }   
    return $numUsers;
}

echo getUserNum($basis_url_server1, $url_vaw_scripte, $script_number_users)."($label_server1)";
echo getUserNum($basis_url_server2, $url_vaw_scripte, $script_number_users)."($label_server2)";
echo getUserNum($basis_url_server3, $url_vaw_scripte, $script_number_users)."($label_server3)";

文件计数脚本(上面称为$script_number_users

<?php
// 'include' only contains $fadSessionRepository = "E:\Repository\Session"
include dirname(__DIR__).'/vaw_settings.php';

$fi = new FilesystemIterator($pfadSessionRepository,    FilesystemIterator::SKIP_DOTS);

$number = (iterator_count($fi)-1)/2 ; 

//return $number;
echo $number;


?>

【问题讨论】:

  • 嗨,Elentriel,杰拉德 - 非常感谢您的回复。我现在明白这应该如何工作了。我简化了我的脚本,考虑到了 Geralds 的提示,尽管我仍然使用 file_get_contents 但我不再区分它是否是本地的。它对我有用,非常感谢,Rob

标签: php file-get-contents


【解决方案1】:

file_get_contents() 将在给定 url 时执行 GET,如果给定文件系统路径,则将读取文件。这就像来自同一个调用的 2 个不同的函数。 你实际上是在构建一个原始的 REST web 服务,而不是像你一样实际加载文件,远程文件被执行,如果你从浏览器手动加载它们,你会得到你会看到的输出

【讨论】:

    【解决方案2】:

    file_get_contents() 将返回本地文件的原始内容。对于远程文件,它将返回网络服务器提供的内容。如果网络服务器执行文件中的脚本,它将获得该脚本的结果。如果网络服务器不执行文件中的脚本(例如由于配置错误),您仍将获得远程脚本的原始内容。

    在您的情况下,我只需删除包含路径并通过 http 获取所有脚本。它降低了通过 http 调用三个脚本之一而不是直接加载它的复杂性和开销。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2012-01-12
      • 2015-11-20
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多