【问题标题】:Return value from include on a remote file从远程文件中包含的返回值
【发布时间】:2013-10-07 13:54:27
【问题描述】:

我正在尝试在远程服务器上运行脚本,并将该脚本的结果返回给调用脚本。一个变量被发送到远程脚本,并且基于该远程脚本旨在检索远程服务器上的文件名列表,并将这些文件名作为数组返回。但是,在包含的文件中使用 return 不会返回实际值,它只是中止脚本。除此之外,远程脚本运行没有问题,我可以让它 var_dump 为我的文件名列表,但这对我本地脚本没有多大好处。两台服务器都归我们所有(我们是我的公司)。

我已经尝试过类似这样的简单操作,只是为了看看我是否可以获得返回值,但它不起作用:

本地脚本:

$test = include "http://remote_host_address/remote_script.php";  
var_dump($test);  

远程脚本:

$ret = "Hello World";
return $ret;

这会输出int(1)。远程脚本的代码本身运行良好,我已经测试过了,我作为 get 变量发送的变量也没有问题。唯一的问题是我没有从 remote_script 获得返回值。

另外,是的,allow_url_include 已为本地服务器启用。但是,远程服务器关闭;但这不应该有所作为:http://php.net/allow-url-include.

我查看了有关此主题的其他一些相关问题,但似乎没有什么能完全描述我的问题。任何帮助都将不胜感激,因为我已经花了几个小时来查看这个,但没有取得任何进展。

【问题讨论】:

  • 这是一种不好的做法,应该避免。无论如何,@Glavić 解决方案可能会奏效。你是远程的,包括一个 php 文件。这意味着 http 包装器将要求远程服务器执行 php 文件,并且包含将尝试 之后 包含(意味着在本地执行)其输出。这里的输出在这里什么都没有,因为您的远程脚本没有回显任何内容。因此 include 返回“1”,这意味着它成功地包含了空输出。
  • @Kethryweryn - 好的做法与否,我不会争论。在任何情况下,我都尝试过让我的远程脚本 echo/var_dump 打印到屏幕上,但它不会影响 include 语句的返回值。此外,Glavic 的解决方案在技术上有效,因为它运行脚本,但随后脚本在本地运行;我希望它在远程服务器上运行以检索文件列表。如果有其他方法可以做到这一点,我愿意接受建议。

标签: php include return remote-server


【解决方案1】:

尝试使用file_get_contents() 而不是包含。
这会将文件写入一个变量[导致脚本远程执行],但不会在本地运行响应。

或者如果你有能力use cURL,它更安全,可能更快。
一个小sn-p远程file_get_contents();

function curl_get_contents($url){
    $c = curl_init($url);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    $res = curl_exec($c);
    if (curl_getinfo($c, CURLINFO_HTTP_CODE) > 400) $res = false;
    curl_close($c);
    return $res;
    }

作为解释

  • RETURNTRANSFER 将 curl 请求的响应放入一个变量中(而不是打印到屏幕上)。
  • CURLOPT_FOLLOWLOCATION 没有被设置,所以如果页面被移动了,curl 不会跟随它。您可以设置它,或者根据第二个参数设置它。
  • HTTP_CODE,如果高于 400(错误代码,可能是 404 或 500)将返回 false,而不是可能设置的花哨的自定义 404 页面。
    在我的测试中,get_headers() 比 curlinfo_http_code 更可靠,但需要对包含的页面进行第二次调用,这可能会使事情出错。
    例如。 if (!strpos(200, get_headers($url)[0])) return false;

【讨论】:

  • 给你。良好做法,+1。
  • 我将 file_get_contents() 与使用 md5 哈希的 GET 结合使用,例如 checkUser.php?user=21232f297a57a5a743894a0e4a801fc3。因此,这个想法是使用纯 html 响应(如 0/1 或哈希)来确保通信安全。没关系显示php代码!!!
【解决方案2】:

其他服务器http://remote_host_address/remote_script.php 上的脚本可能正在执行。将文件重命名为.txt,然后在该文件上使用include


如果脚本必须远程运行,则运行它,并返回/回显 php 代码。示例:

文件:http://localhost/test.php

<?php
header('Content-Type: text/plain; charset=utf-8');

$array = array();
// your logic
$array['remote_server_time'] = time();
$array['sub'] = array(1, 2, 3);
// etc.

//output
echo '<?php return ' . var_export($array, true) . ';';

将输出:

<?php return array (
  'remote_server_time' => 1381401586,
  'sub' => 
  array (
    0 => 1,
    1 => 2,
    2 => 3,
  ),
);

文件:http://localhost/index.php

<?php
header('Content-Type: text/plain; charset=utf-8');

$array = include('http://localhost/test.php');
print_r($array);

将输出:

Array
(
    [remote_server_time] => 1381401701
    [sub] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
)

【讨论】:

  • 是的,它正在执行,我已经测试过了。问题是 include 语句没有从远程脚本返回值,所以我无法在本地处理结果。您的解决方案的工作原理是它允许我在本地运行脚本,但目的是在远程服务器上运行它,因为这是文件所在的位置,我正在尝试从那里检索文件列表。如果您知道实现此目的的替代方法,我愿意接受建议。
  • 不幸的是,这不起作用。我认为这可能是由于缺少回显中的 php 关闭标签,但添加这些也无济于事。无论如何,SamGoody 关于使用 cURL 的建议确实有效,所以我同意了。感谢您抽出宝贵时间提供帮助。
  • @Meir:这行得通,我刚刚测试过。你一定做错了什么/不同。 file_get_contents/curl 只是从给定的 url 获取内容,对于您的示例 Hello World 是可以的,但是如果您需要返回数组怎么办?然后你需要解析它。 p.s. php 文件不需要关闭标签?&gt;, read here.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多