2013-10-07 3 views
0

Я пытаюсь запустить сценарий на удаленном сервере и получить результаты этого скрипта, возвращаемого вызывающему скрипту. Переменная отправляется на удаленный скрипт и на основе этого удаленный сценарий предназначен для получения списка имен файлов на удаленном сервере и возвращает эти имена файлов в виде массива. Однако использование return во включенном файле не возвращает фактическое значение, оно просто прерывает скрипт. Кроме того, удаленный скрипт работает без проблем, и я могу иметь его var_dump список имен файлов для меня, но это не очень хорошо для меня в локальном скрипте. Оба сервера принадлежат нам (мы являемся моей компанией).Возвращаемое значение из include на удаленный файл

Я пытался что-то простое, как это просто, чтобы увидеть, если я мог бы получить возвращаемое значение, и это не сработало:

Local Script:

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

Remote Script:

$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 не был установлен, поэтому, если страница была перемещена, завиток не будет следовать за ней. Вы можете установить это или установить его на основе второго аргумента.
  • HTTP_CODE, если выше 400 (код ошибки, предположительно 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 или хэша) для обеспечения безопасности связи. Nevermind для отображения кода 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

Смежные вопросы