php-script werkt ineens niet meer

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Han Brouwer Keij

Han Brouwer Keij

04/04/2018 09:24:59
Quote Anchor link
Ik werk al 5 jaar met een script dat data ophaalt uit een site en vervolgens wegschrijft in een txt-file waarna er een grafiek van wordt getekend. Ik krijg opeens foutmeldingen in een error-file die binnen een dag volloopt tot 10GB (m'n maximale ruimte). De foutmelding die ik krijg geldt voor zowel feof (lijn 3) als fgets (lijn 4).
PHP-warning feof() expects parameter to be resource, boolean given in ....grafiek.inc.php line 24 en:
PHP-warning fgets() expects parameter to be resource, boolean given in ....grafiek.inc.php line 26.
Ik heb al gekeken of de data wel aanwezig is op de site en die is er. Ik heb ook al geprobeerd ofeen @ voor fopen het probleem oplost maar dat lukt niet. De php-versie die momenteel draait is 5.6.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$htmlfile
= fopen("https://gadgets.buienradar.nl/data/raintext?lat=52.8836&lon=6.9023","r");
$file_handle = fopen("neerslag.txt", "w");
while(![b]feof[/b]($htmlfile)){

$file_contents = [b]fgets[/b]($htmlfile);
fwrite( $file_handle, $file_contents);
}

fclose($htmlfile);
fclose($file_handle);
?>

Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 04/04/2018 10:05:19 door - Ariën -
 
PHP hulp

PHP hulp

26/01/2020 21:12:18
 
Adoptive Solution

Adoptive Solution

04/04/2018 09:52:37
Quote Anchor link
Wellicht is Warning 2 van toepassing.

http://php.net/manual/en/function.feof.php

Los het op met toevoegen van de volgende regel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if ( !$htmlfile === FALSE ) {
 
- Ariën -
Beheerder

- Ariën -

04/04/2018 10:06:39
Quote Anchor link
Een @ is overigens NOOIT de 'magic' oplossing om een fout te verhelpen. Je verhelpt de fout daar niet mee, maar je verbergt de foutmelding enkel.
 
Adoptive Solution

Adoptive Solution

04/04/2018 10:47:00
Quote Anchor link
Even voor de goede orde, met de code is niks mis, die werkt gewoon.

En de link naar buienradar ook :

https://gadgets.buienradar.nl/data/raintext?lat=51.5135872&lon=7.4652981
 
- Ariën -
Beheerder

- Ariën -

04/04/2018 10:55:11
Quote Anchor link
Als ik in de error zie dat er een boolean wordt gegeven i.p.v. een resource doet mij het een vermoeden geven dat er ergens wat foutafhandeling mist.
 
Adoptive Solution

Adoptive Solution

04/04/2018 11:07:22
Quote Anchor link
Ik heb de oplossing gegeven op basis van het php artikel.
 
Han Brouwer Keij

Han Brouwer Keij

05/04/2018 14:05:28
Quote Anchor link
Adoptive Solution op 04/04/2018 11:07:22:
Ik heb de oplossing gegeven op basis van het php artikel.
 
- Ariën -
Beheerder

- Ariën -

05/04/2018 14:06:16
Quote Anchor link
Han Brouwer Keij op 05/04/2018 14:05:28:
Adoptive Solution op 04/04/2018 11:07:22:
Ik heb de oplossing gegeven op basis van het php artikel.



Ik mis een reactie?
 
Han Brouwer Keij

Han Brouwer Keij

05/04/2018 14:08:31
Quote Anchor link
Ik heb de hele While-loop in de if statement geplaatst en dat zorgt er in ieder geval voor dat de grafiek weer wordt weergegeven maar zonder de data erin. De foutmeldingen blijven nog gewoon in de logfile komen.
 
Ben van Velzen

Ben van Velzen

05/04/2018 14:23:43
Quote Anchor link
Zijn fopen wrappers mogelijk uitgeschakeld? Welke warning komt uit fopen naar boven?
 
Han Brouwer Keij

Han Brouwer Keij

05/04/2018 14:37:10
Quote Anchor link
** quoteknip **

Ik heb geen idee hoe dat uitgeschakeld of ingeschakeld zou kunnen worden.
PHP-warning feof() expects parameter to be resource, boolean given in ....grafiek.inc.php line 24
Gewijzigd op 06/04/2018 11:53:32 door - Ariën -
 
Jacco Engel

Jacco Engel

05/04/2018 15:55:45
Quote Anchor link
Er is een php.ini instelling allow_url_fopen. Mogelijk is deze door je provider uit gezet? Makkelijkste manier om er achter te komen is even
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
phpinfo();
?>


in een tijdelijk script te zetten, en kijken of deze setting "On" of "Off" is
 
Han Brouwer Keij

Han Brouwer Keij

05/04/2018 16:11:51
Quote Anchor link
** quoteknip **

Die staat zowel voor local als master op off. Kan ik dat omzeilen?
Gewijzigd op 06/04/2018 11:53:14 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

05/04/2018 16:14:30
Quote Anchor link
Hoogstens via php.ini. Of je daar bij kan, is de vraag.
 
Ivo P

Ivo P

05/04/2018 16:38:16
Quote Anchor link
misschien mbv curl() ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$url
= "https://gadgets.buienradar.nl/data/raintext?lat=52.8836&lon=6.9023";
$ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $file_contents = curl_exec($ch);
    curl_close($ch);
?>
Gewijzigd op 05/04/2018 16:38:38 door Ivo P
 
Han Brouwer Keij

Han Brouwer Keij

06/04/2018 11:28:07
Quote Anchor link
**quoteknip**

Ik heb er het volgende van gemaakt maar ook op deze manier blijft neerslag.txt leeg als wordt er wel naar het bestand geschreven als je de pagina oproept.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
    vWritePageToFile( 'https://gadgets.buienradar.nl/data/raintext?lat=52.8836&lon=6.9023', 'neerslag.txt' );

    function vWritePageToFile( $sHTMLpage, $sTxtfile ) {
     $sh =          curl_init( $sHTMLpage );
     $hFile =                       FOpen( $sTxtfile, 'w' );
     curl_setopt( $sh, CURLOPT_FILE, $hFile );
     curl_setopt( $sh, CURLOPT_HEADER, 0 );
     curl_exec  ( $sh );
     curl_close(  $sh );
     FClose    (  $hFile );
    }


Edit:
Het is niet nodig om steeds het eerste voorgaande bericht integraal te quoten. Dit zorgt ervoor dat het topic minder leesbaarder wordt. Daarom heb ik wat onnodige quotes weggesnoeid. Gelieve hier graag rekening mee te houden.
Gewijzigd op 06/04/2018 11:54:49 door - Ariën -
 
Ben van Velzen

Ben van Velzen

06/04/2018 11:49:59
Quote Anchor link
Waar heb je CURLOPT_RETURNTRANSFER dan gelaten?
 
Han Brouwer Keij

Han Brouwer Keij

07/04/2018 16:30:06
Quote Anchor link
Ik heb het eindelijk voor elkaar.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$curl
= curl_init('https://gadgets.buienradar.nl/data/raintext?lat=52.8836&lon=6.9023');
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
$result = curl_exec($curl);
$myFile = "neerslag.txt";
$fh = fopen($myFile, 'w') or die("kan file niet openen");
fwrite($fh, $result);
fclose($fh);

?>
 
- Ariën -
Beheerder

- Ariën -

07/04/2018 16:41:53
Quote Anchor link
Bijna, want het is eigenlijk niet de bedoeling om CURLOPT_SSL_VERIFYPEER op false te zetten. Lees hier waarom niet:

https://snippets.webaware.com.au/howto/stop-turning-off-curlopt_ssl_verifypeer-and-fix-your-php-config/

Voor Buienradar kan je een uitzondering maken, omdat het niet zo super spannende en cruciale data is. Maar als je het goed wilt doen, en je zou met belangrijke gegevens werken die over SSL gaan, dan zou ik CURLOPT_SSL_VERIFYPEER op false zeker afraden!

Ik meen dat je die CA's ook via curl kan aanroepen, dus je hoeft dan niet eens je php.ini aan te passen.
Gewijzigd op 07/04/2018 16:53:22 door - Ariën -
 
Han Brouwer Keij

Han Brouwer Keij

07/04/2018 22:17:14
Quote Anchor link
Ik vind het wel goed zo Ariën. Ik word binnenkort 72 en hoef niet meer zo scherp te zijn. Ik ben al blij dat ik het allemaal nog een klein beetje begrijp. :-)
 



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.