Bonjour,

Je suis en train de tester une application Symfony 2.8.22 avec PHP 5.6.26 sous Windows avec IIS.
J’affiche 10 pages de l’application dans 10 instances de navigateurs, ces pages affichent des données de suivi de process et sont rafraichies toutes les 3 minutes.
Je laisse les 10 pages dans cette situation pendant une longue durée (1 jour ou plus).
Après ce délai, plusieurs pages sont souvent en erreur avec l’erreur décrite ci-dessous.

Voici des extraits des traces :

[2017-09-26 02:32:47.669189] php.DEBUG: rename(C:\inetpub\wwwroot\MonProjet\app\cache\dev\appEBF5.tmp,C:\inetpub\wwwroot\MonProjet\app\cache\dev/appDevDebugProjectContainerUrlMatcher.php):
Accés refusé. (code: 5)
{"type":2,"file":"C:\inetpub\wwwroot\MonProjet\vendor\symfony\symfony\src\Symfony\Component\Filesystem\Filesystem.php","line":278,"level":28928} []

[2017-09-26 02:32:47.966006] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Filesystem\Exception\IOException: "Cannot rename "C:\inetpub\wwwroot\MonProjet\app\cache\dev\appEBF5.tmp"
to "C:\inetpub\wwwroot\MonProjet\app\cache\dev/appDevDebugProjectContainerUrlMatcher.php"."
at C:\inetpub\wwwroot\MonProjet\vendor\symfony\symfony\src\Symfony\Component\Filesystem\Filesystem.php line 279
{"exception":"[object] (Symfony\Component\Filesystem\Exception\IOException(code: 0):
Cannot rename \"C:\inetpub\wwwroot\MonProjet\app\cache\dev\appEBF5.tmp\" to \"C:\inetpub\wwwroot\MonProjet\app\cache\dev/appDevDebugProjectContainerUrlMatcher.php\".
at C:\inetpub\wwwroot\MonProjet\vendor\symfony\symfony\src\Symfony\Component\Filesystem\Filesystem.php:279)"} []

Le code provoquant l’exception est :

public function rename($origin, $target, $overwrite = false)
{
    // we check that target does not exist
    if (!$overwrite && $this->isReadable($target)) {
        throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
    }

    if (true !== @rename($origin, $target)) {
        throw new IOException(sprintf('Cannot rename "%s" to "%s".', $origin, $target), 0, null, $target);
    }
}

Lig 278 : @rename($origin, $target)
Lig 279 = 2e throw

J’ai lu quelques articles qui donnent 2 pistes :

  • la fonction PHP rename pourrait parfois mal fonctionner sous Windows
  • IIS pourrait manquer de droits sur le dossier de l’application (ce dont je doute car certaines écritures fonctionnent)

Ce problème est-il connu ? Si oui, comment le résoudre ?

Merci

6 réponses


Salut,

Tu ne peux pas accéder au fichier car tu n'as pas les permissions requises, voilà ce qui provoque l'erreur ;)

Bonjour,

Merci pour la réponse. Il est possible que ce soit un pb de droits mais je ne suis pas convaincu car la plupart des écritures de fichiers fonctionnent sans erreur (que ce soit dans le cache ou les logs) et seuls quelques appels à "rename" échouent apparemment de façon aléatoire .

Cdt

Peut-être que tu essayes de rename un fichier alors que celui-ci est lock car le système écrit dedans ?

Bonjour,

Merci pour la réponse.

C'est effectivement une cause posible.

Le pb est que ce code est fourni par Symfony. Ce n'est pas du code applicatif.
Il n'est donc pas de mon ressort de modifier le code effectuant ce renommage.

Une migration de l'application en PHP 7 et Symfony 3 est prévue ces prochains mois.

Je verrai si la migration élimine ce pb. Il est possible que la fonction "rename" de PHP ait été améliorée en version 7.

Cdt.

Bonjour,

L'application a été migrée en Symfony 3. Ce pb subsiste.
La migration en PHP 7 est prévue dans qq semaines.

Cdt

Bonjour,

Ce problème n'apparaît pas lorsqu'on utilise l'application Symfony en mode production au lieu du mode debug.
S'il venait à se reproduire en mode production, je le signalerai.

P.LEBRUN