2013-10-07 81 views
0

我試圖在遠程服務器上運行腳本,並將該腳本的結果返回給調用腳本。一個變量被髮送到遠程腳本,並且基於該遠程腳本來檢索遠程服務器上的文件名列表,並將這些文件名作爲數組返回。但是,在包含文件中使用返回不會返回實際值,它只會中止腳本。除此之外,遠程腳本運行沒有問題,我可以讓它爲我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

我已經查看了一些關於此主題的其他相關問題,而且似乎沒有任何東西可以完全描述我的問題。任何幫助將不勝感激,因爲我花了幾個小時已經看過這個,並沒有取得任何進展。

+0

這是一個不好的做法,應該避免。無論如何,@Glavić解決方案可能會起作用。你是遠程的,包括一個PHP文件。這意味着http封裝器將要求遠程服務器執行php文件,並且include將會在後面嘗試**以包含(意味着在本地執行)其輸出。這裏的輸出沒有任何內容,因爲你的遠程腳本不會回顯任何內容。因此包括返回「1」,意味着它成功地包含了空輸出。 – Kethryweryn

+0

@Kethryweryn - 好的做法與否,我不會爭辯。在任何情況下,我都嘗試過使用遠程腳本echo/var_dump,並且它會打印到屏幕上,但它不會影響include語句的返回值。另外,Glavic的解決方案在技術上可以運行腳本,但腳本在本地運行;我希望它在遠程服務器上運行以檢索文件列表。如果還有其他辦法可以實現這一點,我願意接受建議。 – Meir

回答

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方式使捲曲請求的響應到一個變量(而不是印刷在屏幕上)。
  • CURLOPT_FOLLOWLOCATION尚未設置,所以如果頁面已被移動,curl將不會跟着它。你可以設置它,或者根據第二個參數設置它。
  • HTTP_CODE,如果大於400(一個err代碼,大概是404或500)將返回false而不是可能設置的花哨的自定義404頁面。
    在我的測試中,get_headers()比curlinfo_http_code更可靠,但需要對包含的頁面進行第二次調用,這可能會導致錯誤。
    例如。 if (!strpos(200, get_headers($url)[0])) return false;
+0

在這裏,你去。良好的做法和+1。 – Kethryweryn

+0

我使用file_get_contents()與GET使用MD5散列,如checkUser.php?user = 21232f297a57a5a743894a0e4a801fc3。所以,這個想法是使用一個普通的html響應(如0/1或哈希)來確保通信安全。 沒關係顯示php代碼! – erm3nda

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 
     ) 
) 
+0

是的,它正在執行中,我測試過了。問題是include語句沒有從遠程腳本返回值,所以我無法在本地處理結果。你的解決方案的工作原理是它允許我在本地運行腳本,但其目的是在遠程服務器上運行它,因爲這是文件所在的位置,我試圖從那裏檢索文件列表。如果您知道一種替代方法來實現這一點,我願意提出建議。 – Meir

+0

@ Meir:我已經更新了我的答案。 –

+0

不幸的是,沒有奏效。我認爲這可能是由於在回聲中遺漏了php關閉標籤,但添加這些標籤也沒有幫助。無論如何,SamGoody提出的使用cURL的建議確實有效,所以我就這樣做了。感謝您花時間提供幫助。 – Meir