php code laten lopen op de achtergrond
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?
Als dat neit toegelaten wordt: Hosting vragen om advies. Helpen ze niet, andere hosting zoeken.
Nee cron laten ze ook niet toe. Nog andere ideeën???
Andere hosting zoeken met betere service.
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.
Waarom moet het script door blijven lopen?
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.
Dan heb je enkel Ajax nodig.
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?
index.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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>
<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)
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
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);
}
}
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)
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
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);
?>
$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
En hoe zorg ik er voor dat de gebruiker de webpagina niet afsluit als het script nog aan het lopen is?
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
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 -
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
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???
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
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)
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
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>";
}
}
?>
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