Ik heb geen haar meer op mijn hoofd zitten (allemaal eruit getrokken) ..
Gek word ik van dit probleem...
Ik heb een (display.php) pagina wat d.m.v. xmlHTTP een TEXT file uitleest en deze elke seconde ververst. Dit werkt perfect.
Ik heb een PHP (timer.php) script wat elke seconde deze TEXT file bijwerkt en een teller ophoogt.
Dit werkt ook perfect (loopt bijvoorbeeld 60 seconden lang)
Ik krijg het op geen enkele manier voor elkaar dat ik de timer.php kan starten en de uitvoer van het script verder kan laten gaan. PHP wacht totdat timer.php klaar is met tellen en gaat dan pas verder.
Wat heb ik allemaal geprobeerd :
timer.php opstarten via de CLI met alle mogelijke execute commando's in PHP
shell_exec ("php timer.php");
exec ("php timer.php");
Passthru ("php timer.php");
etc..
Omdat het een windows systeem is : php-win gebruikt
shell_exec ("php-win timer.php");
exec ("php-win timer.php");
Passthru ("php-win timer.php");
etc..
Wat mij opvalt is het volgende :
In een command prompt intikken : php timer.php geeft 5 seconden geen prompt , script doet zijn werk en dan na 5 seconden weer de prompt.
Als ik php-win gebruik krijg ik direct een prompt en het script loopt interactief door op de achtergrond.
Waarom werkt dit dan niet als ik het aanroept vanuit een script? Waarom wacht het script dan toch nog steeds die 5 seconden voordat het script verder gaat.
Waarvoor wil ik deze methode gebruiken?
Er is een zwaar script geschreven wat bestanden opzoekt en upload naar een andere server. Dit process moet gestart worden d.m.v. een start-knop in de webbrowser. Dit process moet onafhankelijk lopen van de PHP-CGI environment waar de webserver PHP scripts in draaien. (Dus geen time-out settings etc etc) .. Ook moet de gebruiker rustig het venster kunnen sluiten of kunnen verlaten zonder dat het PHP script geterminate wordt.
Hier de test code :
(Niet conform XHTML of welke standaard dan ook , maar het gaat om het idee..)
display.php
timer.php
Systeem enviroment :
Oja.. wat wel belangrijk is om te weten is dat display.php een onderdeel van een CMS. Dit script wordt dus ergens geinclude. Het is dus essentieel dat dit script de rest van het CMS niet ophoudt.
Gek word ik van dit probleem...
Ik heb een (display.php) pagina wat d.m.v. xmlHTTP een TEXT file uitleest en deze elke seconde ververst. Dit werkt perfect.
Ik heb een PHP (timer.php) script wat elke seconde deze TEXT file bijwerkt en een teller ophoogt.
Dit werkt ook perfect (loopt bijvoorbeeld 60 seconden lang)
Ik krijg het op geen enkele manier voor elkaar dat ik de timer.php kan starten en de uitvoer van het script verder kan laten gaan. PHP wacht totdat timer.php klaar is met tellen en gaat dan pas verder.
Wat heb ik allemaal geprobeerd :
timer.php opstarten via de CLI met alle mogelijke execute commando's in PHP
shell_exec ("php timer.php");
exec ("php timer.php");
Passthru ("php timer.php");
etc..
Omdat het een windows systeem is : php-win gebruikt
shell_exec ("php-win timer.php");
exec ("php-win timer.php");
Passthru ("php-win timer.php");
etc..
Wat mij opvalt is het volgende :
In een command prompt intikken : php timer.php geeft 5 seconden geen prompt , script doet zijn werk en dan na 5 seconden weer de prompt.
Als ik php-win gebruik krijg ik direct een prompt en het script loopt interactief door op de achtergrond.
Waarom werkt dit dan niet als ik het aanroept vanuit een script? Waarom wacht het script dan toch nog steeds die 5 seconden voordat het script verder gaat.
Waarvoor wil ik deze methode gebruiken?
Er is een zwaar script geschreven wat bestanden opzoekt en upload naar een andere server. Dit process moet gestart worden d.m.v. een start-knop in de webbrowser. Dit process moet onafhankelijk lopen van de PHP-CGI environment waar de webserver PHP scripts in draaien. (Dus geen time-out settings etc etc) .. Ook moet de gebruiker rustig het venster kunnen sluiten of kunnen verlaten zonder dat het PHP script geterminate wordt.
Hier de test code :
(Niet conform XHTML of welke standaard dan ook , maar het gaat om het idee..)
display.php
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| <script language="JavaScript"> var xmlhttp=false; /*@cc_on @*/ /*@if (@_jscript_version >= 5) // JScript gives us Conditional compilation, we can cope with old IE versions. // and security blocked creation of the objects. try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } @end @*/ if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } function loadFragmentInToElement(fragment_url, element_id) { var element = document.getElementById(element_id); xmlhttp.open("GET", fragment_url); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { element.innerHTML = xmlhttp.responseText; } } xmlhttp.send(null); } function update() { loadFragmentInToElement ('https://intranet/cli/status.txt', 'synchronizestatus'); // items=open("", "items"); // setTimeout("alert(synchronizestatus.innerHTML)",2000) // items.document.write (synchronizestatus.innerHTML); repeat = setTimeout("update()",1000); } function submit_action(action){ items_to_synchronize.action.value=action; items_to_synchronize.submit(); }; function set_vis(elm, div){ disp=div.style; if(disp.display=='inline'){disp.display='none'; elm.value='view';}; else {disp.display='inline'; elm.value='hide';};} window.onload = update; </script/> <h1>Synchronization Status</h1> <br>De teller is : <span id="synchronizestatus"></span> <? //Hier onder is iets wat ik al veelvuldig heb aangepast zoals in het verhaal staat hierboven) passthru("php-win timer.php"); ?> |
timer.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?php $x = 0; while ($x < 5) // 5 seconds { /* counter */ $data = fopen("status.txt","r"); $count = fgets($data,1000); $count=$count + 1 ; $data = fopen("status.txt","w"); // opens to write and deletes the old count fwrite($data, $count); fclose($data); sleep(1); $x++; } ?> |
Systeem enviroment :
code:
1
2
| Windows NT 5.0 build 2195 PHP Version 5.1.0RC1 |
Oja.. wat wel belangrijk is om te weten is dat display.php een onderdeel van een CMS. Dit script wordt dus ergens geinclude. Het is dus essentieel dat dit script de rest van het CMS niet ophoudt.
[ Voor 6% gewijzigd door om3ega op 21-10-2005 11:32 ]