Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?

Enviada por Aprendiz 
Aprendiz
Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
26 de April de 2017 às 07:53PM
Prezados,

Por que a $_SERVER['DOCUMENT_ROOT'] não funciona quando eu uso o script dentro de um serviço cron? No meu caso, o valor retornado é vazio.

Conteúdo do script:

<?php
echo "DOC ROOT: " . $_SERVER['DOCUMENT_ROOT'] . PHP_EOL;
<?php

Agora, se eu executar no browser funciona certinho.

Grato e aguardo qualquer orientação.

P.S.: A versão do PHP é a 5.3.
Felipe M. @LipESprY
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 03:06AM
Supondo que você esteja executando o script diretamente através do cron (ao contrário de um servidor web acessado por uma solicitação HTTP acionada por um cronjob (por exemplo, pelo cron executando o wget)), é claro que não funciona.

Não há servidor, portanto $ _SERVER não está definido.


Fonte: http://stackoverflow.com/questions/2100545/serverdocument-root-does-not-work-in-the-php-script-running-through-cron
Aprendiz
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 11:26AM
É isso mesmo, estou executando dentro do servidor mesmo, ou seja, é um cronjob.

Seguindo o seu raciocínio, que realmente explica tudo... e que no qual mostra que eu estava desatento com relação a esse detalhe, te pergunto: Como faço pra resolver isso? Teria como?

Grato pela sua atenção e aguardo seu comentário.
Felipe M. @LipESprY
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 03:05PM
Usando Linux ou Windows?
Lucas Tiago de Moraes
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 03:44PM
Creio que não funcione, porque o próprio manual fala que o conteudo dessa váriavel é gerado pelo servidor web:

"$_SERVER é um array contendo informação como cabeçalhos, paths, e localizações do script. As entradas neste array são criadas pelo servidor web. Não há garantia que cada servidor web proverá algum destes; servidores podem omitir alguns, ou fornecer outros não listados aqui. Dito isso, um grande número dessas variáveis são previstas pela » CGI 1.1 specification, então você deve estar hábil para esperá-las."


mas tente isso:

Execute na linha de comando:
php -r 'print_r($_ENV);'

Falou.
Aprendiz
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 11:12PM
Lucas Tiago de Moraes Escreveu:
-------------------------------------------------------
> Creio que não funcione, porque o próprio manual
> fala que o conteudo dessa váriavel é gerado pelo
> servidor web:
>
> "$_SERVER é um array contendo informação como
> cabeçalhos, paths, e localizações do script. As
> entradas neste array são criadas pelo servidor
> web. Não há garantia que cada servidor web
> proverá algum destes; servidores podem omitir
> alguns, ou fornecer outros não listados aqui.
> Dito isso, um grande número dessas variáveis
> são previstas pela » CGI 1.1 specification,
> então você deve estar hábil para esperá-las."
>
>
> mas tente isso:
>
> Execute na linha de comando:
> php -r 'print_r($_ENV);'
>
> Falou.

Entendi.

Eu já tentei algo semelhante com $ENV, mas deu na mesma.

Grato pela sua atenção.
Aprendiz
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
27 de April de 2017 às 11:13PM
Felipe M. @LipESprY Escreveu:
-------------------------------------------------------
> Usando Linux ou Windows?

No momento Linux, mas não custa ficar por dentro de como seria para as duas plataformas.
Felipe M. @LipESprY
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
28 de April de 2017 às 12:10AM
Não sei bem a função do seu script. Mas seria viável vc criar um cron para abrir uma página através do servidor web e então executar o seu script?

No Windows dá pra fazer via Agendador de Tarefas. Cria um arquivo .bat com a chamada para o website com o script.

É algo bastante "gambiarra", mas deve funcionar.

Sou extremamente leigo no Linux. Sempre utilizei Windows tanto no front-end como back-end. Então vai ser difícil eu te ajudar.
Lucas Tiago de Moraes
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
28 de April de 2017 às 03:54AM
Cara é $_ENV e não $ENV. Escreve os nomes nas funções corretamente, porque assim alguém pode ter a mesma duvida e não tera duvidas sobre o nome dessa variavel.

Tente usar:
realpath(dirname(__FILE__));

Falou.
Aprendiz
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
28 de April de 2017 às 07:28PM
Lucas Tiago de Moraes Escreveu:
-------------------------------------------------------
> Cara é $_ENV e não $ENV. Escreve os nomes nas
> funções corretamente, porque assim alguém pode
> ter a mesma duvida e não tera duvidas sobre o
> nome dessa variavel.
>
> Tente usar:
> realpath(dirname(__FILE__));
>
> Falou.

Eu sei que é $_ENV, mas como escrevo rápido e postei mais rápido ainda... ficou assim mesmo, pois como não tenho como EDITAR aqui no fórum não pude fazer mais nada. Mil desculpa!

Eu já havia tentado isso também, mas não fica como eu "sonhava".

Mais uma vez obrigado pela sua atenção.
Aprendiz
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
28 de April de 2017 às 07:32PM
Felipe M. @LipESprY Escreveu:
-------------------------------------------------------
> Não sei bem a função do seu script. Mas seria
> viável vc criar um cron para abrir uma página
> através do servidor web e então executar o seu
> script?
>
> No Windows dá pra fazer via Agendador de Tarefas.
> Cria um arquivo .bat com a chamada para o website
> com o script.
>
> É algo bastante "gambiarra", mas deve funcionar.
>
> Sou extremamente leigo no Linux. Sempre utilizei
> Windows tanto no front-end como back-end. Então
> vai ser difícil eu te ajudar.

Fica tranquilo, pois só a sua atenção e boa vontade em querer ajudar já me valeram a pena.

Se eu passa o "caminho/path" completo manualmente a coisa fica certinha, mas de certa forma "engessa", mão gosto muito disso.

Vou dar meu "pulos" e ver como posso fazer.

Mais uma vez muito obrigado pela sua valiosa atenção.

Forte abraço!
Felipe M. @LipESprY
Re: Por que o $_SERVER['DOCUMENT_ROOT'] não funciona no cron?
28 de April de 2017 às 08:03PM
Aprendiz Escreveu:
-------------------------------------------------------
> Prezados,
>
> Por que a $_SERVER['DOCUMENT_ROOT'] não funciona
> quando eu uso o script dentro de um serviço cron?

Aprendiz Escreveu:
-------------------------------------------------------
> Se eu passa o "caminho/path" completo manualmente
> a coisa fica certinha, mas de certa forma "engessa",
> mão gosto muito disso.

Fala aí, cara!

Vamos abrir um debate aqui, rapidinho.
A sua aplicação como um todo, obviamente tem uma pasta raiz a qual não muda! A menos que vc tenha mais de um servidor.

Seguindo esse raciocínio, vc já pensou em criar um arquivo de configuração para sua aplicação?
Uma forma simples e hardcoded, seria criar um script semelhante a isso:

Arquivo "configuracao.php":
<?php
$pastaRaiz = "C:/wwwroot";
// [...]
?>

Arquivo com o script citado:
<?php
require_once('configuracao.php');
echo "DOC ROOT: " . $pastaRaiz . PHP_EOL;
?>

A função "require_once()" faz a importação do arquivo "configuracao.php". Logo, vc poderá tratar todo o conteúdo da configuração no seu script, como por exemplo as variáveis.

Como vc citou, colocar o diretório manualmente resolve! Mas imagine um projeto com dezenas(+) de configurações e vc ter de mudar uma a uma no arquivo que a trata. Seria um grande desperdício de tempo.

De certa forma, esse método se torna menos "engessa" (Não entendi bem o significado da palavra, mas vai que cola...) do que:
> Se eu passa o "caminho/path" completo manualmente


Até existem outras formas mais seguras de vc armazenar as configurações. Mas como vc está iniciando (Aprendiz), essa será uma solução funcional.

Aliás, quer comentar sobre a função do seu script? Quem sabe nós (a comunidade) possamos ter dar algumas dicas e ideias.

Aprendiz Escreveu:
-------------------------------------------------------
>Mais uma vez muito obrigado pela sua valiosa atenção.
>
>Forte abraço!

Vlw e forte abraço!
Felipe M. @LipESprY Escreveu:
-------------------------------------------------------
> Aprendiz Escreveu:
> --------------------------------------------------
> -----
> > Prezados,
> >
> > Por que a $_SERVER['DOCUMENT_ROOT'] não
> funciona
> > quando eu uso o script dentro de um serviço
> cron?
>
> Aprendiz Escreveu:
> --------------------------------------------------
> -----
> > Se eu passa o "caminho/path" completo
> manualmente
> > a coisa fica certinha, mas de certa forma
> "engessa",
> > mão gosto muito disso.
>
> Fala aí, cara!
>
> Vamos abrir um debate aqui, rapidinho.
> A sua aplicação como um todo, obviamente tem uma
> pasta raiz a qual não muda! A menos que vc tenha
> mais de um servidor.
>
> Seguindo esse raciocínio, vc já pensou em criar
> um arquivo de configuração para sua
> aplicação?
> Uma forma simples e hardcoded, seria criar um
> script semelhante a isso:
>
> Arquivo "configuracao.php":
> <?php
> $pastaRaiz = "C:/wwwroot";
> // [...]
> ?>
>
> Arquivo com o script citado:
> <?php
> require_once('configuracao.php');
> echo "DOC ROOT: " . $pastaRaiz . PHP_EOL;
> ?>
>
> A função "require_once()" faz a importação do
> arquivo "configuracao.php". Logo, vc poderá
> tratar todo o conteúdo da configuração no seu
> script, como por exemplo as variáveis.
>
> Como vc citou, colocar o diretório manualmente
> resolve! Mas imagine um projeto com dezenas(+) de
> configurações e vc ter de mudar uma a uma no
> arquivo que a trata. Seria um grande desperdício
> de tempo.
>
> De certa forma, esse método se torna menos
> "engessa" (Não entendi bem o significado da
> palavra, mas vai que cola...) do que:
> > Se eu passa o "caminho/path" completo
> manualmente
>
>
> Até existem outras formas mais seguras de vc
> armazenar as configurações. Mas como vc está
> iniciando (Aprendiz), essa será uma solução
> funcional.
>
> Aliás, quer comentar sobre a função do seu
> script? Quem sabe nós (a comunidade) possamos ter
> dar algumas dicas e ideias.
>
> Aprendiz Escreveu:
> --------------------------------------------------
> -----
> >Mais uma vez muito obrigado pela sua valiosa
> atenção.
> >
> >Forte abraço!
>
> Vlw e forte abraço!

Olá Felipe,

Apesar de trabalho com isso... a muito tempo, me sinto sempre como um eterno APRENDIZ. (rs)

Pois é, a sua dica é perfeita, haja vista que eu já uso um "config.php" para a maioria das coisas.
Esse meu questionamento surgiu por acaso, devido eu está usando um serviço cron e como era uma
simulação, percebi que o script não funcionava de forma alguma, daí decide pedir ajuda aos colegas
aqui do fórum. Só depois de interagir como vocês foi que "ficha caiu" com relação ao $_SERVER['DOCUMENT_ROOT'] retorna vazio.

Mais uma vez obrigado pela sua valiosa atenção.

Forte abraço!
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.