In response to EOD (07-Aug-2008 08:34) - this function is not designed to parse php files. It only returns the full contents of any file into a string.
If you're looking to parse a php file and output the full results into a string, you could use the ob_ functions wrapped around an 'include' instead:
<?php
ob_start();
include($filename);
$return_str = ob_get_contents();
ob_end_clean();
?>
file_get_contents
(PHP 4 >= 4.3.0, PHP 5)
file_get_contents — ファイルの内容を全て文字列に読み込む
説明
この関数は file() と似ていますが、 offset で指定した場所から開始し maxlen バイト分だけ ファイルの内容を文字列に読み込むという点が異なります。 失敗した場合、file_get_contents() は FALSE を返します。
file_get_contents()はファイルの内容を文字列に読み込む 方法として好ましいものです。もしOSがサポートしていれば パフォーマンス向上のためにメモリマッピング技術が使用されます。
注意: 空白のような特殊な文字を有する URI をオープンする場合には、 urlencode() でその URI をエンコードする必要があります。
パラメータ
- filename
-
データを読み込みたいファイルの名前。
- flags
-
警告
PHP 6 より前のバージョンでは、このパラメータは use_include_path という名前の bool パラメータでした。この flags パラメータは PHP 6 以降でのみ使用可能です。古いバージョンを使用しており、 filename を インクルードパス から探したい場合は、このパラメータには TRUE を設定することになるでしょう。 PHP 6 以降の場合は、同じ動作をさせたい場合は FILE_USE_INCLUDE_PATH フラグを指定します。
flags の値は、以下のフラグを組み合わせたものとなります (組み合わせ方には多少制限があります)。組み合わせる際には、論理 OR (|) 演算子で連結します。
使用できるフラグ フラグ 説明 FILE_USE_INCLUDE_PATH filename をインクルードディレクトリから探します。 詳細な情報は include_path を参照ください。 FILE_TEXT unicode が有効な場合、データ読み込み時のデフォルトのエンコーディングは UTF-8 です。 別のエンコーディングを指定するには、 独自のコンテキストを作成するか、あるいは stream_default_encoding() でデフォルトを変更します。 このフラグは FILE_BINARY と同時に使用することはできません。 FILE_BINARY このフラグを指定すると、ファイルをバイナリモードで読み込みます。これはデフォルトの設定で、 FILE_TEXT と同時に使用することはできません。 - context
-
stream_context_create() で作成したコンテキストリソース。 独自のコンテキストを使用する必要がない場合は、このパラメータに NULL を指定します。
- offset
-
読み込みを開始するオフセット位置。
- maxlen
-
読み込むデータの最大バイト数。
返り値
読み込んだデータを返します。失敗した場合は FALSE を返します。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.0.0 | コンテキストサポートが追加されました。 |
| 5.1.0 | offset と maxlen パラメータが追加されました。 |
| 6.0.0 | use_include_path パラメータが flags パラメータに置き換えられました。 |
注意
注意: この関数はバイナリデータに対応しています。
fopen wrappers が有効の場合、この関数のファイル名として URL を使用することができます。ファイル名の指定方法に関する詳細は fopen()、サポートされる URL プロトコルの種類 については、(例えば)サポートされるプロトコル/ラッパー を参照してください。
IIS のような、いくつかの標準に 対応してない Web サーバは、PHP に警告を発生させるような手順でデータを送信します。 このようなサーバを使用する場合は、 error_reporting を警告を発生しないレベルまで小さくする必要があります。 PHP 4.3.7 以降では、https:// ラッパーでストリームをオープンする際に バグがある IIS サーバソフトウエアを検出することができ、この警告を抑制することができます。 あなたが ssl:// ソケットを作成するために fsockopen() を使用している場合、 自らこの警告を検出し、抑制する必要があります。
file_get_contents
27-Aug-2008 06:19
10-Aug-2008 11:34
A UTF-8 issue I've encountered is that of reading a URL with a non-UTF-8 encoding that is later displayed improperly since file_get_contents() related to it as UTF-8. This small function should show you how to address this issue:
<?php
function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}
?>
07-Aug-2008 02:34
if $filename has a relative path file_get_contents returns the uninterpreted sourcecode of the php-file with all comments etc.
I don't know whether this is a bug or intented or caused by server-configuration.
I think this behaviour should be included in the description of the function.
05-Aug-2008 01:13
I recently upgraded my server to Slackware 12.0.
After this, a program of mine stopped working: the call to file_get_contents (to an URL served by a custom HTTP server) was returning false without generating any error!
After some investigations I saw this: my custom HTTP server closes the connection at the end of the content. This (without the header "Connection: close") seems to cause the problem I described.
To solve the problem I simply added that header to the answer of my custom HTTP server.
19-Jul-2008 02:17
if( false == ($str=file_get_contents( '../relative_path/test.txt' )))
echo "Could not read file.";
else
echo "File contents: $str";
# Note: if the file cannot be opened then file_get_contents will attempt to warn the following:
# Warning: file_get_contents(filename): failed to open stream
http://www.codesplunk.com/nr/questions/php1.html
15-Apr-2008 11:38
Setting the timeout properly without messing with ini values:
<?php
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1
)
)
);
file_get_contents("http://example.com/", 0, $ctx);
?>
02-Apr-2008 11:12
This is a nice and simple substitute to get_file_contents() using curl, it returns FALSE if $contents is empty.
<?php
function curl_get_file_contents($URL)
{
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}
?>
Hope this help, if there is something wrong or something you don't understand let me know :)
29-Jan-2008 08:29
<?PHP
//PHP 4.2.x Compatibility function
if (!function_exists('file_get_contents')) {
function file_get_contents($filename, $incpath = false, $resource_context = null)
{
if (false === $fh = fopen($filename, 'rb', $incpath)) {
trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING);
return false;
}
clearstatcache();
if ($fsize = @filesize($filename)) {
$data = fread($fh, $fsize);
} else {
$data = '';
while (!feof($fh)) {
$data .= fread($fh, 8192);
}
}
fclose($fh);
return $data;
}
}
?>
16-Jan-2008 12:58
I decided to make a similar function to this, called file_post_contents, it uses POST instead of GET to call, kinda handy...
<?php
function file_post_contents($url,$headers=false) {
$url = parse_url($url);
if (!isset($url['port'])) {
if ($url['scheme'] == 'http') { $url['port']=80; }
elseif ($url['scheme'] == 'https') { $url['port']=443; }
}
$url['query']=isset($url['query'])?$url['query']:'';
$url['protocol']=$url['scheme'].'://';
$eol="\r\n";
$headers = "POST ".$url['protocol'].$url['host'].$url['path']." HTTP/1.0".$eol.
"Host: ".$url['host'].$eol.
"Referer: ".$url['protocol'].$url['host'].$url['path'].$eol.
"Content-Type: application/x-www-form-urlencoded".$eol.
"Content-Length: ".strlen($url['query']).$eol.
$eol.$url['query'];
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);
if($fp) {
fputs($fp, $headers);
$result = '';
while(!feof($fp)) { $result .= fgets($fp, 128); }
fclose($fp);
if (!$headers) {
//removes headers
$pattern="/^.*\r\n\r\n/s";
$result=preg_replace($pattern,'',$result);
}
return $result;
}
}
?>
03-Dec-2007 05:56
Seems file looks for the file inside the current working (executing) directory before looking in the include path, even with the FILE_USE_INCLUDE_PATH flag specified.
Same behavior as include actually.
By the way I feel the doc is not entirely clear on the exact order of inclusion (see include). It seems to say the include_path is the first location to be searched, but I have come across at least one case where the directory containing the file including was actually the first to be searched.
Drat.
11-Jul-2007 11:38
If you're having problems with binary and hex data:
I had a problem when trying to read information from a ttf, which is primarily hex data. A binary-safe file read automatically replaces byte values with their corresponding ASCII characters, so I thought that I could use the binary string when I needed readable ASCII strings, and bin2hex() when I needed hex strings.
However, this became a problem when I tried to pass those ASCII strings into other functions (namely gd functions). var_dump showed that a 5-character string contained 10 characters, but they weren't visible. A binary-to-"normal" string conversion function didn't seem to exist and I didn't want to have to convert every single character in hex using chr().
I used unpack with "c*" as the format flag to see what was going on, and found that every other character was null data (ordinal 0). To solve it, I just did
str_replace(chr(0), "", $string);
which did the trick.
This took forever to figure out so I hope this helps people reading from hex data!
02-May-2007 06:26
you'll find the http response headers in: $http_response_header
;o)
17-Apr-2007 06:37
[Editors note: As of PHP 5.2.1 you can specify `timeout` context option and pass the context to file_get_contents()]
The only way I could get get_file_contents() to wait for a very slow http request was to set the socket timeout as follows.
ini_set('default_socket_timeout', 120);
$a = file_get_contents("http://abcxyz.com");
Other times like execution time and input time had no effect.
05-Dec-2006 09:52
Use the previous example if you want to request the server for a special part of the content, IF and only if the server accepts the method.
If you want a simple example to ask the server for all the content, but only save a portion of it, do it this way:
<?
$content=file_get_contents("http://www.google.com",FALSE,NULL,0,20);
echo $content;
?>
This will echo the 20 first bytes of the google.com source code.
04-Aug-2006 10:55
the bug #36857 was fixed.
http://bugs.php.net/36857
Now you may use this code,to fetch the partial content like this:
<?php
$context=array('http' => array ('header'=> 'Range: bytes=1024-', ),);
$xcontext = stream_context_create($context);
$str=file_get_contents("http://www.fcicq.net/wp/",FALSE,$xcontext);
?>
that's all.
15-Nov-2005 11:47
If, like me, you are on a Microsoft network with ISA server and require NTLM authentication, certain applications will not get out of the network. SETI@Home Classic and PHP are just 2 of them.
The workaround is fairly simple.
First you need to use an NTLM Authentication Proxy Server. There is one written in Python and is available from http://apserver.sourceforge.net/. You will need Python from http://www.python.org/.
Both sites include excellent documentation.
Python works a bit like PHP. Human readable code is handled without having to produce a compiled version. You DO have the opportunity of compiling the code (from a .py file to a .pyc file).
Once compiled, I installed this as a service (instsrv and srvany - parts of the Windows Resource Kit), so when the server is turned on (not logged in), the Python based NTLM Authentication Proxy Server is running.
Then, and here is the bit I'm really interested in, you need to tell PHP you intend to route http/ftp requests through the NTLM APS.
To do this, you use contexts.
Here is an example.
<?php
// Define a context for HTTP.
$aContext = array(
'http' => array(
'proxy' => 'tcp://127.0.0.1:8080', // This needs to be the server and the port of the NTLM Authentication Proxy Server.
'request_fulluri' => True,
),
);
$cxContext = stream_context_create($aContext);
// Now all file stream functions can use this context.
$sFile = file_get_contents("http://www.php.net", False, $cxContext);
echo $sFile;
?>
Hopefully this helps SOMEONE!!!
31-Jan-2005 08:23
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
