En los scripts PHP, ya sea llamando include()
, require()
, fopen()
, o sus derivados, tales como include_once
, require_once
o incluso, move_uploaded_file()
uno a menudo se encuentra con un error o advertencia:
Error al abrir la secuencia: no existe tal archivo o directorio.
¿Cuál es un buen proceso para encontrar rápidamente la causa raíz del problema?
php
require
fopen
include-path
Vic Seedoubleyew
fuente
fuente
Respuestas:
Hay muchas razones por las cuales uno podría encontrarse con este error y, por lo tanto, una buena lista de verificación de qué verificar primero ayuda considerablemente.
Consideremos que estamos solucionando problemas en la siguiente línea:
Lista de Verificación
1. Verifique la ruta del archivo en busca de errores tipográficos
o mueva lo que sea llamado por
require*
oinclude*
a su propia variable, repítalo, cópielo e intente acceder a él desde un terminal:Luego, en una terminal:
2. Compruebe que la ruta del archivo es correcta con respecto a las consideraciones relativas frente a la ruta absoluta
/users/tony/htdocs
Mejores prácticas :
Para hacer que su script sea robusto en caso de que mueva cosas, mientras genera una ruta absoluta en tiempo de ejecución, tiene 2 opciones:
require __DIR__ . "/relative/path/from/current/file"
. La__DIR__
constante mágica devuelve el directorio del archivo actual.define una
SITE_ROOT
constante tu mismo:config.php
adentro
config.php
, escribeen cada archivo donde desee hacer referencia a la carpeta raíz del sitio, incluya
config.php
y luego use laSITE_ROOT
constante donde desee:Estas 2 prácticas también hacen que su aplicación sea más portátil porque no se basa en configuraciones ini como la ruta de inclusión.
3. Verifique su ruta de inclusión
Otra forma de incluir archivos, ni relativa ni puramente absoluta, es confiar en la ruta de inclusión . Este suele ser el caso de bibliotecas o marcos como el marco Zend.
Tal inclusión se verá así:
En ese caso, querrá asegurarse de que la carpeta donde está "Zend" sea parte de la ruta de inclusión.
Puede verificar la ruta de inclusión con:
Puede agregarle una carpeta con:
4. Verifique que su servidor tenga acceso a ese archivo
Es posible que, en conjunto, el usuario que ejecuta el proceso del servidor (Apache o PHP) simplemente no tenga permiso para leer o escribir en ese archivo.
Para verificar con qué usuario está ejecutando el servidor, puede usar posix_getpwuid :
Para conocer los permisos en el archivo, escriba el siguiente comando en el terminal:
y mira el permiso de notación simbólica
5. Compruebe la configuración de PHP
Si ninguno de los anteriores funcionó, entonces el problema es probablemente que algunas configuraciones de PHP le prohíben acceder a ese archivo.
Tres configuraciones podrían ser relevantes:
phpinfo()
o usandoini_get("open_basedir")
ini_get("allow_url_include")
y configurar conini_set("allow_url_include", "1")
Casos de esquina
Si nada de lo anterior habilitado para diagnosticar el problema, aquí hay algunas situaciones especiales que podrían suceder:
1. La inclusión de la biblioteca basándose en la ruta de inclusión
Puede suceder que incluya una biblioteca, por ejemplo, el marco Zend, utilizando una ruta relativa o absoluta. Por ejemplo :
Pero aún así obtienes el mismo tipo de error.
Esto podría suceder porque el archivo que ha incluido (con éxito) tiene una declaración de inclusión para otro archivo, y esa segunda declaración de asunción asume que ha agregado la ruta de esa biblioteca a la ruta de inclusión.
Por ejemplo, el archivo de marco Zend mencionado anteriormente podría incluir lo siguiente:
que no es una inclusión por ruta relativa, ni por ruta absoluta. Se supone que el directorio del marco Zend se ha agregado a la ruta de inclusión.
En tal caso, la única solución práctica es agregar el directorio a su ruta de inclusión.
2. SELinux
Si está ejecutando Security-Enhanced Linux, entonces podría ser la razón del problema, al negar el acceso al archivo desde el servidor.
Para verificar si SELinux está habilitado en su sistema, ejecute el
sestatus
comando en una terminal. Si el comando no existe, entonces SELinux no está en su sistema. Si existe, entonces debería decirle si se aplica o no.Para verificar si las políticas de SELinux son la razón del problema, puede intentar desactivarlo temporalmente. Sin embargo, tenga cuidado, ya que esto deshabilitará la protección por completo. No haga esto en su servidor de producción.
Si ya no tiene el problema con SELinux apagado, esta es la causa raíz.
Para resolverlo , deberá configurar SELinux en consecuencia.
Los siguientes tipos de contexto serán necesarios:
httpd_sys_content_t
para los archivos que desea que su servidor pueda leerhttpd_sys_rw_content_t
para archivos en los que desea acceso de lectura y escriturahttpd_log_t
para archivos de registrohttpd_cache_t
para el directorio de cachéPor ejemplo, para asignar el
httpd_sys_content_t
tipo de contexto al directorio raíz de su sitio web, ejecute:Si su archivo está en un directorio de inicio, también deberá activar el
httpd_enable_homedirs
booleano:En cualquier caso, podría haber una variedad de razones por las cuales SELinux negaría el acceso a un archivo, dependiendo de sus políticas. Entonces tendrá que investigar sobre eso. Aquí hay un tutorial específicamente sobre la configuración de SELinux para un servidor web.
3. Symfony
Si está utilizando Symfony y experimenta este error al cargar en un servidor, puede ser que la memoria caché de la aplicación no se haya restablecido, ya sea porque
app/cache
se cargó o porque la memoria caché no se ha borrado.Puede probar y solucionar esto ejecutando el siguiente comando de consola:
4. Caracteres no ACSII dentro del archivo Zip
Aparentemente, este error puede ocurrir también al llamar
zip->close()
cuando algunos archivos dentro del zip tienen caracteres no ASCII en su nombre de archivo, como "é".Una posible solución es envolver el nombre del archivo
utf8_decode()
antes de crear el archivo de destino.Créditos a Fran Cano por identificar y sugerir una solución a este problema
fuente
selinux
puede ser una buena idea aquí. al menos necesitaráhttpd_sys_content_t
(directorios y archivos de solo lectura utilizados por Apache) permiso en los archivos incluidos.chcon
es temporal y no sobrevivirá arestorecon
un reinicio. puede que necesite usarsemanage
para cambiar el contexto del archivo. Aquí hay un buen tutorial simple para el sitio webPara agregar a la (realmente buena) respuesta existente
Software de alojamiento compartido
open_basedir
es uno que puede confundirlo porque puede especificarse en una configuración de servidor web. Si bien esto se soluciona fácilmente si ejecuta su propio servidor dedicado, existen algunos paquetes de software de alojamiento compartido (como Plesk, cPanel, etc.) que configurarán una directiva de configuración por dominio. Debido a que el software construye el archivo de configuración (es decirhttpd.conf
), no puede cambiar ese archivo directamente porque el software de alojamiento simplemente lo sobrescribirá cuando se reinicie.Con Plesk, proporcionan un lugar para anular el
httpd.conf
llamado provistovhost.conf
. Solo el administrador del servidor puede escribir este archivo. La configuración de Apache se parece a estoHaga que el administrador de su servidor consulte el manual del software de alojamiento y servidor web que utilizan.
Permisos de archivo
Es importante tener en cuenta que la ejecución de un archivo a través de su servidor web es muy diferente de la ejecución de una línea de comando o trabajo cron. La gran diferencia es que su servidor web tiene sus propios usuarios y permisos. Por razones de seguridad, ese usuario está bastante restringido. Apache, por ejemplo, es a menudo
apache
,www-data
ohttpd
(dependiendo de su servidor). Un trabajo cron o ejecución de CLI tiene los permisos que tiene el usuario que lo ejecuta (es decir, ejecutar un script PHP como root se ejecutará con permisos de root).Muchas veces las personas resolverán un problema de permisos haciendo lo siguiente (ejemplo de Linux)
Esta no es una idea inteligente, porque el archivo o directorio ahora se puede escribir en todo el mundo. Si posee el servidor y es el único usuario, entonces esto no es un gran problema, pero si está en un entorno de alojamiento compartido, acaba de dar acceso a todos los que están en su servidor.
Lo que debe hacer es determinar los usuarios que necesitan acceso y darles acceso solo a ellos. Una vez que sepa qué usuarios necesitan acceso, querrá asegurarse de que
Ese usuario posee el archivo y posiblemente el directorio principal (especialmente el directorio principal si desea escribir archivos). En la mayoría de los entornos de alojamiento compartido, esto no será un problema, ya que su usuario debe poseer todos los archivos debajo de su raíz. A continuación se muestra un ejemplo de Linux
El usuario, y solo ese usuario, tiene acceso. En Linux, una buena práctica sería
chmod 600
(solo el propietario puede leer y escribir) ochmod 644
(el propietario puede escribir pero todos pueden leer)Puede leer una discusión más extensa sobre los permisos y usuarios de Linux / Unix aquí
fuente
Mi código funcionó bien en todas las máquinas, pero solo en este comenzó a dar problemas (supongo que solía funcionar). Se usó la ruta echo "document_root" para depurar y también se examinó de cerca el error, se encontró esto
Puedes ver fácilmente dónde están los problemas. Los problemas son // antes de las funciones
Así que simplemente elimine el cargamento / incluir y debería funcionar bien. Lo interesante es que este comportamiento es diferente en diferentes versiones. Ejecuté el mismo código en la computadora portátil, Macbook Pro y esta PC, todo funcionó bien hasta ahora. Espero que esto ayude a alguien.
fuente
Agregar script con parámetros de consulta
Ese fue mi caso. En realidad, enlaza con la pregunta # 4485874 , pero voy a explicarlo aquí en breve.
Cuando intenta
path/to/script.php?parameter=value
solicitar, PHP busca el archivo con nombrescript.php?parameter=value
, porque UNIX le permite tener rutas como esta.Si realmente necesita para pasar algunos datos de script incluido, simplemente declare como
$variable=...
o$GLOBALS[]=...
u otra forma que desee.fuente
Acciones de samba
Si tiene un servidor de prueba de Linux y trabaja desde un cliente de Windows, el recurso compartido de Samba interfiere con el comando chmod . Entonces, incluso si usa:
en el lado de Linux es totalmente posible que el Unix Group \ www-data todavía no tenga acceso de escritura. Una solución de trabajo si su recurso compartido está configurado es que los administradores de Windows están asignados a la raíz: desde Windows, abra los Permisos, desactive la Herencia de su carpeta con copia y luego otorgue acceso completo para www-data.
fuente
Otra posible causa: cambiar el nombre y / o mover archivos mientras está en un editor de texto. Pasé por todos los pasos anteriores sin éxito hasta que eliminé el archivo que seguía arrojando este error y creé uno nuevo, que solucionó el problema.
fuente