从包含在远程文件上的返回值

时间:2013-10-07 13:54:27

标签: php include return remote-server

我正在尝试在远程服务器上运行脚本,并将该脚本的结果返回给调用脚本。变量被发送到远程脚本,并且基于该变量,远程脚本用于检索远程服务器上的文件名列表,并将这些文件名作为数组返回。但是,在包含文件中使用return不返回实际值,它只是中止脚本。除此之外,远程脚本运行没有问题,我可以为它var_dump 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

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

2 个答案:

答案 0 :(得分:3)

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

或者如果你有use cURL的能力,它会更安全,也可能更快 一个远程的小片段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 :(得分:0)

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


如果必须远程运行脚本,则运行它,然后返回/ echo 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
        )
)