Como incluir arquivos PHP que requerem um caminho absoluto?

votos
83

Eu tenho uma estrutura de diretórios como o seguinte;

script.php

inc / include1.php
inc / include2.php

objetos / object1.php
objetos / object2.php

sabão / soap.php

Agora, eu uso esses objetos em ambas script.phpe /soap/soap.php, eu poderia movê-los, mas eu quero a estrutura de diretório como que por uma razão específica. Ao executar script.phpo caminho de inclusão é inc/include.phpe quando execução /soap/soap.phpé ../inc, caminhos absolutos trabalhar, /mnt/webdev/[project name]/inc/include1.php...Mas é uma solução feio se eu quiser mover o diretório para um local diferente.

Então, há uma maneira de usar caminhos relativos, ou uma maneira de gerar programically o /mnt/webdev/[project name]/?

Publicado 07/08/2008 em 04:46
fonte usuário
Em outras línguas...                            


11 respostas

votos
139

Isso deve funcionar

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Editar: imporvement adicionado por aussieviking

Respondeu 07/08/2008 em 05:20
fonte usuário

votos
41

Você pode usar caminhos relativos. Experimente __FILE__. Esta é uma constante PHP que retorna sempre o caminho / nome do arquivo do script que está em Então, no. soap.php, Você poderia fazer:

include dirname(__FILE__).'/../inc/include.php';

O caminho completo e nome do arquivo. Se usado dentro de um include, o nome do arquivo incluído é retornado. Desde o PHP 4.0.2, __FILE__sempre contém um caminho absoluto com links simbólicos resolvidos enquanto que em versões mais antigas que continha um caminho relativo em algumas circunstâncias. (fonte)

Outra solução seria a criação de um caminho de inclusão no seu httpd.conf ou um arquivo .htaccess.

Respondeu 07/08/2008 em 06:05
fonte usuário

votos
7

ter um olhar para http://au.php.net/reserved.variables

Eu acho que a variável que você está procurando é: $_SERVER["DOCUMENT_ROOT"]

Respondeu 07/08/2008 em 05:25
fonte usuário

votos
6

Você pode definir uma constante com o caminho para o diretório raiz do seu projeto, em seguida, colocar isso no início do caminho.

Respondeu 07/08/2008 em 05:04
fonte usuário

votos
4

Outra maneira de lidar com isso que elimina qualquer necessidade de inclui a todos é usar o autoload recurso. Incluindo tudo o que o script precisa "just in case" pode prejudicar o desempenho. Se o seu inclui são todas as definições de classe ou de interface, e você quiser carregá-los somente quando necessário, você pode sobrecarregar a __autoload()função com o seu próprio código para localizar o arquivo de classe apropriada e carregá-lo somente quando ele é chamado. Aqui está o exemplo do manual:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Contanto que você definir suas variáveis ​​include_path em conformidade, você nunca precisa incluir um arquivo de classe novamente.

Respondeu 18/09/2008 em 15:28
fonte usuário

votos
2

Eu encontrei este para trabalhar muito bem!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Usar:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>
Respondeu 10/02/2012 em 20:00
fonte usuário

votos
2

Outra opção, relacionada com Kevin, é o uso __FILE__, mas substituindo o nome do arquivo php de dentro dele:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Eu tenho usado isso por um tempo. O único problema é, às vezes você não tem $_SERVER['SCRIPT_NAME'], mas às vezes não há outra variável similar.

Respondeu 09/09/2008 em 23:49
fonte usuário

votos
1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Eu uso essa linha de código. Ele vai voltar para o "top" da árvore local, em seguida, vai para o arquivo desejado.

Por exemplo, digamos que eu tenho esta árvore de arquivos:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Posso incluir o arquivo functions.php de onde eu sou, apenas por cópia colando

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Se você precisa usar este código muitas vezes, você pode criar uma função que retorna a str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))parte. Em seguida, basta introduzir esta função no primeiro arquivo que você incluir. Eu tenho um arquivo "initialize.php" que incluem no topo de cada página php e que contém esta função. A próxima vez que eu tenho que incluir arquivos, eu na verdade apenas usar a função (nomeado path_back):

require(path_back()."/_resources/another_php_file.php");
Respondeu 13/04/2015 em 14:33
fonte usuário

votos
1

Eu acho que a melhor maneira é colocar o seu inclui no seu PHP include path. Existem várias maneiras de fazer isso, dependendo da sua configuração.

Então você pode simplesmente se referem a

require_once 'inc1.php';

de dentro de qualquer arquivo, independentemente de onde ele está se no seu inclui ou em seu web arquivos acessíveis, ou qualquer nível de subdiretórios aninhados.

Isso permite que você tenha o seu incluir arquivos fora da raiz do servidor web, que é uma prática recomendada.

por exemplo

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Além disso, confira __autoload para carregamento lento de arquivos de classe

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

Respondeu 07/08/2008 em 20:20
fonte usuário

votos
0

Se você estiver indo para incluir caminho específico na maioria dos arquivos em seu aplicativo, criar uma variável global para a pasta raiz.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Agora esta variável global " Application_Path " pode ser usado para incluir todos os arquivos em vez de chamar realpath () sempre que você incluir um novo arquivo.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Espero que ajude ;-)

Respondeu 09/05/2018 em 10:10
fonte usuário

votos
0

@Flubba, isso me permite ter pastas dentro do meu diretório de inclusão? plana incluem diretórios me dar pesadelos. como o todo objetos diretório deve estar no diretório inc.

Ah, sim, absolutamente. Assim, por exemplo, usamos uma única camada de subpastas, em geral:

require_once('library/string.class.php')

Você precisa ter cuidado com confiando no caminho incluem muito em sites de realmente de alto tráfego, porque php tem que caçar através do diretório atual e, em seguida, todos os diretórios no caminho incluem a fim de ver se o arquivo está lá e isso pode retardar as coisas se você está ficando batido.

Por exemplo, se você está fazendo MVC, você colocaria o caminho para o directoy aplicação no caminho de inclusão e especifique se referem a coisas na forma

'model/user.class'
'controllers/front.php'

como queiras.

Mas de modo geral, ele só permite trabalhar com caminhos muito curtos em seu PHP que irá trabalhar de qualquer lugar e é muito mais fácil de ler do que tudo o que documento realpath malarkey raiz.

O benefício dessas alternativas baseadas em script Outros sugeriram é que eles trabalham em qualquer lugar, até mesmo em caixas compartilhados; definindo o caminho de inclusão requer um pouco mais pensamento e esforço, mas como mencionei permite que você começar a usar __autoload que apenas o mais legal.

Respondeu 09/08/2008 em 00:17
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more