Php вывод информации из файла

How to execute and get content of a .php file in a variable?

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.

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

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.

9 Answers 9

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:

$hello = "Hello"; echo "Hello World"; return "World"; 
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.

return array( 'host' => 'localhost', . ); 
$config = include 'config.php'; // $config is an array 

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.

Читайте также:  Php foreach array unique

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 

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 ??

Output buffering adds a small performance hit, as there is overhead in initializing and maintaining the buffers.

@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.

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

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.

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.

If eval() is the answer, you’re almost certainly asking the wrong question. — Rasmus Lerdorf, BDFL of PHP

You can use the include directive to do this.

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.

«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.

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(); 

If you want to get all over site use by

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):

$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; > > 

Источник

file_get_contents

Данная функция похожа на функцию file() с той лишь разницей, что file_get_contents() возвращает содержимое файла в строке, начиная с указанного смещения offset и до length байт. В случае неудачи, file_get_contents() вернёт false .

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.

Замечание:

Если вы открываете URI, содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode() .

Список параметров

Замечание:

Можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path. Только помните, что если вы используете строгую типизацию, то так сделать не получится, поскольку FILE_USE_INCLUDE_PATH имеет тип int . В таком случае используйте true .

Корректный ресурс контекста, созданный с помощью функции stream_context_create() . Если в использовании особого контекста нет необходимости, можно пропустить этот параметр передав в него значение null .

Смещение, с которого начнётся чтение оригинального потока. Отрицательное значение смещения будет отсчитываться с конца потока.

Поиск смещения ( offset ) не поддерживается при работе с удалёнными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но результат будет непредсказуемым, так как функция работает на буферизованном потоке.

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

Возвращаемые значения

Функция возвращает прочтённые данные или false в случае возникновения ошибки.

Эта функция может возвращать как логическое значение false , так и значение не типа boolean, которое приводится к false . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Ошибки

Будет сгенерирована ошибка уровня E_WARNING в случаях, если не удастся найти filename , задан length меньше нуля, или поиск по смещению offset в потоке завершится неудачно.

Когда file_get_contents() вызывается в каталоге, в Windows ошибка генерируется E_WARNING , а с PHP 7.4 также в других операционных системах.

Список изменений

Версия Описание
8.0.0 Параметр length теперь допускает значение null .
7.1.0 Добавлена поддержка отрицательных значений offset .

Примеры

Пример #1 Получить и вывести исходный код домашней страницы сайта

Пример #2 Поиск файлов в include_path

// Если включены строгие типы, то есть объявлено (strict_types=1);
$file = file_get_contents ( ‘./people.txt’ , true );
// Иначе
$file = file_get_contents ( ‘./people.txt’ , FILE_USE_INCLUDE_PATH );
?>

Пример #3 Чтение секции файла

// Читаем 14 символов, начиная с 21 символа
$section = file_get_contents ( ‘./people.txt’ , FALSE , NULL , 20 , 14 );
var_dump ( $section );
?>

Результатом выполнения данного примера будет что-то подобное:

Пример #4 Использование потоковых контекстов

// Создаём поток
$opts = array(
‘http’ =>array(
‘method’ => «GET» ,
‘header’ => «Accept-language: en\r\n» .
«Cookie: foo=bar\r\n»
)
);

$context = stream_context_create ( $opts );

// Открываем файл с помощью установленных выше HTTP-заголовков
$file = file_get_contents ( ‘http://www.example.com/’ , false , $context );
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify . PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

Смотрите также

  • file() — Читает содержимое файла и помещает его в массив
  • fgets() — Читает строку из файла
  • fread() — Бинарно-безопасное чтение файла
  • readfile() — Выводит файл
  • file_put_contents() — Пишет данные в файл
  • stream_get_contents() — Читает оставшуюся часть потока в строку
  • stream_context_create() — Создаёт контекст потока
  • $http_response_header

Источник

Оцените статью