Как выполнить и получить содержимое файла .php в переменной?

Я хочу получить содержимое файла .php в переменной на другой странице.

У меня есть два файла, myfile1.php и myfile2.php.

мой файл2.php

<?PHP
    $myvar="prashant"; // 
    echo $myvar;
?>

Теперь я хочу получить значение, отраженное myfile2.php в переменной в myfile1.php, я попробовал следующий способ, но он также принимает все содержимое, включая тег php().

<?PHP
    $root_var .= file_get_contents($_SERVER['DOCUMENT_ROOT']."/myfile2.php", true);
?>

Скажите, пожалуйста, как я могу получить содержимое, возвращаемое одним файлом PHP, в переменную, определенную в другом файле PHP.

Спасибо


person Prashant    schedule 12.05.2009    source источник
comment
Непринятый ответ ниже является лучшим: stackoverflow.com/a/851773/632951   -  person Pacerier    schedule 07.08.2013
comment
ВСЕГДА БУДЬТЕ ОСТОРОЖНЫ, потому что, если вы будете использовать ob_get_contents() , вам может понадобиться выполнить ob_end_flush , иначе у вас могут возникнуть проблемы, если после этого вы будете использовать любую команду php header .   -  person T.Todua    schedule 03.05.2015


Ответы (9)


Для этого можно использовать директиву include.

Файл 2:

<?php
    $myvar="prashant";
?>

Файл 1:

<?php 

include('myfile2.php');
echo $myvar;

?>
person zombat    schedule 12.05.2009
comment
Я уже знаю этот метод, и он отлично работает, но нет ли другого способа, кроме этого? - person Prashant; 12.05.2009
comment
@Prashant А в чем проблема с этим методом? Он предназначен для этого. - person viam0Zah; 12.05.2009
comment
На самом деле я просто искал, есть ли какой-либо метод возвращаемого типа, который может напрямую дать мне значение. В любом случае, я принял ответ @zombat, поскольку метод, предложенный @harto, может иметь некоторые проблемы с производительностью, и я не могу идти на компромисс с производительностью. Спасибо парень. - person Prashant; 12.05.2009

Вы должны различать две вещи:

  • Вы хотите захватить вывод (echo, print,...) включенного файла и использовать вывод в переменной (строке)?
  • Вы хотите вернуть определенные значения из включенных файлов и использовать их в качестве переменных в вашем скрипте host?

Локальные переменные во включенных файлах всегда будут перемещаться в текущую область действия вашего скрипта host — это следует учитывать. Вы можете объединить все эти функции в одну:

include.php

$hello = "Hello";
echo "Hello World";
return "World";

host.php

ob_start();
$return = include 'include.php'; // (string)"World"
$output = ob_get_clean(); // (string)"Hello World"
// $hello has been moved to the current scope
echo $hello . ' ' . $return; // echos "Hello World"

Функция return особенно удобна при использовании файлов конфигурации.

config.php

return array(
    'host' => 'localhost',
     ....
);

app.php

$config = include 'config.php'; // $config is an array

ИЗМЕНИТЬ

Чтобы ответить на ваш вопрос о снижении производительности при использовании выходных буферов, я провел небольшое тестирование. 1 000 000 итераций ob_start() и соответствующего $o = ob_get_clean() занимают около 7,5 секунд на моем компьютере с Windows (вероятно, не лучшая среда для PHP). Я бы сказал, что влияние на производительность следует считать довольно небольшим...

person Stefan Gehrig    schedule 12.05.2009

Если вы хотите, чтобы содержимое только echo() отображалось включенной страницей, вы можете рассмотреть возможность использования буферизации вывода:

ob_start();
include 'myfile2.php';
$echoed_content = ob_get_clean(); // gets content, discards buffer

См. http://php.net/ob_start.

person harto    schedule 12.05.2009
comment
ob_start() для меня новинка. Итак, @harto, можете ли вы предложить мне, какой метод будет лучше с точки зрения производительности, ваш метод или метод, предложенный @zombat ?? - person Prashant; 12.05.2009
comment
Буферизация вывода немного влияет на производительность, так как при инициализации и обслуживании буферов возникают накладные расходы. - person zombat; 12.05.2009
comment
@Prashant: у меня нет доступных данных, но я предполагаю, что влияние на производительность будет незначительным. Вы можете попробовать оба метода и посмотреть, есть ли измеримая разница между ними, но я думаю, что она действительно будет очень маленькой. - person harto; 12.05.2009

Я всегда стараюсь избегать функций ob_. Вместо этого я использую:

<?php
$file = file_get_contents('/path/to/file.php');
$content = eval("?>$file");
echo $content;
?>
person T.Todua    schedule 03.05.2015
comment
Ваш ответ интересен. Не могли бы вы рассказать, почему вы избегаете буферизации вывода и вместо этого используете eval()? Ваш ответ будет хорошим знанием для меня. - person Saeed Afzal; 06.11.2015
comment
Спасибо за eval("?>$file") трюк. Это действительно полезно. - person Tobia; 05.07.2016
comment
Функции OB_ изменяют выходной буфер, и многие другие коды в CMS могут в это время использовать функции буфера независимо, и это может привести к конфликту, или очистить буфер, или изменить его... Так что я никогда не трогаю его. - person T.Todua; 02.05.2017
comment
Если eval() является ответом, вы почти наверняка задаете неправильный вопрос. -- Расмус Лердорф, BDFL PHP - person chris; 07.11.2018

«На самом деле я просто искал, есть ли какой-нибудь метод возвращаемого типа, который может напрямую дать мне значение» - вы только что ответили на свой вопрос.

См. http://sg.php.net/manual/en/function.include.php, пример №5

файл1.php:

<? return 'somevalue'; ?>

файл2.php:

<?

$file1 = include 'file1.php';
echo $file1; // This outputs 'somevalue'.

?>
person Shanshui    schedule 12.05.2009
comment
Это заслуживает большего количества просмотров! - person GlabbichRulz; 19.01.2016

Вы можете использовать буферы вывода, которые будут хранить все, что вы выводите, и не будут распечатывать их, если вы явно не укажете это или не завершите/очистите буферы к концу пути выполнения.

// Create an output buffer which will take in everything written to 
// stdout(i.e. everything you `echo`ed or `print`ed)
ob_start()
// Go to the file
require_once 'file.php';
// Get what was in the file
$output = ob_get_clean();
person Lux    schedule 13.06.2015

Если вы хотите, чтобы сайт использовался повсеместно,

<?php
$URL = 'http://www.example.com/';
$homepage = file_get_contents($URL);
echo $homepage;
?>
person Community    schedule 07.12.2009

Пожалуйста, попробуйте этот код

мой файл1.php

<?php
    echo file_get_contents("http://domainname/myfile2.php");
?>

мой файл2.php

<?PHP
    $myvar="prashant";
    echo $myvar;
?>
person Chinmay235    schedule 10.05.2013

Если вы хотите вернуть вывод из кода в файле, просто сделайте к нему вызов RESTful API. Таким образом, вы можете использовать один и тот же файл кода для вызовов ajax, REST API или для своего внутреннего кода PHP.

Для этого требуется установить cURL, но без выходных буферов или включений, только страница выполняется и возвращается в строку.

Я дам вам код, который я написал. Он работает почти со всеми REST/веб-серверами (и даже работает с Equifax):

$return = PostRestApi($url);

or

$post = array('name' => 'Bob', 'id' => '12345');
$return = PostRestApi($url, $post, false, 6, false);

Вот функция:

/**
 * Calls a REST API and returns the result
 *
 * $loginRequest = json_encode(array("Code" => "somecode", "SecretKey" => "somekey"));
 * $result = CallRestApi("https://server.com/api/login", $loginRequest);
 *
 * @param string $url The URL for the request
 * @param array/string $data Input data to send to server; If array, use key/value pairs and if string use urlencode() for text values)
 * @param array $header_array Simple array of strings (i.e. array('Content-Type: application/json');
 * @param int $ssl_type Set preferred TLS/SSL version; Default is TLSv1.2
 * @param boolean $verify_ssl Whether to verify the SSL certificate or not
 * @param boolean $timeout_seconds Timeout in seconds; if zero then never time out
 * @return string Returned results
 */
function PostRestApi($url, $data = false, $header_array = false,
    $ssl_type = 6, $verify_ssl = true, $timeout_seconds = false) {

    // If cURL is not installed...
    if (! function_exists('curl_init')) {

        // Log and show the error
        $error = 'Function ' . __FUNCTION__ . ' Error: cURL is not installed.';
        error_log($error, 0);
        die($error);

    } else {

        // Initialize the cURL session
        $curl = curl_init($url);

        // Set the POST data
        $send = '';
        if ($data !== false) {
            if (is_array($data)) {
                $send = http_build_query($data);
            } else {
                $send = $data;
            }
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($curl, CURLOPT_POSTFIELDS, $send);
        }

        // Set the default header information
        $header = array('Content-Length: ' . strlen($send));
        if (is_array($header_array) && count($header_array) > 0) {
            $header = array_merge($header, $header_array);
        }
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

        // Set preferred TLS/SSL version
        curl_setopt($curl, CURLOPT_SSLVERSION, $ssl_type);

        // Verify the server's security certificate?
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, ($verify_ssl) ? 1 : 0);

        // Set the time out in seconds
        curl_setopt($curl, CURLOPT_TIMEOUT, ($timeout_seconds) ? $timeout_seconds : 0);

        // Should cURL return or print out the data? (true = return, false = print)
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        // Execute the request
        $result = curl_exec($curl);

        // Close cURL resource, and free up system resources
        curl_close($curl);
        unset($curl);

        // Return the results
        return $result;

    }
}
person Jeff Williams    schedule 24.04.2018