strip_tags - php supprimer code html



Exécuter le code après que la requête HTTP soit complète en PHP? (3)

Cela pourrait être un peu hackish à votre goût, mais ce serait une solution de contournement efficace et simple.

Vous pouvez créer une "file d'attente" gérée par votre base de données, et d'abord stocker la requête dans votre table de files dans la base de données, puis sortir une iframe qui conduira à un script qui déclenchera les instructions correspondant à queue_id dans votre base de données.

ex:

<?php
mysql_query('INSERT INTO queue ('instructions') VALUES ('something would go here');
echo('<iframe src="/yourapp/execute_queue/id?' . mysql_insert_id() . '" />');
?>

et le cadre ferait quelque chose comme

ex:

<?php
$result = mysql_query('SELECT instructions FROM queue WHERE id = ' . $_GET['id']);
// From here, simply execute some instruction based on the "instructions" field, then delete the instruction from the database.
?>

Comme je l'ai dit, je peux voir comment vous pourriez considérer ce hackish, mais le cadre se chargera indépendamment de sa page parente, de sorte qu'il atteindrait ce que vous voulez sans exécuter une autre application en arrière-plan.

J'espère que cela vous indique au moins dans la bonne direction.

À votre santé!

PHP fournit un mécanisme pour enregistrer une fonction d'arrêt:

register_shutdown_function('shutdown_func');

Le problème est que dans les versions récentes de PHP, cette fonction est toujours exécutée PENDANT la requête.

J'ai une plate-forme (dans Zend Framework si cela est important) où n'importe quel morceau de code tout au long de la demande peut enregistrer une entrée pour être connecté à la base de données. Plutôt que d'avoir des tonnes d'instructions d'insertion individuelles tout au long de la requête, ralentissant la page, je les place en file d'attente pour être inséré à la fin de la requête. Je voudrais être en mesure de le faire une fois que la requête HTTP est terminée avec l'utilisateur afin que la durée d'enregistrement ou d'autres tâches de nettoyage n'affecte pas le temps de chargement perçu de l'utilisateur de la page.

Y at-il une méthode intégrée en PHP pour faire cela? Ou dois-je configurer un type de schéma d'espace mémoire partagé avec un processus externe et signaler ce processus pour effectuer la journalisation?


Answer #1

En dehors de register_shutdown_function (), il n'y a pas de méthodes intégrées pour déterminer quand un script s'est terminé. Cependant, Zend Framework dispose de plusieurs hooks pour exécuter du code à des points spécifiques du processus de répartition. Pour vos besoins, le plus pertinent serait le hook post-dispatch du contrôleur d'action qui a lieu juste après l'envoi d'une action, et l' évènement dispatchLoopShutdown pour le courtier plugin du contrôleur.

Vous devriez lire le manuel pour déterminer lequel vous convient le mieux.

EDIT: Je suppose que je n'ai pas compris complètement. À partir de ces crochets, vous pouvez utiliser le processus en cours sous une forme ou une autre. PHP a plusieurs façons de fourcher les processus que vous pouvez lire dans le manuel sous l'exécution du programme . Je suggère de passer en revue l'extension pcntl - lisez cet article de blog pour voir un exemple de processus enfants forking à exécuter en arrière-plan.


Answer #2

Si vous êtes vraiment préoccupé par les temps d'insertion de MySQL, vous abordez probablement les symptômes et non la cause.

Par exemple, si votre processus PHP / Apache est en cours d'exécution après que l'utilisateur ait reçu son code HTML, votre processus PHP / Apache est toujours verrouillé dans cette requête. Etant donné qu'il est occupé, si une autre requête arrive, Apache doit charger un autre thread, lui consacrer plus de mémoire, ouvrir des connexions de base de données supplémentaires, etc.

Si vous rencontrez des problèmes de performances, vous devez supprimer de lourdes charges de votre exécution de PHP / Apache. Si vous avez beaucoup de tâches de nettoyage, vous brûlez de précieux processus Apache.

J'envisagerais de consigner vos entrées dans un fichier et d'en charger un fichier crontab dans votre base de données hors bande. Si vous avez d'autres tâches lourdes, utilisez un système de mise en file d'attente / travail pour faire le travail hors bande.





zend-framework