Fil wrote:
Coucou,
est-ce que quelqu'un sait comment faire (en php) des calculs en background ? Mon idée était de faire comme cela : au lieu de faire les calculs lourds sur
des pages prises au hasard (et d'avoir donc des pages qui mettent, de temps
à autre, des plombes à s'afficher), les faire "derrière une image", en
envoyant l'image d'abord, puis en effectuant les calculs.
Mais ! Le problème est que tant que le script n'a pas fini de calculer, le
serveur ne flushe pas l'image, et la connexion reste active. C'est un peu
dommage. J'ai regardé du côté de http://fr3.php.net/manual/en/function.pcntl-fork.php
mais c'est une fonction vraiment pas standard.
et le fork, il a fortement tendance a bloquer le navigateur Web; de meme
que le fork n'est peut-etre pas dispo en environnement mutualisé;
il faut peut-etre regarder ces fonctions :
- PHP: socket_shutdown - Manual :
fermeture de la socket ; ca permettrait de liberer la connexion TCP
mais ca va en sens contraire du keep-alive, je me demande comment
ca se comporte dans ce contexte.
- PHP: register_shutdown_function - Manual
dans le forum, il est dit que c'est le seul moyen d'effectuer un traiment batch
asynchrone.
> This is important, because as far as I can tell, the documented functionality of
> register_shutdown_function() is the *ONLY* way to achieve anything resembling asynchronous
> processing with PHP in a web server environment. In my mind this is a severe limitation,
> because if you have some processing intensive task that needs to be done and you want to
> do it in PHP, there is no way to have it occur without an accompanying wait in a browser window.
> Sure you can use ignore_user_abort() to ensure that processing doesn't get cancelled by an
> impatient user (or impatient browser for that matter), but usability is still compromised.
- PHP: register_tick_function - Manual
ca pourrait peut-etre servir qui sait ... c'est un top horloge, une sorte de iddle task
- PHP: ignore_user_abort - Manual
sans doute a appeler en debut du traitement batch asynchrone.
j'en vois pas d'autre pour l'instant ; de meme je n'ai pas detecté sur google de page traitant
de facon exhaustive de ce probleme.
il est fort probable que ce probleme puisse est traité de 2 facon différente :
- en intranet, il est assez facile de placer une crontab sous Linux, Unix voir sous Windows
qui appelle un script cron.php
- en Internet, le site web cron.xxx doit etre capable d'appeler ce meme script.
- existe-t-il d'autres cas ?
pour le probleme du content size dans le header, il suffit de faire qq chose de ce genre je presume :
ob_start()
// blablabla
// ou code SPIP
ob_stop();
$content = ob_getcontent();
header("Content-type: html");
header("Content-length: ", strlen($content));
header("blabla ...");
echo $content;