PHP est approprié pour les très grands projets? Peut-il être-transactionnelles?

StackOverflow https://stackoverflow.com/questions/934236

  •  06-09-2019
  •  | 
  •  

Question

Cette question peut paraître étrange.

Mais chaque fois que je fait des projets PHP dans le passé, je rencontre ce genre de mauvaise expérience:

Scripts en cours d'exécution au bout de 10 procéder à l'annulation secondes. Il en résulte des incohérences de base de données très mauvais (mauvais exemple pour une boucle de suppression: L'utilisateur est sur le point de supprimer un album photo objet album est supprimé de la base de données, puis à mi-chemin vers le bas de supprimer les photos que le script est tué là où il est, et. 10.000 les photos sont laissés sans référence).

Il est pas transactionnelles. Je ne l'ai jamais trouvé un moyen de faire quelque chose en toute sécurité , pour vous assurer qu'il est fait . Si script est tué, il est tué. En plein milieu d'une boucle. Il se vient de tuer. Cela n'a jamais eu lieu sur tomcat avec java. Java fonctionne et fonctionne et fonctionne, si elle prend beaucoup de temps.

Lot de scripts newsletter-essayer de venir autour de ce problème en divisant le travail en un grand nombre de paquets, à savoir l'envoi de 100 à la fois, relading alors la page (oh homme, vraiment stupide), en faisant la suivante, et bientôt. Le plus souvent, quelque chose se bloque ou script prendre plus de 10 secondes, et votre plate-forme est estropié vers le haut.

Mais alors, j'entends que très grands projets utilisent PHP comme StudiVZ (le clone facebook allemand, en fait le plus grand site allemand). Donc, il y a une petite lueur d'espoir que ce mauvais comportement vient juste de sociétés d'hébergement non professionnel qui vient de tuer des scripts php parce que leurs serveurs sont si mauvais. Quelle est la vérité à ce sujet? Peut-il être configuré de telle sorte, que les scripts ne sont jamais tués parce qu'ils prennent un peu plus longtemps?

Pas de solution correcte

Autres conseils

  

PHP est-il approprié pour les très grands projets?

Chaque fois que je vois une question comme ça, je suis un peu mal à l'aise. Qu'est-ce que très grand signifie? Ce qui peut être important pour vous, peut-être petit pour moi ou vice-versa. Et ce qui est à supposer même que nous utilisons la même métrique. Mesurez-vous le temps de construire le projet, complet du cycle de vie du projet, de l'argent qui sont impliqués, le nombre de personnes qui l'utilisent, le nombre de développeurs de créer / maintenir, etc., etc.

Cela dit, les problèmes que vous décrivez semble que vous ne connaissez pas votre technologie assez bon. Ce serait un problème pour vous, quel que soit la technologie que vous avez choisi. Par exemple, utiliser des transactions de base de données pour assurer atomicité. Et utiliser des emplois hors ligne asynchrones pour traiter de longues tâches en cours d'exécution (telles que l'envoi d'une liste de diffusion).

Beaucoup si le mauvais comportement est couvert de bons cadres comme le Zend Framework. Tout ce qui prend plus de temps les 10 secondes est vraiment foiré, mais vous pouvez toujours augmenter le temps d'exécution avec http: // DE3. php.net/set_time_limit

Beaucoup de grands sites sont writen en PHP: Facebook, Wikipedia, StudiVZ, Digg.com etc .. beaucoup de choses dont vous parlez ne sont que des choses de configuration, vous devriez peut-être regarder dans cette

?

Performance n'est pas une fonctionnalité que vous pouvez simplement jeter après que la plupart du site est fait. Vous devez concevoir le site pour une charge lourde.

Si une tâche de base de données est normalement impliquant 10K lignes, vous devez être prêt non seulement les problèmes de temps d'exécution, mais d'autres questions d'entretien.

  • Le pire cas: faire un outil de cohérence pour vérifier et corriger ces erreurs.
  • Mieux:. Au lieu de supprimer phisically les images, il suffit de les laisser drapeau et services de base pour prendre soin des manœuvres coûteuses
  • Best. Vous pouvez utiliser un service de file d'attente d'emplois et ajouter ce poste à la file d'attente

Si vous avez besoin de faire des transactions en php, vous pouvez simplement faire:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

La commande commit simplement compléter la transaction.

En cas d'erreur, vous pouvez simplement rollback avec:

mysql_query("ROLLBACK");

Modifier Notez que cela ne fonctionnera que si vous utilisez une base de données qui prend en charge les transactions, telles que InnoDB

Vous pouvez configurer combien de temps est autorisé pour l'exécution d'un script, que ce soit dans le php.ini ou via ini_set / set_time_limit

Au lieu de StudiVZ (le clone allemand de Facebook), vous pouvez regarder le Facebook réelle qui est tout à fait PHP. Ou Digg. Ou de nombreux sites Yahoo. Ou beaucoup, beaucoup d'autres.

ignore_user_abort est probablement ce que vous cherchez, mais vous pouvez également ajouter une autre couche en termes de travaux d'entretien prévus. Ils courent essentiellement sur un intervalle spécifié et faire des choses différentes pour vous assurer que vos données / système de fichiers sont dans un état que vous voulez ... la suppression de fichiers anciens / non liée est juste une des nombreuses choses que vous pouvez faire.

Pour ces grandes boucles comme la suppression des albums photo ou d'envoyer 1000 de courriels que vous cherchez ignore_user_abort et set_time_limit.
Quelque chose comme ceci:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

Attention, cependant, que cela pourrait exécuter le script pour toujours:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

Ce script ne mourra jamais, à moins que vous redémarrez votre serveur.

Par conséquent, il est préférable de ne jamais régler la time_limit le 0.

Techniquement pas le langage de programmation est transaction en toute sécurité, il est la base de données qui doit être transaction en toute sécurité. Donc, si le fonctionnement script / code meurt ou se déconnecte, pour une raison quelconque, la transaction seront annulées.

Mettre les requêtes en boucle est une très mauvaise idée, sauf si elle est spécifiquement la conception d'être en cours d'exécution par lots et de briser un ensemble beaucoup plus en petits morceaux. Réglage des minuteries de PHP et des limites est généralement une solution palliative, vous dépendez toujours sur le navigateur du client si vous utilisez le Web pour lancer un script.

Si j'ai un long processus qui doit être lancé par un navigateur, je « déconnecter » le processus du serveur de navigateur Web et si le contrôle est retourné à l'utilisateur alors que le script est exécuté. scripts PHP exécuter à partir de la ligne de commande peut fonctionner pendant des heures si vous voulez. Vous pouvez ensuite utiliser AJAX ou recharger la page, pour vérifier l'état d'avancement du script à long en cours d'exécution.

Il y a problème de sécurité avec ce code, mais pour « déconnecter » un processus de PHP en cours d'exécution sous quelque chose comme Apache:

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

Mais cela n'a vraiment rien à voir avec PHP convenant pour de grands projets ou être transactionnelles. PHP peut être utilisé pour les grands projets, mais puisque par défaut, il n'y a pas de code qui reste « résident » entre succès, il peut obtenir lent sinon conçu à droite. De plus, puisqu'il n'y a pas de support d'espace de noms, vous voulez planifier à l'avance si vous avez une grande équipe de développement.

Il est très bien pour un système basé sur Java de prendre quelques minutes pour démarrer, initialiser et charger tous les objets par défaut. Mais cela est inacceptable avec PHP. PHP prendra plus de planification pour les systèmes plus importants. La question est, à quel moment le temps économisé en utilisant PHP se défoncent par le temps de planification supplémentaire nécessaire pour un grand système?

La raison pour laquelle vous avez très probablement connu de mauvaises bases de données consistances dans le passé est parce que vous utilisez le moteur MyISAM pour MySQL (qui ne supporte pas les transactions). Utilisation InnoDB place, il prend en charge les transactions et effectue le verrouillage de niveau de ligne. Ou utilisez postgreSQL.

Beaucoup, beaucoup de sites de logiciels sont faits en PHP. Cependant, vous ne serez pas entendre parler des millions de pages web faites en PHP qui n'existent plus parce qu'ils ont été abandonnés. Ces pages peuvent avoir brûlé tout l'argent de l'entreprise pour faire face à mess PHP, ou peut-être qu'ils parce que leur banqueroute douce était si merdique que le client ne voulait pas qu'il ... PHP semble bien au démarrage, mais il n'échelle pas très bien. Oui, il y a beaucoup de grands sites Web en PHP, mais ils sont plutôt des exceptions, qu'une norme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top