[PHP/mySQL] Essentiele afsluiters

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • intermusic
  • Registratie: September 2002
  • Laatst online: 25-03 14:05

intermusic

Marc Hoekstra

Topicstarter
Welke afsluiters zijn nou wel belangrijk bij gebruik in PHP icm. mySQL?
Veel mensen gebruiken ze niet, maar het script werkt wel.
Kan het veel uitmaken wat betreft preformance?
Enkele voorbeelden van afsluiters:
- mysql_free_result($result);
- mysql_close($connection);

[ Voor 3% gewijzigd door intermusic op 12-05-2004 15:08 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

intermusic schreef op 12 mei 2004 @ 15:07:
Welke afsluiters zijn nou wel belangrijk bij gebruik in PHP icm. mySQL?
Veel mensen gebruiken ze niet, maar het script werkt wel.
Kan het veel uitmaken wat betreft preformance?
Enkele voorbeelden van afsluiters:
- mysql_free_result($result);
- mysql_close($connection);
Ik gebruik ze niet. Eventeel zou het wel voor optimalisatie kunnen zorgen maar daar heb ik in de huidge situatie weinig mee te maken.

Je kan het natuurlijk altijd benchen. ;)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou ze maar wel gebruiken. Niet zozeer omdat PHP het nodig heeft, want gelukkig is PHP er wel netjes in. Maar als je later bijvoorbeeld ASP gaat leren en je bent niet gewend je rotzooi op te ruimen, dan kom je van een kouwe kermis thuis als IIS ineens vastloopt omdat het geheugen volgelopen is.
Ik gebruik dus iig mysql_close. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

PHP sluit alle connecties zelf en maakt het geheugen weer vrij nadat een script is afgerond.

De enige reden om ze te gebruiken is als je een zwaar script hebt en bijvoorbeeld halverwege alvast het geheugen weer vrij wilt maken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bosmonster schreef op 12 mei 2004 @ 15:31:
PHP sluit alle connecties zelf en maakt het geheugen weer vrij nadat een script is afgerond.

De enige reden om ze te gebruiken is als je een zwaar script hebt en bijvoorbeeld halverwege alvast het geheugen weer vrij wilt maken.
Ik vind het getuigen van slecht programmeren als je je connecties niet sluit, alleen omdat PHP dat zelf heel goed kan. Waarom zou je in de ene taal alles netjes sluiten omdat het moet, en in de andere omdat het niet hoeft? Dat wordt toch heel verwarrend? Alleen al daarom vind ik het verstandiger om altijd maar je connecties te verbreken.

Als je een eigen database class hebt dan kun je het sowieso ook nog eens daarin inbouwen, zonder dat je er verder bij het programmeren iets van merkt. Zo sluit mijn connectie automatisch als ik paginastatistieken (aantal queries en dergelijke) opvraagt. Maar ik kan natuurlijk in mijn class ook gewoon expliciet de verbinding sluiten.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Als je in iedere taal rekening moet gaan houden met de mogelijkheden en beperkingen van alle andere talen wordt het nog veel verwarrender ;)

Bovendien is het ook niet echt goed voor de performanceo m na iedere query de verbinding naar de database weer te verbreken. Beter is dit gewoon aan het einde van het script te doen aangezien een script er toch niet langer over hoort te doen dan een paar hondersten van secondes. Maar das weer nutteloos.. want dat doet PHP zelf (aan het einde van het script dus).

De enige uitzondering (zoals ik eerder ook al zei) is als je dus hele 'grote' scripts hebt die veel langer de tijd nodig hebben en veel resources gebruiken die je zelf dus weer kunt vrijmaken.

[ Voor 67% gewijzigd door Bosmonster op 12-05-2004 17:08 ]


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
NMe84 schreef op 12 mei 2004 @ 16:55:
Ik vind het getuigen van slecht programmeren als je je connecties niet sluit...
Als je een eigen database class hebt dan kun je het sowieso ook nog eens daarin inbouwen, zonder dat je er verder bij het programmeren iets van merkt. Zo sluit mijn connectie automatisch als ik paginastatistieken (aantal queries en dergelijke) opvraagt. Maar ik kan natuurlijk in mijn class ook gewoon expliciet de verbinding sluiten.
Dit is in mijn ogen inconsequent. Als je gebruik maakt van de functionaliteit van php die voor jou automatisch de verbinding sluit noem je het slecht programmeren. Maar als je zelf een db class hebt gemaakt die verbindingen automatisch sluit mag het wel (Ik neem aan dat de db class zelf wel expliciet de verbinding verbreekt).

Acties:
  • 0 Henk 'm!

Verwijderd

Het blijft een goede gewoonte om connecties gewoon af te sluiten aan het einde van het script. Er zit namelijk een tijd tussen het beeindigen van je script en het sluiten van je connectie. Dit wordt erg vervelend op het moment dat je een site hebt waar binnen een korte tijd erg veel bezoekers krijgt. Wij hebben een site waar we tussen 18.00 uur en 20.00 uur ongeveer 25000 bezoekers hebben, en als je je connecties niet op tijd afsluit komt op een gegeven moment de database server aan zijn maximum van openstaande connecties.

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 24-08 06:41
Ok afsluiten is een goeie gewoonte, maar je moet ook niet gaan afsluiten om het afsluiten, dus als je een query gedaan hebt direct erna afsluiten omdat het zo netjes is. Vaak heb je nl dezelfde connectie nog vaker nodig.

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Er zit namelijk een tijd tussen het beeindigen van je script en het sluiten van je connectie.
Vertel... over welke connectie heb jij het? Met de database? Als je inderdaad die connectie bedoeld heb je het fout aangezien PHP zelf de verbinding verbreekt als je het niet handmatig doet. Met users heeft dit dus niets te maken tenzij je ten onrechte pgconnect gebruikt.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Ik betwijfel ook of die microseconde tussen het afsluiten van het script en het door PHP afsluiten van de gebruikte db-connecties merkbaar is... zelfs met 25K gebruikers in 2 uur.

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 24-08 06:41
Bosmonster schreef op 12 mei 2004 @ 17:35:
Ik betwijfel ook of die microseconde tussen het afsluiten van het script en het door PHP afsluiten van de gebruikte db-connecties merkbaar is... zelfs met 25K gebruikers in 2 uur.
timen en je weet t zoals altijd B)

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Als je een eigen database class hebt dan kun je het sowieso ook nog eens daarin inbouwen, zonder dat je er verder bij het programmeren iets van merkt. Zo sluit mijn connectie automatisch als ik paginastatistieken (aantal queries en dergelijke) opvraagt. Maar ik kan natuurlijk in mijn class ook gewoon expliciet de verbinding sluiten.
Dit is inderdaad iets wat je op zo'n manier moet afhandelen, zo vergeet je het nooit.
PHP:
1
2
$result = $dbc->db_select_field('SELECT username FROM users WHERE user_id =1');
// alles is al klaar! 

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Skaah schreef op 12 mei 2004 @ 20:58:
[...]

Dit is inderdaad iets wat je op zo'n manier moet afhandelen, zo vergeet je het nooit.
PHP:
1
2
$result = $dbc->db_select_field('SELECT username FROM users WHERE user_id =1');
// alles is al klaar! 
Of ik zie het even niet of je opent en sluit met elke query binnen een script je connectie. Niet erg efficient. Als ik een query in mijn script heb dan open ik de connectie in de 2e regel in mijn en script en sluit hem pas weer in de voorlaatste regel in mijn script, op die manier kan ik 15 query's via een connectie laten lopen. Zonder de hele tijd connectie's te hoeven openen en sluiten ( kost ook iets van tijd )

En btw. om weer terug te komen op de topic-start. Ik open mijn connectie altijd via mijn index.php en dan include ik losse onderdelen en dan sluit ik hem weer aan het eind van mijn index.php, gaat alleen "fout"(=niet sluiten connectie) als ik voor iemand of voor testen een directe link-mogelijkheid maak, omdat ik er altijd vanuit ga dat iemand via index.php binnenkomt.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
en dan sluit ik hem weer aan het eind van mijn index.php
En dan is PHP weer zo aardig om je te helpen en dit zelf te doen ;)

Na een query eventueel mysql_free_result uitvoeren zou wel geheugen e.d. moeten besparen maar of het ook daadwerkelijk veel helpt weet ik niet. Per query een verbinding maken is niet iets wat je wilt als je even na denkt dat je dan dus per query moet gaan autoriseren e.d.

[ Voor 52% gewijzigd door djluc op 12-05-2004 21:17 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
djluc schreef op 12 mei 2004 @ 21:16:
[...]
En dan is PHP weer zo aardig om je te helpen en dit zelf te doen ;)

Na een query eventueel mysql_free_result uitvoeren zou wel geheugen e.d. moeten besparen maar of het ook daadwerkelijk veel helpt weet ik niet. Per query een verbinding maken is niet iets wat je wilt als je even na denkt dat je dan dus per query moet gaan autoriseren e.d.
En dan ben ik weer zo gewend (door andere prog-talen/opleiding/cursussen/etc.) om het zelf te doen, dan heb ik niet het probleem dat als php6.0 dat niet meer doet dat ik er dan opeens problemen mee krijg.

Ieder zijn eigen idde, sommige mensen vinden het makkelijk dat php dit doet, maar ik vind het gewoon slordig en het gebeurt wel eens zoals ik hierboven al zei, maar omdat ik ook in andere script-talen en prog-talen bezig ben is het wel zo handig om een standaard methodiek aan te houden ( zoals eerst alle variabelen declareren en dan pas gebruiken, en alle db-connecties afsluiten).

Misschien ( heel misschien) is mijn manier iets langzamer omdat php de verbinding (misschien) iets sneller afsluit dan ik handmatig kan, maar het voordeel van een prog-methodiek handteren vind ik (in php tenminste) belangrijker dan dit (mogelijke) snelheidsvoordeel.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Bosmonster schreef op 12 mei 2004 @ 17:05:
Bovendien is het ook niet echt goed voor de performanceo m na iedere query de verbinding naar de database weer te verbreken.
Heb nergens gezegd dat ik het na elke query doe. ;)

En ik hou ook niet rekening met iedere taal, alleen met enkele vergelijkbare talen. ASP is gewoon kwa functionaliteit heel goed te vergelijken met PHP, en ik merk dat ik de talen veel te vaak door mekaar wil gooien, op elk vlak. Als ik mezelf zoveel mogelijk aan de regels hou, dan kan er ook minder fout gaan als ik na een tijdje PHP geschreven te hebben ineens weer ASP moet gaan doen. Toch een stukje controle over mezelf dus.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
ik heb in een script meerdere functies mbt. MySQL en dan gebruik ik weldegelijk mysql_close om de verbinding tussentijds te sluiten. Staat wat netter ook imo.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
g00fy schreef op 12 mei 2004 @ 22:01:
ik heb in een script meerdere functies mbt. MySQL en dan gebruik ik weldegelijk mysql_close om de verbinding tussentijds te sluiten. Staat wat netter ook imo.
Ok het staat wat netter, maar als ik het goed lees dan open jij dus in een script-pagina ( max execution time voor mijzelf van 1 sec en dat is ook het echt het absolute maximale ) meerdere connecties met je dbase???

Dus oftewel, in 1 sec open jij per bezoeker meerdere connecties met je dbase???

Hoop niet dat je een veel bezochte site hebt, anders kan je host nog wel eens gaan klagen dat je teveel connecties opent naar je dbase.

Mijn idee is : Per gebruiker / script maar een connectie tussen php-server en sql-server, de rest is onnodige verspilling omdat het te kort duurt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gomez12 schreef op 12 mei 2004 @ 22:18:
[...]


Ok het staat wat netter, maar als ik het goed lees dan open jij dus in een script-pagina ( max execution time voor mijzelf van 1 sec en dat is ook het echt het absolute maximale ) meerdere connecties met je dbase???

Dus oftewel, in 1 sec open jij per bezoeker meerdere connecties met je dbase???

Hoop niet dat je een veel bezochte site hebt, anders kan je host nog wel eens gaan klagen dat je teveel connecties opent naar je dbase.

Mijn idee is : Per gebruiker / script maar een connectie tussen php-server en sql-server, de rest is onnodige verspilling omdat het te kort duurt.
Tussentijds wil niet zeggen tussen de queries door. Dat nam iemand anders hierboven ook al zomaar aan... :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
NMe84 schreef op 12 mei 2004 @ 22:22:
[...]

Tussentijds wil niet zeggen tussen de queries door. Dat nam iemand anders hierboven ook al zomaar aan... :P
Wat is dit dan???
ik heb in een script meerdere functies mbt. MySQL en dan gebruik ik weldegelijk mysql_close om de verbinding tussentijds te sluiten. Staat wat netter ook imo.
In 1 php-script je mysql_verbinding "tussentijds" meerdere keren sluiten en openen vind ik toch echt tussen de query's door hoor. Of heb jij je query's niet zo "goed" ingesteld dat jij in php nog een keer iets moet gaan filteren???

Ik voer altijd!!! (in php) eerst mijn query's uit en dan pas ga ik voor mijn lange php functies (pdf /excell /rtf bestand opbouwen etc. ) in 9 van de 10 php-scripts die ik maak is de php-execution time 0,000000001 sec en zit de meeste tijd in het sql-gedeelte. PHP doe ik over het algemeen weinig meer mee dan mijn sql-gegevens opmaken en printen naar de gewenste export-vorm.

[edit] Negeer deze posting maar, was een foute aanname.[/edit

[ Voor 6% gewijzigd door Gomez12 op 13-05-2004 12:36 ]


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik weet niet of dit voor PHP geldt, maar bij ASP is het zo dat zodra je een connectie sluit en naar nothing zet de connectie weer beschikbaar komt voor de connectiepool. Dit zou een klein beetje snelheid kunnen schelen.
Overigens worden de connecties ook bij ASP gewoon gesloten aan het einde van het script

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Gomez12 schreef op 12 mei 2004 @ 22:35:
[...]


Wat is dit dan???

[...]


In 1 php-script je mysql_verbinding "tussentijds" meerdere keren sluiten en openen vind ik toch echt tussen de query's door hoor. Of heb jij je query's niet zo "goed" ingesteld dat jij in php nog een keer iets moet gaan filteren???
Niemand heeft het over het meerdere keren openen en sluiten van de verbinding. Als ik bovenstaande posts zo lees doet hij het hezelfde als ik. Verbinding starten door mijn class te createn, dan alle queries afhandelen, en daarna de verbinding verbreken. Op die manier ben ik consequent met dingen afsluiten, en gaat er geen tijd verloren.
P_de_B schreef op 12 mei 2004 @ 22:38:
Overigens worden de connecties ook bij ASP gewoon gesloten aan het einde van het script
Das niet waar. Ik heb eens gewerkt aan een webpagina waar ik steevast de verbindingen niet sloot en de variabelen niet op nothing stelde. Na 2 weken gebruik (niet eens intensief!) blokkeerde IIS ineens alle ASP scripts in een bepaalde map omdat die het geheugen vern**kten. Na wat research heeft de systeembeheerder me vervolgens verteld dat ik de verbindingen niet goed sloot, en nadat ik dat aangepast had liep de site veel sneller, en hij is in de afgelopen 2 maanden niet geblokkeerd, terwijl we de site veel intensiever gebruikt hebben.

[ Voor 36% gewijzigd door NMe op 12-05-2004 22:56 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Gomez12 neemt dus dingen aan die niet zo zijn, in mijn geval niet dus. Ik laat de verbinding niet openstaan nadat ik mijn query's heb uitgevoerd, das all....

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Ik denk dat de werkwijze een beetje afhankelijk is van het nivo waarop je PHP gebruikt. Als je een simpele pagina hebt (zoals zo'n beetje 90% van de PHP code eruit ziet) waarin je een database connection opent, wat HTML code uitvoert, tussendoor wat queries uitvoert, en vervolgens klaar bent, dan lijkt het me absoluut overbodig om tussendoor result of connection resources vrij te geven.

Ik kan me eventueel voorstellen dat je het doet omwille van de consequentie. Ergens getuigt het wel van een goede programmeerstijl om resources vrij te geven die je niet meer nodig hebt. Anderzijds is het niet zo netjes om code toe te voegen die feitelijk gewoon overbodig is. PHP garandeert je namelijk dat je resuorces goed opgeruimd worden; het is dan onzinnig om van die eigenschap geen gebruik te maken.

Zoals al door anderen gezegd veranderd de situatie nogal als je ingewikkeldere PHP code schrijft en het risico ontstaat dat door het niet-vrijgeven van resources de performance in het geding komt (van hetzelfde script, doordat er nodeloos veel geheugen of andere resources gealloceerd worden, of van andere scripts die dezelfde resources willen gebruiken). Dan komt de 'goede stijl' weer ter sprake en is er ook een concrete reden om gealloceerde resources consequent vrij te geven wanneer je ze niet meer nodig hebt.

Overigens gaat PHP hoe dan ook proberen om gealloceerde resources vrij te geven aan het einde van het script. Omdat PHP zelf niet in de bytecode interpreter draait kan PHP dat efficiënter dan een programma geschreven in PHP. In een simpel script is het dus misschien wel efficiënter om resources niet zelf vrij te geven, maar dat lekker aan PHP over te laten!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Soultaker schreef op 13 mei 2004 @ 13:22:
Overigens gaat PHP hoe dan ook proberen om gealloceerde resources vrij te geven aan het einde van het script. Omdat PHP zelf niet in de bytecode interpreter draait kan PHP dat efficiënter dan een programma geschreven in PHP. In een simpel script is het dus misschien wel efficiënter om resources niet zelf vrij te geven, maar dat lekker aan PHP over te laten!
Ik geef graag een paar nanoseconden aan snelheid op als dat betekent dat ik een consequentere programmeerstijl heb, die me zo min mogelijk problemen oplevert bij de overstap naar een andere taal.

Ik snap je argument zeker, en het blijft denk ik een persoonlijke afweging. Als je van jezelf weet dat je per taal een andere stijl erop na kan houden en tegelijkertijd jezelf ertoe kunt brengen je code consequent te houden, dan mag je van mij gerust je verbindingen open laten in PHP en daarmee die paar nanoseconden uitsparen. Ik vertrouw mezelf echter niet genoeg om datzelfde te doen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
NMe84 schreef op 13 mei 2004 @ 13:38:Ik geef graag een paar nanoseconden aan snelheid op als dat betekent dat ik een consequentere programmeerstijl heb, die me zo min mogelijk problemen oplevert bij de overstap naar een andere taal.
Ik vind dat eerlijk gezegd nogal een onzinnig argument. Elke taal heeft zijn sterke punten. Door rekening te houden met het overzetten naar een eventuele andere taal zou je de volledige capaciteit van een taal nooit kunnen benutten. Er zijn bijvoorbeeld genoeg talen die strings niet accepteren als key in een array, en daarom zou het slordig zijn om dat in PHP toe te passen?

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Anders schreef op 13 mei 2004 @ 16:17:
Ik vind dat eerlijk gezegd nogal een onzinnig argument. Elke taal heeft zijn sterke punten. Door rekening te houden met het overzetten naar een eventuele andere taal zou je de volledige capaciteit van een taal nooit kunnen benutten. Er zijn bijvoorbeeld genoeg talen die strings niet accepteren als key in een array, en daarom zou het slordig zijn om dat in PHP toe te passen?
Ik heb het niet over overzetten, maar programmeerstijl. Als je dat soort specifieke functies kan gebruiken moet je het zeker doen. Maar ik vind het afsluiten van de database een ander geval, omdat je dat wel degelijk kan doen in PHP. Sterker nog, het bespaart geheugen, dus het is, afgezien van die nanoseconde die het extra kost, nog beter ook. Plus dat je gewoon altijd dezelfde programmeerstijl aan kunt houden...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1