2010-05-30 13 views
16

He estado usando aplicaciones de mvc rails, merb, django y asp.net en el pasado. Lo que tienen en común (que es relevante para la pregunta) es que tienen un código que establece el marco. Esto generalmente significa la creación de objetos y el estado que se conserva hasta que el servidor web se recicla (como configurar el enrutamiento o verificar qué controladores están disponibles, etc.).Cómo persistir objetos entre solicitudes en PHP

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

Mi pregunta es: ¿cómo se puede crear una aplicación PHP que funcione como los rieles y tal? Me refiero a una aplicación que en las primeras solicitudes configura el marco, luego en la segunda y posteriores solicitudes usan los objetos que ya están configurados. ¿Hay alguna instalación de almacenamiento en caché en mod_php? (por ejemplo, que almacena el código de bytes compilado de las aplicaciones de php ejecutadas) ¿O está usando 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 menor tiempo de ejecución (como en los marcos mencionados anteriormente) entonces ¿cómo debo "caché" las cosas que ya están configuradas up (esto podría significar muchas cosas, excepto tal vez las conexiones a la base de datos, porque para eso ya tienes conexiones persistentes en PHP).

Para justificar un gran tiempo de configuración: ¿qué ocurre si uso la reflexión de PHP para verificar qué objetos están disponibles y establecer el tiempo de ejecución de acuerdo con eso? Hacer muchas reflexiones suele ser lento, pero hay que hacerlo solo una vez (y volver a evaluar solo si se modifica el código fuente).

EDIT2: Parece que es APC entonces. El hecho de que almacena en caché bytecode automáticamente es bueno saberlo.

Respuesta

5

No estoy seguro 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 le lleva mucho tiempo configurar, también puede almacenarlo en caché en 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 la tabla sólo se realiza una vez por instancia de servidor.

+0

La precompilación de los scripts es solo una parte del trabajo. Pero si lo veo corectly también tengo que hacer esta parte usando PHP, ¿verdad? Quiero decir, por ejemplo, mod_php no hará esto por mí. – SztupY

+1

Code-caching es transparente. Simplemente instale APC y guardará en caché su código de bytes automáticamente a menos que lo desactive. Los datos de tu aplicación como $ table en mi ejemplo no se almacenarán en caché automáticamente. Tienes que hacerlo tú mismo. –

+4

¿Por qué demonios estás suprimiendo 'apc_fetch'? ** 'afc_fetch' devuelve la variable almacenada o matriz de variables en caso de éxito; FALSO en caso de falla **. –

0

Creo que estás haciendo generalizaciones incorrectas. Todos esos marcos (por ejemplo: Rails) se pueden ejecutar con diferentes configuraciones. En algunos, se crea un proceso para cada solicitud. Esto, obviamente, perjudica el rendimiento, pero muestra que estos marcos no dependen de un proceso de larga duración. Pueden configurar cosas (actualizar 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 quizás esté buscando algo como Python's WSGI o Ruby's Rack, pero para PHP. Esto especifica una interfaz (independientemente 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. Hasta donde yo sé, esto no existe para PHP.

+1

Sí, pero por lo general no se descartan y regeneran después de cada solicitud. Por supuesto, puede hacer que los rieles funcionen de esa manera, pero también significará que tendrá 3-4 segundos de tiempo de configuración para cada solicitud. Y para algunos, incluso si hay nuevos procesos generados, comparten algo del marco de configuración. – SztupY

+0

3-4 segundos de tiempo de configuración es una exageración grandiosa, las solicitudes estándar de rieles tardan menos de 100 milisegundos en mis máquinas de desarrollo (lo que significa que RoR se está ejecutando en desarrollo, lo que significa que analiza archivos cada vez). Editar: Posiblemente tengas una configuración mucho más compleja que la que tiene un marco estándar, por lo que este comentario está extinto. –

+0

Rails generalmente se ejecuta como un proceso separado para el cual el servidor web se conecta cuando necesita servir otro proceso. Passenger/mod_rails se usa para manejar estos procesos. AFAIK mod_php no creará un proceso de aplicación de servidor por separado (ni se conectará a él), simplemente interpretará el archivo php, y depende de este archivo php hacer lo que debe hacer. Mirando los códigos fuente de CakePHP parece que tiene algo de soporte de almacenamiento en caché, pero no sé lo que realmente almacena en caché. – SztupY

3

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 en un código de pseudo byte. Es más 'aparente' uno podría decir que PHP es más como esto que decir RoR, pero ambos se comportan de la misma manera.

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

Para lograr lo mismo en PHP puede usar Zend Server. Hasta donde yo sé, este es el único intérprete de PHP que 'compilará' y usará el código de bytes cuando se lo indiquen. De lo contrario, deberá encontrar la forma de almacenar los datos que desea que persistan sobre las solicitudes. APC como usted mencionó es una característica muy poderosa, una más distribuida es Memcached y luego, por supuesto, hay formas más persistentes como el disco & sql.

Estoy interesado en saber por qué desea esta función en particular. ¿Notan problemas de rendimiento que serían 'resueltos' al hacer esto?

+0

Como la edición sugiere que estoy usando el reflejo para crear muchas cosas (principalmente para ser más SECO), y es bastante lento (al menos en términos de tiempo de ejecución general: el 95% es el tiempo de configuración), pero solo necesita hacerse una vez Solo tengo curiosidad sobre cómo la comunidad PHP resuelve "problemas" como este (o si realmente resuelven estos "problemas" en absoluto). – SztupY

+0

¿Estaría dispuesto a discutir la situación particular en la que se encuentra y quizás podamos discutir 'soluciones alternativas'? No interprete que significa "lo está haciendo mal". Solo me gustaría obtener más información para poder dirigirlo al lugar correcto.Si son cosas que necesitan configurarse, rara vez se usa un servidor de caché de memoria como APC/Memcached (anterior para instalaciones de servidor único, luego para servidor múltiple y más control). –

+0

En realidad tengo curiosidad. Durante los últimos 4 años no he usado PHP, y estaba acostumbrado a cómo funcionan los otros marcos. Me gusta que usen mucha reflexión (principalmente ASP.NET MVC) durante la fase de configuración para ser más DRY, y yo quería hacer lo mismo en PHP. Claramente, PHP no fue diseñado para un uso rápido de la reflexión, pero no me importa a menos que esto solo deba hacerse unas pocas veces y no para todas las solicitudes. – SztupY

Cuestiones relacionadas