2009-05-25 22 views
11

Soy nuevo en php, pero en otras tecnologías web, puede compartir objetos entre instancias de página. Por ejemplo, en las páginas java jsp que fácilmente tiene en la clase que existe como clase estática para toda la instancia del servidor. ¿Cómo hacer esto en php?¿Hay alguna forma de compartir objetos entre páginas de php?

No me estoy refiriendo a las variables de las sesiones (al menos no lo creo). Esto es más con el propósito de la agrupación de recursos (tal vez un socket para compartir, o conexiones de bases de datos, etc.). Por lo tanto, toda una clase debe compartirse entre cargas posteriores, no solo algunas variables primitivas que puedo almacenar en la sesión.

También he buscado clases de php singleton, pero creo que la clase solo se comparte en la misma página y no en páginas.

Para aclarar las cosas, estoy buscando algo que me pueda ayudar a compartir, por ejemplo, un socket conectado a un servidor para una página connectSocket.php de modo que todos los usuarios que carguen esa página usen el mismo socket y no abre uno nuevo

Respuesta

15

Esta es una respuesta un poco difícil, y puede que no sea exactamente lo que estás buscando.

PHP se basa en una arquitectura de 'nada compartido'. Si necesita algún tipo de estado en su aplicación, debe hacerlo a través de otros medios.

Primero, recomendaría investigar el núcleo del problema .. ¿Realmente lo necesita? Si supone que la aplicación PHP podría morir (y perder estado) ¿está bien perder los datos?

Si debe mantener el estado, incluso después de que la aplicación fallezca o no, debe suponer que probablemente el mejor lugar para colocar los datos es en MySQL. PHP está pensado como una capa delgada alrededor de su lógica comercial, por lo que puedo recomendarlo.

Si no le importa perder los datos después de un reinicio, probablemente el dominio problemático que está buscando sea el almacenamiento en caché. Recomendaría buscar en memcached o si está en una sola máquina, apc. APC definitivamente funcionará para usted con Apache en una sola máquina, pero igual tendrá que codificar su aplicación asumiendo que podría perder los datos.

Si le preocupa que su almacén de datos subyacente (MySQL) sea demasiado lento, pero aún necesita mantener los datos después de un reinicio, debe buscar una combinación de estos 2 sistemas. Siempre puede insertar y extraer sus datos de la memoria caché, pero solo cuando los actualiza los envía a Mysql.

Si los datos son puramente de usuario o de sesión, probablemente desee simplemente buscar en el sistema de sesiones.

Personalmente he desarrollado una aplicación multi-tenant razonablemente grande, y aunque es una aplicación bastante compleja, nunca he necesitado el verdadero estado que está buscando.

Actualización: Lo siento, no leí su nota acerca de compartir un socket. Necesitará un daemon separado para manejar esto, quizás si puede explicar su problema más a fondo, puede haber otros enfoques. ¿Qué tipo de socket es este?

1

La mayoría de las bibliotecas de bases de datos PHP ya usan la agrupación de conexiones. Llama, por ejemplo, a pg_connect como si estuviera solicitando una nueva conexión, pero si la cadena de conexión es la misma que la conexión que ya existe, en su lugar, se restablecerá la conexión establecida. Si solo le interesa agrupar para obtener acceso a la base de datos, puede confirmar que existe en la biblioteca de db que está utilizando.

+1

Aunque su respuesta es correcta, a menudo no se recomienda hacer uso de estas conexiones persistentes. Crear nuevas conexiones a menudo es muy barato y significa que no tendrá que mantenerlas todas durante mucho tiempo. Como regla, solo me conecto con un db cuando estoy haciendo la primera consulta, y me deshago de él tan pronto como pueda. Las bases de datos son difíciles de escalar, PHP es mucho más fácil. – Evert

3

Probablemente sea una respuesta parcial, pero puede guardar una instancia de una clase en una variable de sesión y acceder a ella en otro momento.

+3

Desafortunadamente, esto no funcionará con los sockets abiertos. – Evert

12

Hay una diferencia fundamental entre Java servido en la web y los lenguajes interpretados servidos en la web como PHP y Perl. En Java, su servidor web tendrá un entorno operativo que mantiene el estado (es decir, Tomcat). Con los idiomas interpretados, una solicitud a su servidor web generará generalmente un nuevo hilo de servidor web, que a su vez cargará un nuevo entorno operativo para ese hilo, en este caso, el entorno PHP.

Por lo tanto, en PHP, no existe el concepto de instancias de página. Cada solicitud al servidor web es un nuevo comienzo. Todas las clases se vuelven a cargar, por lo que no existe el concepto de compartir clases, ni existe un concepto de agrupación de recursos, a menos que se implemente externamente.

Por lo tanto, no es posible compartir tomas entre solicitudes web.

+0

No es cierto, ¿qué pasa con Memcache? – Pacerier

0

Otra solución horroble puede ser cargar los datos del objeto a cualquier variable $ _SESSION y luego volver a utilizarlo en el objeto de la otra página. De hecho, esta es la solución que seguiré en mi proyecto, hasta que obtenga una mejor.

¡Recuerdos!

Cuestiones relacionadas