failed to open stream: Permission denied

Alles, was PHP betrifft, kann hier besprochen werden.

failed to open stream: Permission denied

Postby hardcoresnake » 30. July 2007 22:31

Hallo Leute,

habe folgedes Problem:
PC1 ist mein Webserver (Win32, Appache2.2.4, PHP 5.2, Mysql 5.0)
PC2 ist mein Fileserver (Server2003)

Jetzt würde ich gerne über PC1 Dateien per UNC Pfad von PC2 aufrufen, Pfade und Dateinamen sind in Mysql gespeichert (In diesem Fall .txt).
Mein Skript sieht so aus:
Code: Select all
<?PHP   
include("db_verbindung1.inc");   
$verb = mysql_connect($host, $user, $pwd);   
mysql_select_db("filme");   
$res = mysql_query("select pfad, hpfad, beschreibung from videoliste, pfade WHERE videoliste.pf_id = pfade.pf_id"); 
while ($dsatz = mysql_fetch_assoc($res)) 

readfile ($dsatz["pfad"].$dsatz["hpfad"].$dsatz["beschreibung"]); 
echo "<br>"; 


?>

Fehlermeldung sieht so aus:
Code: Select all
Warning: readfile(\\serv1\dfs\files\filme\doku\26\26.txt) [function.readfile]: failed to open stream: Permission denied in C:\xampp\htdocs\Filme\1.php on line 15

Doch an den Rechten kann es meiner Meinung nach nicht liegen, da ich aus dem selben ordner .jpg anzeigen lassen kann.

THX für eure Hilfe
hardcoresnake
 
Posts: 4
Joined: 30. July 2007 22:26

Postby Hanspeter Thöni » 31. July 2007 07:01

Läuft dein Apache als Dienst (Service?).

Im Normalfall läuft der Service als Benutzer 'Lokales System'. Der hat aber nur Zugriff auf Laufwerke im eigenen Rechner.

Du musst den Apachen mit einem Benutzer laufenlassen der auch Zugriff auf die Netzwerklaufwerke hat (z.B. deinen Benutzer).

Umstellen kann man das via Systemsteuerung->Verwaltung->Dienste.
Dort beim Dienst apache2 unter Anmelden deinen Benutzer/Passwort eintragen.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby hardcoresnake » 31. July 2007 18:16

Hallo Hanspeter,

genau das war das Problem. Jetzt funktioniert es einwandfrei.
Vielen herzlichen Dank.

Kannst du mir aber noch sagen warum er .jpg ausliest und die .txt nicht aus dem selben Ordner???
Wo liegt der Unterschied?

THX mfg
hardcoresnake
 
Posts: 4
Joined: 30. July 2007 22:26

Postby Hanspeter Thöni » 01. August 2007 11:09

hardcoresnake wrote:Kannst du mir aber noch sagen warum er .jpg ausliest und die .txt nicht aus dem selben Ordner???
Wo liegt der Unterschied?


Nun da kann ich nur Vermutungen anstellen.
Lädst du die *.jpg auch via den Apachen (http)? Wenn ja, würde es mich auch wundern dass es geht.

Falls du jedoch die *.jpg absolut verlinkt hast also so: '\\serv1\dfs\files\.......'
dann ist es klar warum es geht: Der Browser fordert in diesem Fall die Datei direkt ab Dateisystem vom Server (nicht via http-apache) und da der Browser in deinem Userkontext läuft ist der Zugriff natürlich möglich.
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby hardcoresnake » 01. August 2007 14:20

hallo,

der Code für das Bild sieht so aus und funktioniert auch ohne das ich die Rechte beim Dienst ändere:
Code: Select all
<?PHP
include("db_verbindung1.inc");
$verb = mysql_connect($host, $user, $pwd);
mysql_select_db("filme");
$res = mysql_query("select pfad, hpfad, b_datei from videoliste, pfade WHERE videoliste.pf_id = pfade.pf_id");
while ($dsatz = mysql_fetch_assoc($res))
{
echo "
<img src = '".$dsatz["pfad"].$dsatz["hpfad"].$dsatz["b_datei"]."'/>
";
}
?>


Eigentlich derselbe Code, nur das eine ist eben .jpg und funktioniert, aber .txt nicht.
Die Dateien liegen im selben Ordner und werden über den selben Pfad angesprochen \\serv1\dfs\files\....
Rechte auf den Ordner hat nur Benutzer von PC1 (einstweilen Vollzugriff).
Jeder habe ich entfernt.
Hab mir auch die Ereignissanzeige durgeschaut und bin draufgekommen, dass er beim Laden vom Bild immer den Benuzer mitschickt, bei der .txt versucht er mit dem Konto ANONYMOUS zu connecten, welches natürlich fehlschlägt.
Das verwirrt und irritiert mich ein wenig.
MFG
hardcoresnake
 
Posts: 4
Joined: 30. July 2007 22:26

Postby Hanspeter Thöni » 01. August 2007 17:26

Das ist ja genau das was ich vermutet habe.
Code: Select all
readfile ($dsatz["pfad"].$dsatz["hpfad"].$dsatz["beschreibung"]);


Hier liest du die datei mit PHP. PHP läuft im Apache Kontext, also mit dem Benutzer, der im Service eingetragen ist.

Nun zum Bild:
Code: Select all
<img src = '".$dsatz["pfad"].$dsatz["hpfad"].$dsatz["b_datei"]."'/>


Hier wird die Datei nicht von php gelesen sondern nur der Pfad an den Browser weitergereicht. Da die <img SRC=..> direkt auf das Bild zeigt, wird diese Bild nicht via Apache geladen, sondern der Browser holt sich dieses direkt ab deinem Rechner. Da der Browser aber nicht als Serivce läuft, sondern vom Benutzer normal gestartet ist läuft das ganze im Benutzerkontext des angemeldeteten Benutzers und funktioniert natürlich.

Rekapitulation:
1. Die *.txt wird von php gelesen (ist ja php-code) läuft also im Apache-Kontext
2. Das *.jpg wird vom Browser direkt geladen läuft also im Benutzerkontext

Ich versuche es mal Grafisch klarzumachen:
Zuerst die *.txt
Code: Select all
Server                       PHP/Aapache <--- 1. Request Seite --- Browser
Server <---2. fileread ----> PHP/Aapache                           Browser
Server                       PHP/Aapache ---- 3. File an Browser-> Browser


Und nun die *.jpg
Code: Select all
Server                       PHP/Aapache <--- 1. Request Seite --- Browser
Server                       PHP/Aapache ----> Pfad Bild an Br.--> Browser
Server   <-- Browser holt Bild direkt vom Server ----------------> Browser

Es findet also kein Datentransfer zwischen Apache/php und Server statt

Hoffe dass es jetzt verständlich ist. :wink:
Gruss Hanspeter
User avatar
Hanspeter Thöni
 
Posts: 233
Joined: 17. August 2004 10:29
Location: Schweiz

Postby hardcoresnake » 01. August 2007 20:19

hallo,

aso jetzt geht mir ein Licht auf, Danke für die tolle erklärung.

THX mfg
hardcoresnake
 
Posts: 4
Joined: 30. July 2007 22:26


Return to PHP

Who is online

Users browsing this forum: No registered users and 10 guests