PHP include no lee los cambios del archivo fuente

Mi problema (probablemente no ocurra en tu computadora)

Tengo 2 scripts PHP.

La primera lectura de script incluye la segunda secuencia de comandos para obtener una variable, cambiar el valor y hacer file_put_contents para cambiar la segunda secuencia de comandos.

<?php include('second.php'); // in second.php, $num defined as "1" $num ++; // now $num should be "2" // Change content of second.php file_put_contents('second.php', ''); include('second.php'); // Now here is the problem, $num's value is still "1" echo $num; // and I get an unexpected result "1" ?> 

El segundo script simplemente contiene una variable

  

Espero que el resultado sea “2”, pero parece que el segundo include no lee los cambios realizados por file_put_contents.

Mi primera conjetura fue que podría haber un problema de concurrencia en la función file_put_contents, por lo que el segundo archivo no se modificó cuando el segundo se ejecutó.

Intento probar mi conjetura cambiando el primer script a este:

 <?php include('second.php'); $num ++; file_put_contents('second.php', ''); // show the contains of second.php echo '
' . str_replace(array(''), array('<', '>'), file_get_contents('second.php')) . '

'; include('second.php'); echo $num; ?>

Me sorprendió mucho descubrir que el resultado del progtwig es este:

  3 

Esto significa que file_put_contents leyó el archivo correctamente (en otras palabras, el archivo realmente se ha cambiado físicamente), pero “incluir” todavía usa el primer valor.

Mis preguntas

  1. ¿Alguien puede explicar esto?
  2. ¿Hay alguna solución (en lugar de “sleep ()”) para hacer que “include” lea los cambios?

He leído esta pregunta y no he encontrado respuesta.

Cambios dynamics de archivos en PHP. Los cambios a veces no son visibles en include (), ftp_put ()

Solución temporal

Usar eval parece ser una solución temporal. Esto no es elegante ya que eval generalmente se asocia con un agujero de seguridad.

 <?php require('second.php'); $num ++; file_put_contents('second.php', ''); echo '
' . str_replace(array(''), array('<', '>'), file_get_contents('second.php')) . '

'; require('file.php'); echo $num . '
'; eval(str_replace(array(''), array('', ''), file_get_contents('second.php'))); echo $num; ?>

Este es el resultado:

  9 10 

Solutions Collecting From Web of "PHP include no lee los cambios del archivo fuente"

Probablemente tiene OPcache instalado y habilitado (Desde Php 5.5: extensión OPcache agregada ), el almacenamiento en caché de su second.php archivo.php?

Ver phpinfo() si es verdadero.

Si es así, use opcache_invalidate('second.php') para invalidar el archivo en caché o opcache_reset() para restablecer todos los archivos en caché.

 < ?php include('second.php'); $num ++; file_put_contents('second.php', ''); opcache_invalidate('second.php');//Reset file cache include('second.php'); echo $num;//2 ?>