[PHP]fopen permission denied opvangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
Hallo,

Ik ben een script aan het schrijven die ik wil uitbrengen voor publiek gebruik.
Nu werkt het script prima, en doet alles wat hij moet doen.

Het enige punt is, dat als error reporting aanstaat, dat hij de voglende melding geeft:

"Warning: fopen(xml/guildinfo.xml): failed to open stream: Permission denied in <blah>"

nu weet ik precies wat het is, want de rechten staan niet goed. Dat heb ik ook bewust gedaan om te kijken hoe we hier mee om kunnen gaan als mensen niet rechten kunnen zetten.

Het enige punt nu is, dat ik niet goed kan checken of de permissions denied zijn of niet.

wat doet het script:

pseudocode:
code:
1
2
3
4
5
6
   check oif bestand bestaat && check of bestand schrijfbaar is  && check of bestand ouder is dan X dagen
--> zo ja: 
     open de externe xml file, en sla hem op onder /xml/guildinfo.xml
-->  zo nee: 
    return false;
-- einde functie


mijn probleem is dat ik met:
fopen($filename, 'w') en is_writable($filename) blijkbaar de permission denied niet kan opvangen.

Ik kan redelijk veel met php, alleen ben niet zoveel bezig geweest met het filesystem... zie ik een functie hiervoor over het hoofd?

heb de search gebruikt, maar de info heb ik neit echt de fouten eruit kunnen halen mee (clearstatcache), hij blijft dus letterlijk hangen bij fopen.. en wil dat net dus als een isset() op kunnen vangen

[ Voor 8% gewijzigd door gitaarwerk op 05-08-2008 18:41 ]

Ontwikkelaar van NPM library Gleamy


Acties:
  • 0 Henk 'm!

Verwijderd

Errors/Exceptions

If the open fails, the function an error of level E_WARNING is generated. You may use @ to suppress this warning.
Dus, of try/catch (weet niet of E_WARING wordt gecatched) of @ en dan checken achter of de file open is?

Domdom: is_readable():

http://nl3.php.net/is_readable

[ Voor 10% gewijzigd door Verwijderd op 05-08-2008 18:41 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Die warning krijg je sowieso. Ofwel ga je fouten/warnings afhandelen met een eigen error handler (zoek eens op set_error_handler()), ofwel onderdruk je de fout met @ (@fopen(xml/guildinfo.xml)).

March of the Eagles


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Je kunt controleren of wat je terugkrijgt van fopen FALSE is, zo ja, dan is er iets mis gegaan.
Met error_get_last kun je zien wat de laatste foutmelding was.

Eventueel kun je ook het hele foutafhandelingsgebeuren zelf schrijven.

Acties:
  • 0 Henk 'm!

  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
de false werkt, alleen blijven de foutmeldingen ik wil eigenlijk zo min mogelijk met @ werken, maar het schijnt wel goed te werken.. ik ga nu even proberen met rechten zetten en kijken of alles op deze manier nu goed werkt

(de tip van Boland & _js_ nu geprobeerd), post zo het resultaat :Y)

[ Voor 16% gewijzigd door gitaarwerk op 05-08-2008 18:47 ]

Ontwikkelaar van NPM library Gleamy


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Suppress de warning met een @, om vervolgens de fout op te vangen met or en een exception op te gooien:
PHP:
1
2
3
4
5
6
7
8
9
10
function openCustomFile( $filename ){
  $handler = @fopen( $filename ) or throw new Exception( "Could not open file!" );
  return $handler;
}

try{
  openCustomFile( $myFile );
}catch( Exception $e ){
  echo $e->getMessage();
}
Verwijderd schreef op dinsdag 05 augustus 2008 @ 18:41:
[...]

Dus, of try/catch (weet niet of E_WARING wordt gecatched) of @ en dan checken achter of de file open is?
Warnings != exceptions, dus een warning catchen kan niet.
Domdom: is_readable();
Check dan ook voor is_writable want anders kan je alleen read-only fopen gebruiken ;)

Acties:
  • 0 Henk 'm!

  • gitaarwerk
  • Registratie: Augustus 2001
  • Niet online

gitaarwerk

Plays piano,…

Topicstarter
de @ werkte perfect :)


PHP:
1
2
3
$filename = 'xml/guildinfo.xml'; // location of the xml sheet
$handle = @fopen($filename, 'w');
if(file_exists($filename) && is_writable($filename) && $handle)


is_readable(); is opzich niet nodig, want ik haal de xml files anders op dan met fopen. Dat word trouwens ook afgehandeld door een functie (xml2array library die ik gebruik.

moet puur schrijfbaar zijn dus :)

nu effe checken waarom hij na het f5-en de complete xml file leeggooit ^_^...maar zal wel een ander probleem zijn denk ik :)


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    function UpdateArmory($filename)
    {
            
            $stat = stat($filename);
            
            if(($stat[7] < 10 || date('Ymd', filemtime($filename)) < date('Ymd') || (isset($_GET['force_update'])) && $_GET['force_update']=='yes'))
            {
    
                $f = 1;
                $c = 2;//1 for header, 2 for body, 3 for both
                $r = NULL;
                $a = NULL;
                $cf = NULL;
                $pd = NULL;
                $page = open_page(ARMORY_EXTERNAL_URL,$f,$c,$r,$a,$cf,$pd); // hier haalt hij een xml bestand op... ga er vanuit dat het adres welke hij ophaalt goed is :)
                
                $handle = fopen($filename, 'w');
                fwrite($handle, $page);
                fclose($handle);
            }
            
    }
    
// deze functie word binnen de bovenstaande if aangeroepen.


edit: ok, dit is nu ook opgelost, misschien krijgen andere hier ook mee te maken, dus voor de search even een bijdrage.

Probleem
na het reloaden word het bestand leeg achter geladen. Om de handler te kunnen checken blijft
code:
1
$handler = fopen($filename, 'w')

open. omdat het hier om alleen schrijven gaan en de contents verloren gaan, maar moet toch gechecked worden.

oplossing:
De $handler-variabele aan de functie meegeven, lost dit op, dan gebruik je dezelfde handler. In mijn geval is het niet mogelijk, of moet nog even naar mijn script kijken.

Wat ik als andere oplossing heb.. is de waarde 'aw' gebruiken. Omdat we heir alleen controlleren, blijft de content bestaan, en aangezien ik niet altijd de inhoud update, blijft deze vol. 'AW' staat namelijk voor APPEND WRITE (en vult dus in princiepe het bestand aan vanaf de laatste teken.)

Ik gebruik zelf een 'w' commando later, dus deze word als nodig alsnog overschreven. Hiermee bereik ik het gewenste effect.

uiteindelijek code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$filename = 'xml/guildinfo.xml'; // location of the xml sheet
$handle = @fopen($filename, 'aw');

if(file_exists($filename) && is_writable($filename) && $handle)
{
    // when the armory is laoded from local xml sheet
    $GUILD_FUNCTIONS->UpdateArmory($filename); // updates the armory when needed
    $url=ARMORY_INTERNAL_URL;
    echo $linked_from = $GUILD_FUNCTIONS->ParseLinkInformation('internal');
}
else
{
    // when the armory is not able to be written, then it will load from the Blizzard Armory directly
    $url=ARMORY_EXTERNAL_URL;
    echo $linked_from = $GUILD_FUNCTIONS->ParseLinkInformation('external');
}

// functie bestand
class GUILD_FUNCTIONS
{
    function UpdateArmory($filename)
    {
            $stat = stat($filename);
            
            if(($stat[7] < 10 || date('Ymd', filemtime($filename)) < date('Ymd') || (isset($_GET['force_update'])) && $_GET['force_update']=='yes'))
            {
                clearstatcache();
                $f = 1;
                $c = 2;//1 for header, 2 for body, 3 for both
                $r = NULL;
                $a = NULL;
                $cf = NULL;
                $pd = NULL;
                $page = open_page(ARMORY_EXTERNAL_URL,$f,$c,$r,$a,$cf,$pd);
                $handle = fopen($filename, 'w');
                fwrite($handle, $page);
                fclose($handle);
            }
            
    }
}


* sta altijd open voor suggesties :Y)

[ Voor 136% gewijzigd door gitaarwerk op 05-08-2008 21:33 ]

Ontwikkelaar van NPM library Gleamy


Acties:
  • 0 Henk 'm!

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 17:09
Gitaarwerk schreef op dinsdag 05 augustus 2008 @ 18:58:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$filename = 'xml/guildinfo.xml'; // location of the xml sheet
$handle = @fopen($filename, 'aw');

if(file_exists($filename) && is_writable($filename) && $handle)
{
    // when the armory is laoded from local xml sheet
    $GUILD_FUNCTIONS->UpdateArmory($filename); // updates the armory when needed
    $url=ARMORY_INTERNAL_URL;
    echo $linked_from = $GUILD_FUNCTIONS->ParseLinkInformation('internal');
}
else
{
    // when the armory is not able to be written, then it will load from the Blizzard Armory directly
    $url=ARMORY_EXTERNAL_URL;
    echo $linked_from = $GUILD_FUNCTIONS->ParseLinkInformation('external');
}

// functie bestand
class GUILD_FUNCTIONS
{
    function UpdateArmory($filename)
    {
            $stat = stat($filename);
            
            if(($stat[7] < 10 || date('Ymd', filemtime($filename)) < date('Ymd') || (isset($_GET['force_update'])) && $_GET['force_update']=='yes'))
            {
                clearstatcache();
                $f = 1;
                $c = 2;//1 for header, 2 for body, 3 for both
                $r = NULL;
                $a = NULL;
                $cf = NULL;
                $pd = NULL;
                $page = open_page(ARMORY_EXTERNAL_URL,$f,$c,$r,$a,$cf,$pd);
                $handle = fopen($filename, 'w');
                fwrite($handle, $page);
                fclose($handle);
            }
            
    }
}


* sta altijd open voor suggesties :Y)
Niet echt een belangrijke suggestie, maar ik heb zelf een beetje een hekel alles in if else blabla constructies te stoppen. Waarom draai je het niet om? (kan zijn dat er een foutje inzit, maar ff snel gedaan ;))

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    function UpdateArmory($filename)
    {
            $stat = stat($filename);
            
            if(($stat[7] > 10 || date('Ymd', filemtime($filename)) > date('Ymd') || (!isset($_GET['force_update'])) && $_GET['force_update'] != 'yes'))
            {
                return false;
            }

            clearstatcache();
            $f = 1;
            $c = 2;//1 for header, 2 for body, 3 for both
            $r = NULL;
            $a = NULL;
            $cf = NULL;
            $pd = NULL;
            $page = open_page(ARMORY_EXTERNAL_URL,$f,$c,$r,$a,$cf,$pd);
            $handle = fopen($filename, 'w');
            fwrite($handle, $page);
            fclose($handle);
     }
Pagina: 1