24

I want to get contents of a .php file in a variable on other page.

I have two files, myfile1.php and myfile2.php.

myfile2.php

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

Now I want to get the value echoed by the myfile2.php in an variable in myfile1.php, I have tried the follwing way, but its taking all the contents including php tag () also.

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

Please tell me how I can get contents returned by one PHP file into a variable defined in another PHP file.

Thanks

djmzfKnm
  • 26,679
  • 70
  • 166
  • 227
  • The non-accepted answer below is the better one: http://stackoverflow.com/a/851773/632951 – Pacerier Aug 07 '13 at 07:32
  • **ALWAYS BE CAREFULL**, because if you will use `ob_get_contents()` , then you may need to do `ob_end_flush` , otherwises you may have problems, if you use will use any php `header` command after that. – T.Todua May 03 '15 at 12:58

9 Answers9

39

You have to differentiate two things:

  • Do you want to capture the output (echo, print,...) of the included file and use the output in a variable (string)?
  • Do you want to return certain values from the included files and use them as a variable in your host script?

Local variables in your included files will always be moved to the current scope of your host script - this should be noted. You can combine all of these features into one:

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"

The return-feature comes in handy especially when using configuration files.

config.php

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

app.php

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

EDIT

To answer your question about the performance penalty when using the output buffers, I just did some quick testing. 1,000,000 iterations of ob_start() and the corresponding $o = ob_get_clean() take about 7.5 seconds on my Windows machine (arguably not the best environment for PHP). I'd say that the performance impact should be considered quite small...

Ulrich Thomas Gabor
  • 6,584
  • 4
  • 27
  • 41
Stefan Gehrig
  • 82,642
  • 24
  • 155
  • 189
20

If you only wanted the content echo()'ed by the included page, you could consider using output buffering:

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

See http://php.net/ob_start

harto
  • 89,823
  • 9
  • 47
  • 61
  • ob_start() is new for me. So, @harto can you suggest me which method will do better according to performance, your method or the method @zombat suggested ?? – djmzfKnm May 12 '09 at 06:29
  • 1
    Output buffering adds a small performance hit, as there is overhead in initializing and maintaining the buffers. – zombat May 12 '09 at 06:36
  • 1
    @Prashant: I don't have any data available, but I'd guess that the performance impact would be negligible. You could try both methods and see if there's a measurable difference between the two, but I think it would be very small indeed. – harto May 12 '09 at 06:41
14

I always try to avoid ob_ functions. Instead, I use:

<?php
$file = file_get_contents('/path/to/file.php');
$content = eval("?>$file");
echo $content;
?>
T.Todua
  • 53,146
  • 19
  • 236
  • 237
  • 2
    Your answer is interesting. Can you please share that why you avoid output buffering, and use eval() instead? Your answer will be a good knowledge for me. – Saeed Afzal Nov 06 '15 at 07:58
  • Thanks for the `eval("?>$file")` trick. That's really useful. – Tobia Jul 05 '16 at 15:24
  • 1
    OB_ functions modify the output buffer, and the many other codes in CMS could be using buffer functions indpendently at that time, and it may come into conflict, or clean buffer, or modify it... So,I never touch it. – T.Todua May 02 '17 at 08:18
  • 4
    If eval() is the answer, you're almost certainly asking the wrong question. -- Rasmus Lerdorf, BDFL of PHP – chris Nov 07 '18 at 15:40
5

You can use output buffers, which will store everything you output, and will not print it out unless you explicitly tell it to, or do not end/clear the buffers by the end of path of execution.

// 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();
Lux
  • 1,540
  • 1
  • 22
  • 28
5

You can use the include directive to do this.

File 2:

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

File 1:

<?php 

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

?>
zombat
  • 92,731
  • 24
  • 156
  • 164
  • I know this method already and its working fine, but is there no way other than this? – djmzfKnm May 12 '09 at 06:19
  • @Prashant And what is your problem with this method? It is indented for doing this. – viam0Zah May 12 '09 at 06:38
  • Actually I was just looking that is there any "return " type method which can directly give me the value. Anyways I adopted @zombat's answer as the method suggested by @harto may have some performance issues, and I can't compromise with performance. Thanks guyz. – djmzfKnm May 12 '09 at 06:44
5

"Actually I was just looking that is there any return type method which can directly give me the value" - You just answered your own question.

See http://sg.php.net/manual/en/function.include.php, Example #5

file1.php:

<? return 'somevalue'; ?>

file2.php:

<?

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

?>
Shanshui
  • 684
  • 1
  • 5
  • 12
1

Please try this code

myfile1.php

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

myfile2.php

<?PHP
    $myvar="prashant";
    echo $myvar;
?>
Chinmay235
  • 3,236
  • 8
  • 62
  • 93
0

If you want to get all over site use by

<?php
$URL = 'http://www.example.com/';
$homepage = file_get_contents($URL);
echo $homepage;
?>
gmadd
  • 1,146
  • 9
  • 18
vish
  • 1
0

If you want to return the output from code in a file, simply just make a RESTful API call to it. This way, you can use the same code file for ajax calls, REST API, or for your internal PHP code.

It requires cURL to be installed but no output buffers or no includes, just the page executed and returned into a string.

I'll give you the code I wrote. It works with nearly every REST/web server (and even works with Equifax):

$return = PostRestApi($url);

or

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

Here is the function:

/**
 * 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;

    }
}