În scripturi PHP, fie sunat pentru a include(),
require(),
fopen(), sau derivați ai acestora, cum ar fi
include_once,
require_once, sau chiar
move_uploaded_file()`, o de multe ori se execută într-o eroare sau un avertisment:
nu a Reușit să deschidă flux : Nu există un astfel de fișier sau director.
Ce este un bun proces rapid găsi cauza rădăcină a problemei?
Există multe motive de ce unul ar putea rula în această eroare și, astfel, o bună listă de verificare a ceea ce pentru a verifica în primul rând ajută considerabil. Las's ia în considerare că suntem depanare următoarea linie:
require "/path/to/file"
/users/tony/htdocs
. A [
DIR magie constanta]magicconst-docs a se întoarce directorul de fișier curent. SITE_ROOT
constanta pentru tine : config.php
config.php
, scrie
defini('SITE_ROOT', DIR); config.php
, și de a folosi apoi SITE_ROOT
constanta oriunde doriți :
require_once DIR."/../config.php";
...
require_once SITE_ROOT."/alte/fișier.php";
Aceste 2 destinații de plasare, de asemenea, cererea dumneavoastră mai portabil pentru că nu se bazează pe ini setări, cum ar fi calea de includere.
O altă modalitate de a include fișierele, nici relativ nici pur, absolut, este să se bazeze pe includ cale. Acest lucru este adesea cazul pentru biblioteci sau cadre, cum ar fi Zend framework. Astfel de includere va arăta astfel :
include "Zend/Mail/Protocol/Imap.php"
În acest caz, veți dori să asigurați-vă că folderul unde "Zend" este, este parte din calea de includere. Puteți verifica calea de includere cu :
echo get_include_path();
Puteți adăuga un dosar cu :
set_include_path(get_include_path().":"."/path/to/new/folder");
Ar putea fi faptul că toate împreună, utilizatorul execută procesul de server (Apache sau PHP) pur și simplu nu - 't au permisiunea de a citi sau scrie la acel fișier. Pentru a verifica în ce utilizatorul serverul este pornit, puteți folosi posix_getpwuid :
$user = posix_getpwuid(posix_geteuid());
var_dump($user);
Pentru a afla permisiunile pe fișier, tastați următoarea comandă în terminal:
ls -l <path/to/file>
și uită-te la permisiunea simbolic notație
Dacă niciuna dintre cele de mai sus nu funcționează, atunci problema este probabil că unele setari PHP interzic accesul la fișier. Trei setări ar putea fi relevante :
phpinfo()
sau prin utilizarea ini_get("open_basedir")
și a stabilit cu ini_set("allow_url_include", "1")
Dacă niciuna dintre cele de mai sus activat pentru a diagnostica problema, aici sunt unele situații speciale care ar putea întâmpla :
Se poate întâmpla să te includ o bibliotecă, de exemplu, Zend framework, folosind o rudă sau o cale absolută. De exemplu :
require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"
Dar atunci încă obține același tip de eroare. Acest lucru se poate întâmpla pentru că dosarul care îl ai (cu succes) a inclus, în sine are o includ declarație pentru un alt dosar și că a doua include declarația presupune că ați adăugat calea pe care biblioteca pentru a include calea. De exemplu, Zend framework fișierul menționat mai înainte ar putea avea următoarele includ :
include "Zend/Mail/Protocol/Exception.php"
care nu este nici o incluziune de cale relativă, nici prin cale absolută. Este presupunând că Zend framework director a fost adăugat la calea de includere.
În acest caz, singura soluție practică este de a adăuga directorul tale includ cale.
Dacă se execută Security-Enhanced Linux, atunci acesta ar putea fi motivul pentru problema cu refuzul de acces la fișierul de pe server. Pentru a verifica dacă SELinux este activată pe sistemul dvs., condus `sestatus comandă într-un terminal. Dacă comanda nu exista, atunci SELinux nu este pe sistemul dumneavoastră. Dacă nu există, atunci ar trebui să vă spun dacă este sau nu aplicată. Pentru a verifica dacă SELinux politici sunt motivul pentru o problemă, puteți încerca să-l dezactivați temporar. Cu toate acestea, să fie ATENT, deoarece acest lucru va dezactiva protecția în întregime. Nu face acest lucru pe server de producție.
setenforce 0
Dacă nu mai aveți problema cu SELinux oprit, atunci aceasta este cauza principala. Să rezolve, va trebui să configurați SELinux în mod corespunzător. Următoarele context tipuri va fi necesar :
httpd_cache_t
pentru directorul cache
De exemplu, pentru a atribui `httpd_sys_content_t context tip pentru site-ul tău directorul rădăcină, a alerga : semanage fcontext -a -t httpd_sys_content_t "/path/to/root(/.*)?"
restorecon -Rv /path/to/root
Dacă fișierul este în directorul home, va, de asemenea, nevoie pentru a porni pe httpd_enable_homedirs
boolean :
setsebool -P httpd_enable_homedirs 1
În orice caz, ar putea fi o varietate de motive de ce SELinux-ar refuza accesul la un fișier, în funcție de politici. Deci, va trebui să se intereseze asta. Aici este un tutorial special privind configurarea SELinux pentru un server web.
Dacă sunteți folosind Symfony, și se confruntă cu această eroare atunci când le încărcați pe un server, atunci acesta poate fi că aplicația's cache n't a fost resetat, fie pentru că app/cache` a fost încărcat, sau care cache-ul nu't a fost eliminat. Puteți testa și de a rezolva acest lucru prin rularea următoarea comandă consola:
cache:clear
Aparent, această eroare se poate întâmpla, de asemenea, la convocarea zip->close()
atunci când unele fișiere în interiorul zip, au caractere non-ASCII în numele fișierului, cum ar fi "é".
O posibilă soluție este să-și încheie în numele de fișier în către utf8_decode()
înainte de a crea fișierul țintă.
Credite Fran Cano pentru identificarea și sugerează o soluție pentru această problemă
Pentru a adăuga la (foarte bun) existente răspunde
open_basedir
este una care poate te incurc, deoarece acesta poate fi specificat într-o configurație de server web. În timp ce acest lucru este ușor de remediat dacă tu a alerga propriul server dedicat, există unele shared hosting pachete software de acolo (ca Plesk, cPanel, etc), care va configura o directiva de configurare pentru fiecare domeniu de bază. Deoarece software-ul construiește fișierul de configurare (de exemplu httpd.conf
) nu se poate modifica acel fisier direct pentru hosting software va suprascrie doar că atunci când repornește.
Cu Plesk, ele oferă un loc pentru a trece peste condiția httpd.conf
numit vhost.conf
. Numai server admin pot scrie acest fișier. De configurare pentru Apache arata ceva de genul asta
<Directory /var/www/vhosts/domain.com>
<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir "/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR"
</IfModule>
</Directory>
Au server admin consultați manualul pentru hosting și web server software-ul folosit.
L's important să rețineți că, de executare un fișier prin serverul dvs. de web este foarte diferit de la o linie de comandă sau locuri de muncă cron execuție. Diferența mare este că serverul web are propria utilizator și permisiuni. Din motive de securitate care utilizatorul este destul de limitat. Apache, de exemplu, este de multe ori apache
, www-date " sau " httpd
(depinde de server). Un loc de muncă cron sau CLI execuție a indiferent de permisiunile pe care utilizatorul rulează-l are (de exemplu, rulează un script PHP ca root va executa cu permisiuni de root).
De multe ori oamenii se vor rezolva un permissions problema de a face următoarele (Linux, de exemplu)
chmod 777 /path/to/file
Aceasta nu este o idee bună, pentru că de fișier sau director este acum lumea inscriptibil. Dacă ai propriul server și sunt singurul utilizator atunci e't o astfel de afacere mare, dar dacă te're pe un shared hosting mediul'am dat la toată lumea de pe server-ul dvs. de acces.
Ceea ce trebuie să faceți este de a determina utilizator(i) care au nevoie de acces și de a oferi numai acele a le accesa. Odată ce știi care utilizatorii au nevoie de acces'll doriți să vă asigurați că
chown apache:apache /path/to/file
chmod 600
(numai proprietarul poate citi și scrie) sau chmod 644
(proprietarul poate scrie, dar toată lumea poate citi)Puteti citeste mai extins discuție de Linux/Unix și utilizatorii permissions here
Codul meu a lucrat bine pe toate mașinile, dar numai pe asta a început oferindu-problemă (care a folosit pentru a lucra găsiți cred). Folosit echo "document_root" calea pentru a depana și, de asemenea, sa uitat atent la eroare, găsit asta
Atentie: include(D:/MyProjects/testproject//functions/connections.php): nu a reușit să deschidă flux:
Puteți vedea cu ușurință în cazul în care problemele sunt. Problemele sunt // înainte de funcții
$document_root = $_SERVER['DOCUMENT_ROOT'];
echo "root: $document_root";
include($document_root.'/functions/connections.php');
Deci, pur și simplu scoateți trăsură / de la includă și ar trebui să funcționeze bine. Ceea ce este interesant este acest comportament este diferit pe diferite versiuni. Am rulat același cod pe Laptop, Macbook Pro și acest lucru PC-ul, totul a mers bine pana. Sper că acest lucru ajută cineva.
Asta a fost cazul meu. De fapt link-uri la întrebare #4485874, dar am'm de gând să explic aici în scurt timp.
Atunci când încercați să necesita cale/catre/script.php?parametru=valoare
, PHP caută fișier numit script-ul.php?parametru=valoare
, deoarece UNIX vă permite să aibă căi de genul asta.
Dacă sunteți într-adevăr nevoie pentru a trece unele date pentru a include script-ul, doar declara ca $variabila=...
sau $GLOBALS[]=...
sau alte așa cum vă place.
Acțiuni Samba
Dacă aveți un Linux server de test si lucrezi la un Client Windows, partajarea Samba interferează cu chmod comandă. Deci, chiar dacă folosiți:
chmod -R 777 myfolder
pe partea de Linux este pe deplin posibil ca Unix Grup\www-date încă nu't au acces de scriere. Un singur lucru soluție în cazul în care partea ta este că Windows admini sunt mapate la rădăcină: De la Windows, deschideți Permisiuni, dezactiva Moștenire pentru dosar cu copie, și apoi să acorde acces deplin pentru www-date.
O altă cauză posibilă: Redenumirea și/sau mutarea fișierelor în timp ce într-un editor de text. Am trecut prin toti pasii de mai sus, fără succes, până când am eliminat fișierul care tot arunca această eroare și a creat unul nou, care a rezolvat problema.