op welk punt exception afhandelen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Ward van der Put
Moderator

Ward van der Put

19/11/2013 18:26:17
Quote Anchor link
Ozzie PHP op 19/11/2013 18:06:42:
Hoe weet je nu dan op voorhand hoe groot dat bestand gaat worden?

Moet je dat altijd weten? Voor een paar regels configuratie? Of kun je het silent in een try stoppen en dan kijken wat er in de catch uitrolt ;)

Nogmaals, ik wil het toch maar even herhalen: exceptions zijn er niet alleen voor fouten. Je kunt ze ook gebruiken als een if ... else ...
 
PHP hulp

PHP hulp

17/04/2024 01:53:35
 
Ozzie PHP

Ozzie PHP

19/11/2013 20:29:15
Quote Anchor link
>> Moet je dat altijd weten? Voor een paar regels configuratie? Of kun je het silent in een try stoppen en dan kijken wat er in de catch uitrolt ;)

Wat bedoel je Ward. Ik begrijp niet wat je bedoelt te zeggen. Kun je een voorbeeldje geven?
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 07:34:45
Quote Anchor link
Een if/else gebruik je meestal bij een systeem met een bekende toestand. De verwachte toestanden formaliseer je in de condities.

Een try/catch leent zich veel beter voor een systeem met een onbekende toestand. En voor onverwachte toestanden: de spreekwoordelijke uitzonderingen op de regel c.q. “exceptions to the rule”.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
try {
    $cacher = new FastRamCacher();
    $cacher->setTurboBoost(true);
}
catch (\CacherException $e) {
    $cacher = new SlowDiskCacher();
}

?>

Nu hebben we eventuele problemen afgevangen. Het maakt eigenlijk ook niet uit welke problemen er precies optraden: dat staat in de log, maar in deze applicatie speelt het geen rol. Bovendien kunnen we de FastRamCacher nu updaten, herschrijven of vervangen, zonder dat onze oplossing daar hinder van heeft.

Overigens zie je hier meteen ook het nut van interfaces.
 
Ozzie PHP

Ozzie PHP

20/11/2013 12:48:15
Quote Anchor link
Dat is een mooi voorbeeld Ward. In mijn geval heb ik (nog) maar 1 cacher, dus ik kan niet veer meer doen dan loggen/mailen dat ie niet werkt :)

Maar wat ik nog wilde weten, is hoe het zit met het opslaan van een bestand.

Is het dan wel of inet de bedoeling dat je eerst kijkt hoeveel vrije schijfruimte er nog is? En zo ja, hoe werkt dat. Stel ik wil een array in een bestand opslaan, hoe weet ik dan vantevoren hoeveel kb dat bestand in beslag gaat nemen?
 
Bart V B

Bart V B

20/11/2013 13:04:56
Quote Anchor link
Volgens mij als je aan het uploaden bent en disk is vol, dan krijg je een foutmelding. Dat doet php immers zelf toch al?

Want dan zou ik ook zomaar kunnen bedenken dat je de temp dir automatisch geleegd word en dat doe je ook niet zomaar.

Volgens mij is dit weer zo'n gevalletje wat op server niveau gedaan moet worden.
Daar krijg je als het goed is een mail van met de melding disk is 90% full.
 
Ozzie PHP

Ozzie PHP

20/11/2013 13:17:37
Quote Anchor link
Ja, zo'n mail zou ik inderdaad moeten krijgen van de server.

Maar Ward zei dus eerder dit:

Ward van der Put op 19/11/2013 17:41:14:
Ik zou meer loggen. Maar verder heb ik er weinig op aan te merken.

Je kunt in een multi-processing omgeving namelijk zoiets verwachten:

1. Applicatie X vraagt via een if aan FileSystem of er genoeg ruimte is.
2. FileSystem antwoordt met (bool) ja of (int) 10 MB.
...

En nu vraag ik me dus af hoe je vantevoren moet checken of er nog voldoende schijfruimte vrij is.

Of is het voldoende om gewoon zoiets te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (!file_put_contents($file, $data)) {
  throw new FileSystemException("could not save file $file");
}

?>

En dat je dan zelf een mail ontvangt met de foutmelding "could not save file foo.php" waarop je vervolgens zelf actie onderneemt door uit te zoeken wat er aan de hand is (kloppen de map-rechten of is de schijf vol)?
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 15:06:27
Quote Anchor link
Ik noemde het voorbeeld ook omdat het niet zwart/wit is: je hoeft niet altijd zelf te controleren of er genoeg ruimte vrij is. Je werkt alleen wel in een multi-user en multi-processing omgeving, dus als 50 gebruikers ineens 10 MB gaan uploaden, kan dat wel eens verkeerd uitpakken. Ik zou dus beide mogelijkheden wel inbouwen: een save() met en een save() zonder voorafgaande controle.

Aangezien je met een FileSystem class dicht tegen een OS aan zit te programmeren, zou ik verder inderdaad op fouten van PHP-functies vertrouwen. Dan is er inderdaad niets aan te merken op een if waarin de false een exception gooit. Alle functionaliteit voor file handling OOP gaan zitten nabouwen levert te weinig op.
 
Ozzie PHP

Ozzie PHP

20/11/2013 15:33:32
Quote Anchor link
"Ik zou dus beide mogelijkheden wel inbouwen: een save() met en een save() zonder voorafgaande controle."

Oké, maar nogmaals... hoe weet ik of ik vantevoren of er genoeg ruimte is??? Hoe kan je dat op voorhand controleren? Dan moet je eerst weten hoe groot de file gaat worden, maar dat kun je toch op voorhand nooit weten?
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 16:01:18
Quote Anchor link
Je kunt toch zeggen dat je voorafgaand aan een upload schijfruimte controleert maar voorafgaand aan het opslaan van een configuratiebestandje van een paar duizend bytes niet? Dan hoef je niet exact te weten hoe groot een bestand is, maar slechts ongeveer de orde van grootte.

Wil je het exact weten, dan kun je bijvoorbeeld de output bufferen en de grootte van de outputbuffer controleren met ob_get_length().
 
Ozzie PHP

Ozzie PHP

20/11/2013 16:09:20
Quote Anchor link
1)

Ward, en als ik het nu andersom zou doen. Ik sla gewoon een file op, en pas als het mislukt ga ik kijken wat er aan de hand is? (schijf vol of verkeerde map-rechten) Is dat niet een beter idee? Dan hoef ik op voorhand niks te controleren.

2)

Ik kwam trouwens zojuist dit scriptje tegen om te kijken hoe groot een variabele is. Wat is dan beter, dit scriptje of jouw variant met ob_get_length()?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$data
= array('foo' => 'bar');
$serialized_data = serialize($data);
$size = strlen($serialized_data);
print($size * 8 / 1000);
?>
 
Wouter J

Wouter J

20/11/2013 16:21:47
Quote Anchor link
Voordat je iets cached sla je het altijd al op als een string. Gewoon strlen gebruiken en je weet het.

En pas daarna controleren? Ach ja, ik ga ook altijd in een auto rijden en pas als ik er op de snelweg achterkom dat ik met 120 km/h de vangrail ben ingevlogen doordat ik opeens mijn linkervoorwiel verloor ga ik kijken of dat wiel er uberhaupt wel goed op zat...
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 16:22:26
Quote Anchor link
Ik zou het er persoonlijk gewoon op aan laten komen, maar ik ga ook niet op een paar MB beknibbelen enkel en alleen omdat het een dubbeltje hosting bespaart. Gewoon kijken hoeveel je nog hebt en op tijd opruimen of ruimte bijkopen.

Behalve bij grote dingen zoals een upload van een paar MB. Dan moet je vaak sowieso meer controleren, dus dan kan een controle van de schijfruimte er wel bij.

Als iemand door 1000 deelt bij bits en bytes, zou ik nog even doorgooglen :)
 
Ozzie PHP

Ozzie PHP

20/11/2013 16:45:37
Quote Anchor link
@Ward:

>> Als iemand door 1000 deelt bij bits en bytes, zou ik nog even doorgooglen :)

Oké prima, maar hoe hoort het dan wel? Hoe krijg ik het aantal bytes (of bits??) zodat ik dat kan vergelijken met de nog vrije schijfruimte?

@Wouter:

>> En pas daarna controleren? Ach ja, ik ga ook altijd in een auto rijden en pas als ik er op de snelweg achterkom dat ik met 120 km/h de vangrail ben ingevlogen doordat ik opeens mijn linkervoorwiel verloor ga ik kijken of dat wiel er uberhaupt wel goed op zat...

Wouter, het is gewoon een vraag hoor. Je hoeft niet zo vreemd te reageren???

Ik zal uitleggen wat ik bedoel, en dan mag jij daarna jouw reactie daar op geven.

Ik ga er vanuit dat er op mijn server altijd voldoende ruimte is om iets op te slaan. Dat is de normale situatie. Nu kun je 2 dingen doen.

a) Altijd als je iets opslaat gaan controleren hoe groot het bestand is en het daarna pas opslaan. Dit is een optie, maar zoals we zojuist hadden geconcludeerd is de normale situatie dat er altijd voldoende ruimte is.

b) Waarom zouden we iedere keer opnieuw gaan controleren hoeveel vrije schijfruimte er nog over is telkens als we iets willen opslaan? We hadden namelijk zojuist geconcludeerd dat de normale situatie is dat er altijd voldoende ruimte is. Als er dan ooit in dat ene enkele specifieke geval een keer te weinig ruimte is, dan returnt file_put_contents() keurig een false en kan ik in dat ene specifieke geval controleren hoeveel vrije schijfruimte er nog is en vervolgens een exception gooien.

In situatie A zit je altijd iets te controleren wat in 99,99% van de gevallen overbodig is.

In situatie B controleer je op voorhand nooit, enkel en alleen als gebleken is dat een bestand niet kan worden opgeslagen.

In zowel situatie A als situatie B kan het bestand niet worden opgeslagen. Zowel in situatie A en B wordt de webmaster hier middels een exception van op de hoogte gebracht.

In mijn optiek: situatie B is efficiënter, omdat je niet iedere keer onnodig aan het controleren bent.

En nu mag jij zeggen waarom je denkt dat situatie A beter is.

En om nog even in te gaan op je vergelijking:

>> Ach ja, ik ga ook altijd in een auto rijden en pas als ik er op de snelweg achterkom dat ik met 120 km/h de vangrail ben ingevlogen doordat ik opeens mijn linkervoorwiel verloor

Wat jij nu dus suggereert is dat je iedere keer voordat je gaat autorijden met een sleutel alle moeren van je 4 banden nog eens extra gaat vastdraaien om te voorkomen dat onderweg je wiel losschiet. Hoe reëel is dat?
 
Dos Moonen

Dos Moonen

20/11/2013 17:11:50
Quote Anchor link
Ozzie PHP op 20/11/2013 16:45:37:
@Ward:

>> Als iemand door 1000 deelt bij bits en bytes, zou ik nog even doorgooglen :)

Oké prima, maar hoe hoort het dan wel? Hoe krijg ik het aantal bytes (of bits??) zodat ik dat kan vergelijken met de nog vrije schijfruimte?

http://stackoverflow.com/questions/7568949/measure-string-size-in-bytes-in-php

Verder is de term 'byte' platform dependent. Op sommige (erg oude) systemen zal een byte 16 bits kunnen zijn. Al defineert IEC 80000-13 een 'byte' als 8 bits. De term 'octet' zal altijd 8 bits zijn =]
Kilo is de SI afkorting voor 10^3, of 1000. Een kilobyte is dus eigenlijk 1000 bytes. Maar 1024, of 2^10, was stukken makkelijker om mee te werken. Dus zijn sommige mensen kilobyte als 1000 bytes gaan zien, en andere als 1024 bytes.
Gelukkig is er iets zoals een Kibibyte, kort voor kilo binary byte, deze zal altijd 1024 bytes zijn. Afkortingen: KiB, MiB, GiB etc.


Jij schijnt voor de SI kilobyte gekozen te hebben. Over het algemeen worden grotes in IEC (de ... binary bytes versie) weergeven en dan jammergenoeg met afkortingen als kB, MB, GB etc.

PS. wil je 100% duidelijk zijn over hoeveel bits je het hebt, praat dan altijd over bits of octets. Dus megabit, gibibit, kilooctet of gibioctet :p
PPS. sorry, het irriteert me dat het niet altijd goed gebruikt wordt.
 
Ozzie PHP

Ozzie PHP

20/11/2013 17:25:11
Quote Anchor link
Dos, haha... jij bent een technisch persoon zie ik al. Ik kan totaal niet volgen waar je het over hebt.

>> Jij schijnt voor de SI kilobyte gekozen te hebben.

Geen idee, ik heb eerlijk gezegd nog nergens voor gekozen.

Ik zal even in m'n eigen jip en janneke taal de vraag stellen. Ik wil als ik een variabele heb weten hoeveel bit/byte/kb... whatever de inhoud van die variabele is. En dit aantal wil ik vergelijken met het resterende aantal bit/byte wat nog op m'n harde schijf vrij is.

Kun je mij daar bij helpen?

Ward heeft al gezegd dat ik dit moet gebruiken:

Ward van der Put op 19/11/2013 16:35:20:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$bytes_available
= disk_free_space('/');
?>

Maar dan moet ik dus nog de filesize van de variabele hebben zodat ik die kan aftrekken van $bytes_available.

Wordt het dan zoiets als dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$bytes_available
= disk_free_space('/');
$string = 'Cién cañones por banda';
$string_size = mb_strlen($string, '8bit');
$result = $bytes_available - $string_size;
?>
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 20:04:29
Quote Anchor link
Dos heeft natuurlijk wel een punt. Alleen heb je na het opslaan van 60 bits in een 64-bits adresruimte niet nog 4 bits over hebt om aan iets nieuws te beginnen. Deze zaal is al verhuurd aan de seniorengym, de biljartclub moet maar een deur verderop vergaderen... Waarmee ik maar wil zeggen: zó nauwkeurig hoeft helemaal niet.

Ozzie, met '/' tel je alle ruimte op een station. De ruimte voor bijvoorbeeld een directory kan kleiner zijn. Dat hangt onder andere van het file system en natuurlijk de configuratie af.

Een PHP-string kan niet langer zijn dan 2 GB. Voor die tijd loop je tegen de geheugenlimiet van standaard 128 MB aan. Dat geeft een beetje de bovengrenzen aan.

Verder tellen veel providers alle ruimte die je gebruikt bij elkaar op. Bijvoorbeeld ook de tellingen voor je databases en e-mailaccounts wegen mee. Mailt iemand je een "leuke" bijlage, dan kan de webruimte die je overhoudt ineens lager uitvallen. (Vroeger deden sommige providers dat niet en kon je nogal eens besparen door afbeeldingen in een database te zetten: die telde niet mee bij de webruimte.)

Als we het dus hebben over één zin of een handvol alinea's, is dat maar een druppel op een gloeiende plaat. Ik zou dat niet gaan meten.
 
Ozzie PHP

Ozzie PHP

20/11/2013 20:20:52
Quote Anchor link
Ward, dankjewel voor je reactie. Maar moet ik nu helemaal niks meten, of soms wel en soms niet?

Volgens Wouter moet je altijd meten, volgens jou soms... en daarnaast weet ik niet eens HOE ik moet meten?
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 20:26:57
Quote Anchor link
Soms wel en soms niet. Verder zit je wat mij betreft goed: standaardfuncties van PHP in een if verpakken en een false laten eindigen in een exception die je logt.
 
Ozzie PHP

Ozzie PHP

20/11/2013 20:34:02
Quote Anchor link
Oké. Is het dan voldoende om te melden dat een bestand niet kan worden opgeslagen, maar om niet te vermelden WAAROM het niet kan worden opgeslagen?

Jouw "Soms wel en soms niet." vind ik nog steeds wat lastig te interpreteren. Ik zou op zich wel een controlemogelijkheid kunnen inbouwen, maar hoe werkt dat dan?

Klopt deze code? Is dit de juiste manier om vrije schijfruimte te bepalen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$bytes_available
= disk_free_space('/');
$string = 'test string';
$string_size = mb_strlen($string, '8bit');
$result = $bytes_available - $string_size;
?>
 
Ward van der Put
Moderator

Ward van der Put

20/11/2013 20:55:14
Quote Anchor link
Je Spaans galjoen heeft een 8-bits karakterset nodig, terwijl je teststring voldoende heeft aan een 7-bits karakterset. Waarom wil je daarvan dan een multibyte string maken?

Exact hetzelfde tekstbestand kan bij een 16-bits karakterset twee keer groter zijn dan bij een 8-bits karakterset. Bepaal éérst wat je wilt opslaan, daarna pas hoe je dat gaat doen.

Je andere vraag hangt daarmee samen: waarom soms wel en soms niet? Omdat je soms iets móét opslaan en soms niet. Omdat sommige applicaties niet werken als je niets opslaat en andere gedeeltelijk wel. Omdat klanten met een betaald Pro-account soms voorgaan en klanten met een gratis instapaccount daarom soms achter het net mogen vissen. Verzin het maar...
 

Pagina: « vorige 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.