0

我正在尝试在远程服务器上运行脚本,并将该脚本的结果返回给调用脚本。一个变量被发送到远程脚本,并且基于该远程脚本旨在检索远程服务器上的文件名列表,并将这些文件名作为数组返回。但是,在包含的文件中使用 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

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

4

2 回答 2

3

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

或者,如果您有能力使用 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;
于 2013-10-08T08:38:58.970 回答
0

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
        )
)
于 2013-10-07T14:10:34.267 回答