Question

Nous avons récemment activé les APC sur nos serveurs et parfois lorsque nous publions du nouveau code ou des modifications, nous découvrons que les fichiers source qui ont été modifiés commencent à générer des erreurs qui ne sont pas reflétées dans le code, généralement des erreurs d'analyse décrivant un jeton inexistant. Nous avons vérifié cela en exécutant php -l sur les fichiers dont les journaux d'erreur indiquent qu'ils sont affectés. Habituellement, une republication corrige le problème. Nous utilisons PHP 5.2.0 et APC 3.01.9. Ma question est la suivante: quelqu'un d'autre a-t-il rencontré ce problème ou quelqu'un a-t-il reconnu en quoi consiste notre problème? Si oui, comment avez-vous résolu le problème ou comment pourrions-nous le résoudre?

Edit: Je devrais probablement ajouter quelques détails sur notre processus de publication. Le contenu est transmis aux serveurs de production via rsync à partir d'un serveur de transfert. Nous avons activé apc.stat_ctime car il indique que cela facilite le fonctionnement de rsync. apc.write_lock est activé par défaut et nous ne l'avons pas désactivé. Idem pour apc.file_update_protection .

Était-ce utile?

La solution

On dirait qu’un fichier partiellement publié est en cours de lecture et est mis en cache comme s'il était cassé. apc.file_update_protection est conçu pour aider à arrêter cela.

dans php.ini: apc.file_update_protection entier

  Paramètre

apc.file_update_protection   met un délai sur la mise en cache flambant neuf   des dossiers. La valeur par défaut est 2 secondes, ce qui   signifie que si la modification   l'horodatage (mtime) d'un fichier montre que   il a moins de 2 secondes quand il   est accédé, il ne sera pas mis en cache.   La malheureuse qui a accédé   ce fichier à moitié écrit verra toujours   bizarre, mais au moins ça ne va pas   persister.

Suite à la question en cours de modification: une des raisons pour lesquelles je ne vois pas ce genre de problèmes est que je mets en place une toute nouvelle copie du site (avec exportation SVN). Ce n’est qu’à la fin de cette opération qu’il devient visible pour Apache / Mod_php (voir ma réponse Comment commencer à déployer des applications PHP à partir d'un référentiel de sous-version? )

L’autre chose qui peut arriver, bien sûr, est que si vous mettez à jour sur place, vous pouvez mettre à jour des fichiers qui dépendent d’autres qui n’ont pas encore été téléchargés. Rsync ne peut garantir les mises à jour atomiques que pour des fichiers individuels, pas pour l'ensemble de la collection en cours de modification / téléchargement. Une autre raison, à mon avis, de télécharger le site en masse, puis de la mettre en service.

Autres conseils

Il semble que APC ne préforme pas ou n’obtienne pas les informations de statistiques de fichier correctes. Vous pouvez le vérifier pour vous assurer que la configuration APC est apc. stat est défini correctement. Vous pouvez également forcer le cache à effacer avec apc_clear_cache ( ) lorsque vous publiez un nouveau code.

Je n'ai jamais vu cela auparavant, même si je suis un grand utilisateur d'APC. Essayez peut-être de déclencher un script qui vide l'opcode APC chaque fois que vous envoyez un nouveau code sur le serveur?

Lorsque vous obtenez un fichier avec une erreur d'analyse, sauvegardez-le, puis republiez-le. Prenez ce même fichier qui fonctionne maintenant et faites un diff contre le fichier avec l'erreur d'analyse.

ctime signifie l'heure de la création. Vous voudrez vider manuellement tout votre cache chaque fois que vous effectuez des mises à jour.

Vous pouvez facilement le faire en plaçant le script apc.php quelque part sur votre serveur. Ce script vous donne des statistiques sur le cache et vous permettra de le supprimer complètement.

Le script est fourni avec APC.

Hopet son aide, Evert

Cela se produit probablement car il existe une discordance entre votre code et les versions en cache du code.

Par exemple, APC a une version mise en cache de User.php, mais vous avez apporté des modifications à User.php ou aux données utilisées par User. La version en cache est toujours en cours d'exécution même après votre déploiement, car elle n'a pas encore expiré.

Si vous effacez les entrées du cache APC lors du déploiement, ce problème devrait disparaître.

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