php code laten lopen op de achtergrond

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Da Ver

Da Ver

07/12/2010 16:48:22
Quote Anchor link
Ik ken ondertussen al een beetje van php maar niet genoeg.

Ik wil een pagina maken met een knop dat php-code laat lopen op de achtergrond zonder te wachten op het resultaat. En de code doet verder tot het gedaan heeft ook al heeft de gebruiker de pagina gesloten.
Ik heb al zitten testen met de functie exec() maar dit werkt niet omwille van beperkingen.
De webhosting heeft volgende functies uitgeschakeld: disk_total_space, diskfreespace, exec, system, popen, proc_open, proc_nice, shell_exec, passthru, dl, set_time_limit en de 5e parameter in mail().
+ safe mode staat op off en open basedir staat op on.

Cron is ook niet mogelijk.
Via google kom ik steeds tot de volgende functie ignore_user_abort() maar dit gaat steeds gepaard met set_time_limit(). en dat is niet toegelaten.

Kan er mij iemand helpen welke functie ik hiervoor kan gebruiken aub?
 
PHP hulp

PHP hulp

23/11/2024 20:09:36
 
- Ariën  -
Beheerder

- Ariën -

07/12/2010 17:18:30
Quote Anchor link
De beste optie lijkt me om een cron te gebruiken of ignore_user_abort().

Als dat neit toegelaten wordt: Hosting vragen om advies. Helpen ze niet, andere hosting zoeken.
 
Da Ver

Da Ver

08/12/2010 14:56:07
Quote Anchor link
Nee cron laten ze ook niet toe. Nog andere ideeën???
 
Joakim Broden

Joakim Broden

08/12/2010 15:02:41
 
John D

John D

08/12/2010 15:14:05
Quote Anchor link
Andere hosting zoeken met betere service.
 
Kris Peeters

Kris Peeters

08/12/2010 15:25:40
Quote Anchor link
Spijtig dat het nodig is dat het script blijft draaien, ook als de gebruiker zijn venster sluit.

Anders kon je dat perfect met Ajax regelen.
In de achtergrond werken, ... , niet wachten op het resultaat, ...
Dit is zowat de definitie van Asynchroon, de eerste letter van Ajax.
 

08/12/2010 15:33:16
Quote Anchor link
Wat moet er dan precies gedaan worden?
Waarom moet het script door blijven lopen?
 
Da Ver

Da Ver

08/12/2010 15:59:15
Quote Anchor link
Er moeten verschillende taken gebeuren op de achtergrond (update,insert en een zware select die een tijdje duurt voor het resultaat op te halen) En op het einde moet dan een mailtje verstuurt worden wat het resultaat was van die bewerkingen.En als de mail verzonden is is het script op de achtergrond afgelopen en gestopt.
Maar aangezien die taken te lang duren om er op te wachten moet het script blijven lopen als de webpagina gesloten wordt of time out van de pagina.
Cron gaat niet en is ook niet echt aangeraden aangezien de knop om het script te starten niet op vaste momenten zal aangeklikt worden.
Dus de opzet is we klikken op de knop. Het script wordt opgestart en we doen ondertussen andere dingen op de website, zonder ons zorgen te maken over het achtergrond script en op het resultaat te zitten wachten voor we verder kunnen werken op de website.
 
Kris Peeters

Kris Peeters

08/12/2010 16:04:23
Quote Anchor link
Is het onaanvaardbaar dat de gebruiker een boodschap krijgt met iets als "Venster niet sluiten, de gegevens worden verwerkt, ... bla bla bla"?

Dan heb je enkel Ajax nodig.
 
Da Ver

Da Ver

08/12/2010 16:45:08
Quote Anchor link
Je mag me wel al tonen hoe ik dit kan doen via ajax.
Maar in de toekomst gaat die niet voldoen denk ik.
Naarmate dit script meer tijd nodig gaat hebben is dit geen sluitende oplossing.
Dus ajax is misschien goed voor in het begin maar naarmate er meer gegevens komen in de database is dit niet echt gebruiksvriendelijk.
Zijn er mensen die een andere oplossing hebben aub?
 
Kris Peeters

Kris Peeters

08/12/2010 17:09:11
Quote Anchor link
Okay, een voorbeeld waarmee je het principe kan zien

index.php
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//NL" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <link rel="shortcut icon" type="image/gif" href="favicon.gif"/>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
    <title> Ajax - Taken in verschillende stappen </title>
    <link rel="stylesheet" type="text/css" href="style.css"/>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="js.js"></script>
  </head>
  <body>
    Klik om de taken te beginnen. <input type="button" onclick="request_task();" value="Klik"/>
    <div id="message"></div>
  </body>
</html>


js.js
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
16
17
18
19
20
21
22
23
24
25
26
var task_index = 0;

function request_task() {
  var urls_taken = Array(
      'task.php?task=1',
      'task.php?task=2',
      'task.php?task=3',
      'task.php?task=4'
  );
    $.ajax({
      type: "GET",
      url: urls_taken[task_index],
      dataType: "json",
      success: task_response
    });
}

function task_response (data) {
  $("#message").html(data.message);
  if (data.continue == 1) {
    task_index++;
    // request_task();
    /* Merk op, ik zet hier een timeout om het visueel wat meer te geven.  In het echt zou je die timeout niet nodig hebben */
    setTimeout("request_task()", 1200);
  }
}


task.php // uiteraard zou je hier meer nuttige dingen doen
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
16
17
18
19
20
21
22
23
24
25
<?php
  $result
= array(
    'message' => '',
    'continue' => 0,
  );

  switch ($_GET['task']) {
    case
1:
        $result['message'] = 'update gedaan';
        $result['continue'] = 1;
      break;
    case
2:
        $result['message'] = 'insert gedaan';
        $result['continue'] = 1;
      break;
    case
3:
        $result['message'] = 'zware select die een tijdje duurt gedaan';
        $result['continue'] = 1;
      break;
    case
4:
        $result['message'] = 'e-mail gestuurd';
        $result['continue'] = 0;
      break;
  }

  echo json_encode($result);
?>


En vergeet niet jQuery te downloaden en mee in de map te steken
Gewijzigd op 08/12/2010 17:10:33 door Kris Peeters
 
Da Ver

Da Ver

08/12/2010 18:43:48
Quote Anchor link
dank u voor de nuttige en uitgebreide uitleg. Maar verbeter me als ik fout ben om dit te laten lopen moet de gebruiker java enabled hebben? Dit zou dan weer een beperking kunnen worden.

En hoe zorg ik er voor dat de gebruiker de webpagina niet afsluit als het script nog aan het lopen is?
 
Kris Peeters

Kris Peeters

09/12/2010 09:48:36
Quote Anchor link
Hier moet ik je redenering toch omdraaien.

Om er voor te zorgen dat dit niet werkt, moet de gebruiker zijn javascript afzetten.

We spreken niet over java applets, noch over flash / shockwave of wat dan ook waar je plug ins of add ons voor nodig hebt.

We spreken over javascript. Elke webbrowser heeft javascript en bij elke webbrowser staat die aan, tenzij de gebruiker dat zelf af zet.
Volgens mij weet meer dan 95% van de surfers niet eens hoe ze javascript kunnen uitschakelen. Iedereen die het wel weet, weet vast ook hoe ze het opnieuw kunnen inschakelen.

Is dit dan een beperking? Tja...
Je kan ook css uitschakelen. Maakt dat dat alle sites met css een beperking hebben?

Overigens nog even opmerken: php systemen zoals phpBB3 (forum software) en drupal (cms) gebruiken ook dergelijke technieken wanneer er groot onderhoud is.
Als je overstapt naar een nieuwere versie van de kerncode, moet een hoop worden aangepast aan de database structuur. Dat gebeurt in een getrapt systeem, waar Ajax de trigger is.

Wat je tweede punt betreft: jij kunt uiteraard niet verhinderen dat mensen hun venster sluiten, hun pc afzetten, ...
Je kan het ze hoogstens vriendelijk vragen.
Gewijzigd op 09/12/2010 09:50:54 door Kris Peeters
 
- Ariën  -
Beheerder

- Ariën -

09/12/2010 09:50:38
Quote Anchor link
Da Ver op 08/12/2010 18:43:48:
dank u voor de nuttige en uitgebreide uitleg. Maar verbeter me als ik fout ben om dit te laten lopen moet de gebruiker java enabled hebben? Dit zou dan weer een beperking kunnen worden.

Java heeft er niks mee te maken. Ik zie nergens Java, wel weer JavaScript, maar dat is totaal wat anders dan Java.
Gewijzigd op 09/12/2010 09:51:11 door - Ariën -
 
Da Ver

Da Ver

10/12/2010 15:42:34
Quote Anchor link
En kan ik niet een soort http client gebruiken?
of een webclient zoals in asp.net?
Zoja kan iemand me daar mee verder helpen? hoe te gebruiken en waar te downloaden?
want ik denk dat dan ook het probleem voor het sluiten van de pagina kan opgelost zijn.

en wat met curl?
Is dat ook werkbaar of niet?
Gewijzigd op 10/12/2010 15:57:03 door Da Ver
 
Da Ver

Da Ver

16/12/2010 17:32:15
Quote Anchor link
bedankt kris. Dat script heeft me al geholpen maar ik merkdat het stopt na 30 minuten. Aangezien ik de time limit niet kan setten , disabled, moet ik op een andere manier ervoor zorgen dat de teller terug op 0 komt te staan. Iemand enig idee???
 
Kris Peeters

Kris Peeters

16/12/2010 18:28:08
Quote Anchor link
Ah, gaat het echt om zo'n lange tijdspanne?
Ik dacht eerder aan een aantal minuten max.

Daar kan ik niet onmiddellijk op antwoorden.

EDIT:

Heb je die setTimeout in je script nog staan?
Indien ja, neem die eens weg en vervang die door gewoon:
request_task();

Misschien zit die daar ergens voor tussen.
Gewijzigd op 16/12/2010 18:30:53 door Kris Peeters
 
Da Ver

Da Ver

16/12/2010 19:31:06
Quote Anchor link
ik maak geen gebruik van die functie response_task. Dus gebruik de timeout functie ook niet. Ander idee? Ik heb al geprobeerd in het php script header location of echo javascript voor de functie opnieuw aan te roepen met andere parameters maar zonder succes. Ofwel doe ik het verkeerd. Of moet ik gebruik maken van een session of iets anders?

Toevoeging op 17/12/2010 07:53:43:

als test doe ik het volgende.
Maar er klopt iets niet in mijn tekstbestand komt enkel een 4 te staan.
de javafunctie van ajax wordt niet opnieuw opgeroepen precies.
function.php

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function proceed_task(tijdspan) {
var url='message.php?begin='+tijdspan;
ar urls_taken = Array(
url
);
$.ajax({
type: "GET",
url: urls_taken[0],
dataType: "json",
success: task_response
});
}
</script>


hierin staan nog andere php functions vandaar dat het een php pagina is.

en dan de pagina zelf.
message.php

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
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
include("functions.php");
$parameters =$_SERVER['QUERY_STRING'];//$_get['tijd'];

if ($parameters!='')
{

    $parameters=explode('&',$parameters);
    $begin=getparameter($parameters,'begin');
    if ($begin=='')
    {

        $start=5;
    }

    else
    {
        $begin=explode('=',$begin);
        $start=$begin[1];
    }

$myFile = "testFile.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $start);
fclose($fh);
$start=(int)$start-1;
if ((int)$start>0)
{

            echo "<script>proceed_task('".$start."');</script>";
            }
}

?>



Ik ga dan naar de url message.php?begin=4
maar eigenlijk zou er in het tekst bestand zeker een 1 moeten staan maar gebeurt niet kun je me helpen aub?
Gewijzigd op 17/12/2010 07:58:00 door Da Ver
 



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.