PHP incluir sempre falha

1
  • Apache HTTP Server 2.2.21 com VirtualHosts sob SuExec
  • PHP 5.3.8 via fcgid
  • Arch Linux 2011.08.19

Estou no processo de migração da hospedagem compartilhada para o VPS. O código que eu tinha corrido bem antes do movimento, mas agora está falhando nesta linha:

require_once($_SERVER['DOCUMENT_ROOT'] . 'includes/content/header.php');

O log de erros informa:

PHP Fatal error: require_once(): Failed opening required '/srv/www/hostname/public/includes/content/header.php' (include_path='.:/usr/share/pear') in /srv/www/hostname/public/index.php on line 3

Eu tentei a mesma linha sem a parte da raiz do documento, com e sem ./ , arquivo no mesmo diretório, etc. sem sorte. Nenhuma diferença com require , include_once ou include . Ainda assim, posso verificar se o arquivo existe nesse local exato copiando-e-colando do log de erros e cd ing para ele.

Eu fiz esta pergunta em SO e alguém me disse que era um problema do servidor Estou reafirmando aqui. (A questão mais semelhante que pude encontrar aqui foi nunca respondida ) de tentativas:

  • Nenhuma combinação de permissões ajuda (em diretórios ou arquivos); tentei de 644 para 777.
  • Todos os arquivos são chown'd pelo usuário / grupo SuExec.
  • O PHP relata a si mesmo como sendo executado sob o usuário / grupo correto.
  • Apache & Os logs de erros do SuExec não relatam nada.
  • O Modo de segurança está definido como "Desativado" em php.ini .
  • dirname(__FILE__) e exec('pwd') retornam o mesmo que $_SERVER['DOCUMENT_ROOT'] , mas sem a barra final; prefixar com um ou outro não faz diferença.
  • include , include_once , fread , file_exists , file_get_contents e realpath(dirname(__FILE__)) todos retornam false.
  • set_include_path() não tem efeito.
  • A execução de require via php-cgi diretamente da linha de comando retorna Internal Server Error, enquanto include retorna a saída em branco; executando via php retorna a saída em branco.

Aqui está minha configuração vhost:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/srv/www/hostname/public/"
    ServerName hostname.com
    ServerAlias www.hostname.com
    SuexecUserGroup hostname hostname
    ErrorLog "/srv/www/hostname/logs/error.log"
    LogLevel debug
    CustomLog "/srv/www/hostname/logs/access.log" combined

    <Directory /srv/www/hostname/public>
        Order allow,deny
        Allow from all
    </Directory>

    # http://www.linode.com/forums/viewtopic.php?t=2982
    <IfModule !mod_php5.c>
    <IfModule !mod_php5_filter.c>
    <IfModule !mod_php5_hooks.c>
    <IfModule mod_actions.c>
    <IfModule mod_alias.c>
    <IfModule mod_mime.c>
    <IfModule mod_fcgid.c>
        AddHandler php-fcgi .php
        Action php-fcgi /fcgid-bin/php-fcgid-wrapper
        Alias /fcgid-bin/ /srv/www/hostname/fcgid-bin/

        <Location /fcgid-bin/>
            SetHandler fcgid-script
            Options +ExecCGI
            Order allow,deny
            Allow from all
        </Location>

        ReWriteEngine On
        ReWriteRule ^/fcgid-bin/[^/]*$ / [PT]
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
    </IfModule>
</VirtualHost>
    
por Hugh Guiney 29.10.2011 / 23:10

2 respostas

1

Verifique se você tem open_basedir definido como algo diferente que um diretório pai de /srv/www/hostname/public/includes/content/ . Isso bloquearia a abertura ou inclusão desse arquivo. Certifique-se também de que o arquivo que você está abrindo não é um link simbólico para algo fora do seu open_basedir.

Isso normalmente imprimiria uma mensagem no nível de Aviso indicando que o arquivo foi bloqueado devido a open_basedir, mas se você tiver os erros desativados (ou pelo menos E_WARNING desativado), você não verá a mensagem.

    
por 30.10.2011 / 05:38
1

Você tem apparamor instalado e, se assim for, limita o que o processo do apache pode acessar? (verifique /etc/apparmor.d)

Além disso, tente fazer algo assim:

sudo -u nome do host cat /srv/www/hostname/public/includes/content/header.php

O que isso te dá?

    
por 29.10.2011 / 23:25