library framework cache php caching frameworks state persist

php - cache - fat free framework



Cómo persistir objetos entre solicitudes en PHP (3)

He estado usando las aplicaciones de Rails, Merb, django y asp.net mvc en el pasado. Lo que tienen en común (que es relevante para la pregunta) es que tienen un código que configura el marco. Por lo general, esto significa crear objetos y estados que se mantienen hasta que el servidor web se recicla (como configurar el enrutamiento o verificar qué controladores están disponibles, etc.).

Por lo que sé, PHP es más como un script CGI que se compila en algún código de bytes cada vez que se ejecuta, y después de la solicitud se descarta. Por supuesto, puede tener sesiones para persistir los datos entre solicitudes del mismo usuario, y como veo hay extensiones como APC, con las cuales puede persistir objetos entre solicitudes en el nivel del servidor.

Mi pregunta es: ¿cómo se puede crear una aplicación PHP que funcione como rieles y demás? Me refiero a una aplicación que en las primeras solicitudes configura el marco, luego en las solicitudes 2 y posteriores utilizan los objetos que ya están configurados. ¿Hay alguna instalación integrada de almacenamiento en caché en mod_php? (por ejemplo, que almacena el código de bytes compilado de las aplicaciones php ejecutadas) ¿O es APC o algunas extensiones similares la única forma de resolver este problema? ¿Como lo harias?

Gracias.

EDITAR: Pregunta alternativa: si creo una aplicación PHP grande que tiene un tiempo de configuración muy grande, pero un tiempo de ejecución menor (como en los marcos mencionados anteriormente), entonces ¿cómo debo "almacenar en caché" las cosas que ya están configuradas (esto podría significa muchas cosas, excepto quizás las conexiones de base de datos, porque para eso ya tiene conexiones persistentes en PHP).

Para justificar el tiempo de configuración grande: qué pasa si estoy usando la reflexión de PHP para verificar qué objetos están disponibles y configurar el tiempo de ejecución de acuerdo con eso. Hacer mucha reflexión suele ser lento, pero uno tiene que hacerlo solo una vez (y reevaluar solo si se modifica el código fuente).

EDIT2: Parece que es APC entonces. El hecho de que almacene en caché el código de bytes automáticamente es bueno saberlo.


Creo que estás haciendo algunas generalizaciones incorrectas. Todos esos marcos (ej: Rails ) se pueden ejecutar con diferentes configuraciones. Bajo algunos, se crea un proceso para cada solicitud. Obviamente, esto perjudica el rendimiento, pero muestra que estos marcos no dependen de un proceso de larga ejecución. Pueden configurar las cosas (repasar archivos de configuración, crear objetos, etc.) cada solicitud si es necesario.

Por supuesto, mod_php (la forma en que normalmente se usa PHP) se ejecuta dentro del proceso del servidor web, a diferencia de CGI. Así que no veo nada fundamentalmente diferente entre CakePHP (por ejemplo) y Rails.

Creo que tal vez estás buscando algo como WSGI de Python o Ruby''s Rack , pero para PHP. Esto especifica una interfaz (independiente de cómo se ejecuta el idioma) para una aplicación. Para una nueva solicitud, se crea una nueva instancia de un objeto de aplicación. Que yo sepa, esto no existe para PHP.


No estoy seguro de si APC es la única solución, pero APC se ocupa de todos sus problemas.

Primero, su script se compilará una vez con APC y el bytecode se almacenará en la memoria.

Si tiene algo que demora mucho en la configuración, también puede guardarlo en la memoria caché de APC como datos de usuario. Por ejemplo, hago esto todo el tiempo,

$table = @apc_fetch(TABLE_KEY); if (!$table) { $table = new Table(); // Take long time apc_store(TABLE_KEY, $table); }

Con APC, la tarea de crear una tabla solo se realiza una vez por instancia de servidor.


PHP (y ruby ​​para el caso) son lenguajes interpretativos. Es decir, analizan los archivos cada vez que se solicitan y supongo que se podría decir que se convierten a un código de pseudo bytes. Es más ''aparente'' uno podría decir que PHP es más parecido a esto que RoR pero ambos se comportan de la misma manera.

La característica de persistencia de datos entre solicitudes es una característica del servidor, no del idioma en sí. Por ejemplo, el enrutamiento RoR del que habla es, de hecho, almacenado en caché, pero se almacena en caché en la memoria local del servidor. No está compilado y almacenado para lecturas más rápidas. El servidor (y por servidor me refiero tanto a la caja como a las instancias de servicio web) reinicia esta información se ha ido. La "configuración del marco" del que habla todavía implica analizar CADA archivo involucrado en el marco. Rails analiza cada archivo durante la solicitud una y otra vez, las características de nivel de producción pueden de hecho almacenar estos datos en la memoria, pero ciertamente en el desarrollo no lo hace. La única razón por la que lo menciono es porque ilustra que es una característica del servidor, no el idioma.

Para lograr lo mismo en PHP puedes usar Zend Server. Por lo que sé, este es el único intérprete de PHP que "compilará" y usará el código de bytes cuando se le indique. De lo contrario, tendrá que encontrar una manera de almacenar los datos que desea conservar en las solicitudes. Como mencionaste, APC es una característica muy poderosa, una más distribuida es Memcached y, por supuesto, hay formas más persistentes como disc y sql.

Me interesa saber por qué le gustaría esta característica en particular. ¿Está notando problemas de rendimiento que podrían "resolverse" al hacer esto?